Merge "Switch on ntp service as TungstenFabric requires it for time checking"
diff --git a/de/heat-templates/fragments/SrvInstancesBM.yaml b/de/heat-templates/fragments/SrvInstancesBM.yaml
index a2ae698..14876f5 100644
--- a/de/heat-templates/fragments/SrvInstancesBM.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBM.yaml
@@ -48,7 +48,6 @@
     type: string
   docker_ucp_image:
     type: string
-    default: 'docker/ucp:3.2.4'
   hardware_metadata:
     description: The content of lab metadata.
     default: ''
@@ -66,17 +65,16 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
             $private_floating_network_cidr: { get_param: private_floating_network_cidr }
             $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
             $functions_override: { get_param: functions_override }
-            $docker_ucp_image: { get_param: docker_ucp_image }
 
   inject_files:
     type: "OS::Heat::CloudConfig"
diff --git a/de/heat-templates/fragments/SrvInstancesBMCeph.yaml b/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
index 6d84308..e96a0e3 100644
--- a/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
@@ -53,6 +53,8 @@
   ucp_master_host:
     type: string
     default: ''
+  docker_ucp_image:
+    type: string
   public_net_id:
     type: string
     default: ''
@@ -76,10 +78,10 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
diff --git a/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml b/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
index e7b3831..b03830f 100644
--- a/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
@@ -67,6 +67,8 @@
   ucp_master_host:
     type: string
     default: ''
+  docker_ucp_image:
+    type: string
   public_net_id:
     type: string
     default: ''
@@ -94,10 +96,10 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
diff --git a/de/heat-templates/fragments/SrvInstancesVM.yaml b/de/heat-templates/fragments/SrvInstancesVM.yaml
index 5d0c936..6d2bbb9 100644
--- a/de/heat-templates/fragments/SrvInstancesVM.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVM.yaml
@@ -65,10 +65,10 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
diff --git a/de/heat-templates/fragments/SrvInstancesVMCeph.yaml b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
index cdf9069..a367c7f 100644
--- a/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
@@ -53,6 +53,8 @@
   ucp_master_host:
     type: string
     default: ''
+  docker_ucp_image:
+    type: string
   public_net_id:
     type: string
   docker_ee_release:
@@ -84,10 +86,10 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
diff --git a/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
index 5a4d94a..588b0c9 100644
--- a/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
@@ -67,6 +67,8 @@
   ucp_master_host:
     type: string
     default: ''
+  docker_ucp_image:
+    type: string
   public_net_id:
     type: string
   docker_ee_release:
@@ -102,10 +104,10 @@
           params:
             $node_type:  { get_param: node_type }
             $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ../scripts/license.lic }
             $docker_ee_url: { get_param: docker_ee_url }
             $docker_ee_release: { get_param: docker_ee_release }
             $ucp_master_host: { get_param: ucp_master_host }
+            $docker_ucp_image: { get_param: docker_ucp_image }
             $node_metadata: { get_param: metadata }
             $control_network_cidr: { get_param: control_network_cidr }
             $private_floating_interface: { get_param: private_floating_interface }
diff --git a/de/heat-templates/scripts/instance_boot.sh b/de/heat-templates/scripts/instance_boot.sh
index 4d36ca4..1d4275b 100644
--- a/de/heat-templates/scripts/instance_boot.sh
+++ b/de/heat-templates/scripts/instance_boot.sh
@@ -154,16 +154,28 @@
 
 }
 
+function cache_images {
+
+    function cache_images_retry {
+        local image_prefix=${DOCKER_UCP_IMAGE%/*}
+        local image_name=${DOCKER_UCP_IMAGE##*/}
+        if [[ "$image_name" =~ .*-tp[0-9]+ ]]; then
+            for image in $(docker container run --rm --name ucp -v /var/run/docker.sock:/var/run/docker.sock ${DOCKER_UCP_IMAGE} images --list); do
+                docker pull ${image_prefix}/${image##*/};
+                docker tag ${image_prefix}/${image##*/} ${image}
+            done
+        fi
+    }
+
+    retry 10 "Can't cache docker images" cache_images_retry
+}
+
 function install_ucp {
     local tmpd
     tmpd=$(mktemp -d)
-    cat <<EOF > ${tmpd}/docker_subscription.lic
-$ucp_license_key
-EOF
     function docker_run_retry {
         docker container run --rm --name ucp \
         -v /var/run/docker.sock:/var/run/docker.sock \
-        -v $tmpd/docker_subscription.lic:/config/docker_subscription.lic \
         ${DOCKER_UCP_IMAGE} install \
         --host-address $UCP_IP_ADDRESS \
         --admin-username $UCP_USERNAME \
@@ -503,6 +515,7 @@
         install_docker
         swarm_init
         create_ucp_config
+        cache_images
         install_ucp
         download_bundles
         rm_ucp_config
@@ -525,6 +538,7 @@
         configure_atop
         workaround_default_forward_policy
         install_docker
+        cache_images
         download_bundles
         join_node manager
         install_kubectl
@@ -546,6 +560,7 @@
         configure_atop
         workaround_default_forward_policy
         install_docker
+        cache_images
         download_bundles
         join_node worker
         install_kubectl
@@ -565,6 +580,7 @@
         configure_ntp
         configure_atop
         install_docker
+        cache_images
         download_bundles
         workaround_default_forward_policy
         configure_contrack
diff --git a/de/heat-templates/top.yaml b/de/heat-templates/top.yaml
index dbc7589..8f7ca7a 100644
--- a/de/heat-templates/top.yaml
+++ b/de/heat-templates/top.yaml
@@ -329,6 +329,7 @@
           flavor: { get_param: masters_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -358,6 +359,7 @@
           key_name: { get_param: "OS::stack_name" }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -400,6 +402,7 @@
           flavor: { get_param: cmps_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -442,6 +445,7 @@
           flavor: { get_param: gtws_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -477,6 +481,7 @@
           flavor: { get_param: lmas_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -512,6 +517,7 @@
           flavor: { get_param: osds_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -554,6 +560,7 @@
           flavor: { get_param: spares_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -596,6 +603,7 @@
           flavor: { get_param: ntws_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
@@ -631,6 +639,7 @@
           flavor: { get_param: vbmcs_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
           accessible_network: { get_attr: [accessible_network, public_network] }
           private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
           private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }