CORD-1729 Support "localhost" as build node for full POD / CiaB

Change-Id: I406393b5594799f60eab83a2e3a1910f6974fc87
diff --git a/Makefile b/Makefile
index 2b35556..880c11f 100644
--- a/Makefile
+++ b/Makefile
@@ -24,7 +24,7 @@
 M                ?= $(BUILD)/milestones
 LOGS             ?= $(BUILD)/logs
 
-PREP_MS          ?= $(M)/prereqs-check $(M)/vagrant-up $(M)/copy-cord $(M)/cord-config $(M)/copy-config $(M)/prep-buildnode $(M)/prep-headnode $(M)/deploy-elasticstack $(M)/prep-computenode
+PREP_MS          ?= $(M)/prereqs-check $(M)/build-local-bootstrap $(M)/vagrant-up $(M)/copy-cord $(M)/cord-config $(M)/copy-config $(M)/prep-buildnode $(M)/prep-headnode $(M)/deploy-elasticstack $(M)/prep-computenode
 MAAS_MS          ?= $(M)/build-maas-images $(M)/maas-prime $(M)/publish-maas-images $(M)/deploy-maas
 OPENSTACK_MS     ?= $(M)/glance-images $(M)/deploy-openstack  $(M)/deploy-computenode $(M)/onboard-openstack
 XOS_MS           ?= $(M)/docker-images $(M)/core-image $(M)/publish-docker-images $(M)/start-xos $(M)/onboard-profile
@@ -153,6 +153,7 @@
 START_XOS_PREREQS      ?=
 DEPLOY_ONOS_PREREQS    ?=
 DEPLOY_OPENSTACK_PREREQS ?=
+DEPLOY_MAVENREPO_PREREQS ?=
 SETUP_AUTOMATION_PREREQS ?=
 
 # == MILESTONES == #
@@ -163,6 +164,10 @@
 	$(ANSIBLE_PB) $(PI)/prereqs-check-playbook.yml $(LOGCMD)
 	touch $@
 
+$(M)/build-local-bootstrap:
+	$(ANSIBLE_PB) $(BUILD)/ansible/build-local-bootstrap.yml $(LOGCMD)
+	touch $@
+
 $(M)/vagrant-up: | $(VAGRANT_UP_PREREQS)
 	$(VAGRANT) up $(VAGRANT_VMS) --provider $(VAGRANT_PROVIDER) $(LOGCMD)
 	@echo "Configuring SSH for VM's..."
@@ -203,7 +208,7 @@
 
 # MaaS targets
 $(M)/build-maas-images: | $(M)/prep-buildnode $(BUILD_MAAS_IMAGES_PREREQS)
-	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/build/maas; make MAKE_CONFIG=../$(MAKEFILE_CONFIG) build" $(LOGCMD)
+	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/build/maas; rm -f consul.image; make MAKE_CONFIG=../$(MAKEFILE_CONFIG) build" $(LOGCMD)
 	touch $@
 
 $(M)/maas-prime: | $(M)/deploy-elasticstack
@@ -221,14 +226,14 @@
 
 # ONOS targets
 $(M)/build-onos-apps: | $(M)/prep-buildnode $(BUILD_ONOS_APPS_PREREQS)
-	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/onos-apps; make MAKE_CONFIG=../$(MAKEFILE_CONFIG) build" $(LOGCMD)
+	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/onos-apps; make MAKE_CONFIG=../build/$(MAKEFILE_CONFIG) build" $(LOGCMD)
 	touch $@
 
 $(M)/publish-onos-apps: | $(M)/maas-prime $(M)/build-onos-apps
-	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/onos-apps; make MAKE_CONFIG=../$(MAKEFILE_CONFIG) publish" $(LOGCMD)
+	$(SSH_BUILD) "cd $(BUILD_CORD_DIR)/onos-apps; make MAKE_CONFIG=../build/$(MAKEFILE_CONFIG) publish" $(LOGCMD)
 	touch $@
 
-$(M)/deploy-mavenrepo: | $(M)/publish-onos-apps
+$(M)/deploy-mavenrepo: | $(M)/publish-onos-apps $(DEPLOY_MAVENREPO_PREREQS)
 	$(ANSIBLE_PB) $(PI)/deploy-mavenrepo-playbook.yml $(LOGCMD)
 	touch $@
 
diff --git a/ansible/build-local-bootstrap.yml b/ansible/build-local-bootstrap.yml
new file mode 100644
index 0000000..7e9d743
--- /dev/null
+++ b/ansible/build-local-bootstrap.yml
@@ -0,0 +1,19 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+
+- hosts: localhost
+  become: no
+  roles:
+  - build-local-bootstrap
diff --git a/ansible/roles/build-local-bootstrap/defaults/main.yml b/ansible/roles/build-local-bootstrap/defaults/main.yml
new file mode 100644
index 0000000..4e4b046
--- /dev/null
+++ b/ansible/roles/build-local-bootstrap/defaults/main.yml
@@ -0,0 +1,16 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config_cord_dir: /opt/cord
+config_cord_profile_dir: /opt/cord_profile
diff --git a/ansible/roles/build-local-bootstrap/tasks/main.yml b/ansible/roles/build-local-bootstrap/tasks/main.yml
new file mode 100644
index 0000000..c94099a
--- /dev/null
+++ b/ansible/roles/build-local-bootstrap/tasks/main.yml
@@ -0,0 +1,45 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+
+- name: Ensure /opt/cord and /opt/cord_profile sym links
+  become: yes
+  file:
+    src: "{{ item.src }}"
+    dest: "{{ item.dest }}"
+    state: link
+    force: yes
+  with_items:
+  - { dest: '/opt/cord', src: '{{ config_cord_dir }}' }
+  - { dest: '/opt/cord_profile', src: '{{ config_cord_profile_dir }}' }
+
+- name: Ensure SSH keypair exists for Ansible login user
+  user:
+    name: "{{ ansible_user_id }}"
+    generate_ssh_key: yes
+    ssh_key_bits: 2048
+    ssh_key_type: rsa
+
+- name: Get public key for Ansible login user
+  slurp:
+    src: "{{ ansible_env.HOME }}/.ssh/id_rsa.pub"
+  register: pubkey
+
+- name: Ensure public key in authorized_keys
+  authorized_key:
+    user: "{{ ansible_user_id }}"
+    state: present
+    key: "{{ pubkey['content'] | b64decode }}"
+
diff --git a/ansible/roles/genconfig/templates/config.mk.j2 b/ansible/roles/genconfig/templates/config.mk.j2
index 7e4aeab..ef2351b 100644
--- a/ansible/roles/genconfig/templates/config.mk.j2
+++ b/ansible/roles/genconfig/templates/config.mk.j2
@@ -20,9 +20,6 @@
 # ** DO NOT EDIT THIS FILE MANUALLY! **
 # Edit the Pod Config (or Scenario) and rerun `make config` to regenerate it
 
-# Needed for MaaS, not settable
-DOCKER_REGISTRY         = docker-registry:5000
-
 # Scenario specific config
 {% if vagrant_vms is defined %}
 VAGRANT_VMS             = {{ vagrant_vms | join(' ') }}
@@ -35,9 +32,8 @@
 {% endif %}
 {% if deploy_docker_registry is defined %}
 DEPLOY_DOCKER_REGISTRY  = {{ deploy_docker_registry }}
-{% endif %}
-{% if deploy_docker_tag is defined %}
-DEPLOY_DOCKER_TAG       = {{ deploy_docker_tag }}
+# For MAAS
+DOCKER_REGISTRY         = {{ deploy_docker_registry }}
 {% endif %}
 {% if deploy_docker_tag is defined %}
 DEPLOY_DOCKER_TAG       = {{ deploy_docker_tag }}
@@ -80,6 +76,9 @@
 {% if deploy_onos_prereqs is defined %}
 DEPLOY_ONOS_PREREQS     = $(M)/{{ deploy_onos_prereqs | join(" $(M)/") }}
 {% endif %}
+{% if deploy_mavenrepo_prereqs is defined %}
+DEPLOY_MAVENREPO_PREREQS     = $(M)/{{ deploy_mavenrepo_prereqs | join(" $(M)/") }}
+{% endif %}
 {% if deploy_openstack_prereqs is defined %}
 DEPLOY_OPENSTACK_PREREQS = $(M)/{{ deploy_openstack_prereqs | join(" $(M)/") }}
 {% endif %}
diff --git a/podconfig/rcord-virtual-buildlocal.yml b/podconfig/rcord-virtual-buildlocal.yml
new file mode 100644
index 0000000..2f6599d
--- /dev/null
+++ b/podconfig/rcord-virtual-buildlocal.yml
@@ -0,0 +1,49 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+---
+# rcord-virtual Pod Config
+# Creates a virtual multi-node R-CORD pod, aka "rcord-in-a-box"
+# Uses the local server as the "build host", assumes Ubuntu 14.04 server
+
+cord_scenario: cord
+cord_profile: rcord
+
+buildnode: localhost
+
+prep_buildnode_prereqs:
+  - build-local-bootstrap
+
+# Override setting in scenarios/cord/config.yml with noop
+docker_image_prereqs:
+  - prep-buildnode
+
+docker_opts: "--insecure-registry 10.100.198.201:5000"
+
+inventory_groups:
+
+  config:
+    localhost:
+      ansible_connection: local
+
+  build:
+    localhost:
+      ansible_connection: local
+
+  head:
+    head1:
+
+  compute:
diff --git a/scenarios/cord/config.yml b/scenarios/cord/config.yml
index f3587b5..de61523 100644
--- a/scenarios/cord/config.yml
+++ b/scenarios/cord/config.yml
@@ -31,7 +31,7 @@
 headnode: head1
 
 # docker config
-deploy_docker_registry: "docker-registry:5000"  # IP address of head node giving errors
+deploy_docker_registry: "10.100.198.201:5000"  # IP address of head node giving errors
 deploy_docker_tag: "candidate"
 pull_docker_registry: "docker-registry:5000/"
 pull_docker_tag: "candidate"
@@ -98,6 +98,9 @@
   - deploy-maas
   - deploy-mavenrepo
 
+deploy_mavenrepo_prereqs:
+  - deploy-maas
+
 setup_automation_prereqs:
   - deploy-openstack
 
diff --git a/scripts/imagebuilder.py b/scripts/imagebuilder.py
index 1c94f88..3bc4947 100755
--- a/scripts/imagebuilder.py
+++ b/scripts/imagebuilder.py
@@ -828,6 +828,7 @@
                             self.preexisting.append({
                                     'id': pe_image['Id'],
                                     'tags': raw_tags,
+                                    'base': image.name.split(":")[0],
                                 })
 
                             image.image_id = pe_image['Id']