updated heat templates for ceph nodes

Related-Prod: PRODX-2244
Change-Id: Id2a7c1c7e802ee1f297aad47c15844540e721eba
diff --git a/de/heat-templates/env/compute.yaml b/de/heat-templates/env/compute.yaml
index f3008e1..0a2bf60 100644
--- a/de/heat-templates/env/compute.yaml
+++ b/de/heat-templates/env/compute.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/converged.yaml b/de/heat-templates/env/converged.yaml
index fa9298c..041dfcb 100644
--- a/de/heat-templates/env/converged.yaml
+++ b/de/heat-templates/env/converged.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0-lma3.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0-lma3.yaml
index 46da856..82d6e38 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0-lma3.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0-lma3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
index 80690c6..2d9b1f9 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0-lma3.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0-lma3.yaml
index d71b639..7078c88 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0-lma3.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0-lma3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
index 542a5cd..11ec72e 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
index 8952627..90b6992 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
index 44ac2b2..2005c00 100644
--- a/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
index 542a5cd..11ec72e 100644
--- a/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp0-gtw0-lma3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp0-gtw0-lma3.yaml
index bd050b7..90ccdfb 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp0-gtw0-lma3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp0-gtw0-lma3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3-osd3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3-osd3.yaml
index 49b24dd..9a8d528 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3-osd3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3-osd3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3.yaml
index eeb0004..5e84844 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw0-lma3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
index 2da5814..34946a1 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
index 8e5f64b..967272e 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-lma3-osd3-ntw3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-lma3-osd3-ntw3.yaml
index f330ba5..e803105 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-lma3-osd3-ntw3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-lma3-osd3-ntw3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/mstr3-wrkr6-cmp3-osd3.yaml b/de/heat-templates/env/mstr3-wrkr6-cmp3-osd3.yaml
index a6f9708..c1d54d0 100644
--- a/de/heat-templates/env/mstr3-wrkr6-cmp3-osd3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr6-cmp3-osd3.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/env/telco.yaml b/de/heat-templates/env/telco.yaml
index 50c16c5..2e8d79d 100644
--- a/de/heat-templates/env/telco.yaml
+++ b/de/heat-templates/env/telco.yaml
@@ -1,7 +1,10 @@
 resource_registry:
   "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkAccStorage": ../fragments/NetworkAccVMStorage.yaml
   "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
   "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+  "MCP2::SrvInstancesCeph": ../fragments/SrvInstancesVMCeph.yaml
+  "MCP2::SrvInstancesCephOSD": ../fragments/SrvInstancesVMCephOSD.yaml
 
 parameters:
   image: bionic-server-cloudimg-amd64-20190612
diff --git a/de/heat-templates/fragments/NetworkAccVMStorage.yaml b/de/heat-templates/fragments/NetworkAccVMStorage.yaml
new file mode 100644
index 0000000..154976f
--- /dev/null
+++ b/de/heat-templates/fragments/NetworkAccVMStorage.yaml
@@ -0,0 +1,39 @@
+heat_template_version: queens
+
+parameters:
+  storage_backend_network_cidr:
+    type: string
+  storage_frontend_network_cidr:
+    type: string
+
+resources:
+
+  storage_backend_network:
+    type: OS::Neutron::Net
+  storage_backend_subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      network: { get_resource: storage_backend_network }
+      enable_dhcp: true
+      cidr: { get_param: storage_backend_network_cidr }
+      gateway_ip: ~
+
+  storage_frontend_network:
+    type: OS::Neutron::Net
+  storage_frontend_subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      network: { get_resource: storage_frontend_network }
+      enable_dhcp: true
+      cidr: { get_param: storage_frontend_network_cidr }
+      gateway_ip: ~
+
+outputs:
+  storage_backend_network_id:
+    value: { get_resource: storage_backend_network }
+  storage_backend_subnet_id:
+    value: { get_resource: storage_backend_subnet }
+  storage_frontend_network_id:
+    value: { get_resource: storage_frontend_network }
+  storage_frontend_subnet_id:
+    value: { get_resource: storage_frontend_subnet }
diff --git a/de/heat-templates/fragments/SrvInstancesVMCeph.yaml b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
new file mode 100644
index 0000000..12bdc2b
--- /dev/null
+++ b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
@@ -0,0 +1,138 @@
+heat_template_version: queens
+
+parameters:
+
+  metadata:
+    type: json
+    default: {}
+  node_type:
+    type: string
+  key_name:
+    type: string
+    description: Name of keypair to assign to servers
+  image:
+    type: string
+    description: Name of image to use for servers
+  flavor:
+    type: string
+    description: Flavor to use for servers
+  accessible_network:
+    type: string
+  accessible_subnet_id:
+    type: string
+  private_floating_network:
+    type: string
+  private_floating_network_cidr:
+    type: string
+  private_floating_subnet_id:
+    type: string
+  private_floating_interface:
+    type: string
+  storage_frontend_network:
+    type: string
+  storage_frontend_subnet_id:
+    type: string
+  host_interface:
+    type: string
+  functions_override:
+    type: string
+  boot_timeout:
+    type: number
+    description: Boot timeout for instance
+    default: 1200
+  ucp_master_host:
+    type: string
+    default: ''
+  public_net_id:
+    type: string
+  docker_ee_release:
+    type: string
+  docker_ee_url:
+    type: string
+
+resources:
+
+  software_config:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: { get_file: ../scripts/instance_boot.sh }
+          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 }
+            $node_metadata: { get_param: metadata }
+            $host_interface: { get_param: host_interface }
+            $private_floating_interface: { get_param: private_floating_interface }
+            $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+            $private_floating_network_cidr: { get_param: private_floating_network_cidr }
+            $functions_override: { get_param: functions_override }
+
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: { get_param: image }
+      flavor: { get_param: flavor }
+      key_name: { get_param: key_name }
+      availability_zone: nova
+      networks:
+        - port: { get_resource: accessible_server_port }
+        - port: { get_resource: private_floating_server_port }
+        - port: { get_resource: storage_frontend_server_port }
+      user_data_format: RAW
+      user_data: { get_resource: software_config }
+      metadata: { get_param: metadata }
+
+  accessible_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: accessible_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: accessible_subnet_id }
+
+  storage_frontend_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: storage_frontend_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: storage_frontend_subnet_id }
+
+  private_floating_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: private_floating_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: private_floating_subnet_id }
+
+  server_floating_ip:
+    type: OS::Neutron::FloatingIP
+    properties:
+      floating_network_id: { get_param: public_net_id }
+      port_id: { get_resource: accessible_server_port }
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: { get_resource: wait_handle }
+      timeout: { get_param: boot_timeout }
+
+outputs:
+  server_private_ip:
+    description: IP address of server in private network
+    value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  server_private_floating_ip:
+    description: IP address of server in private floating network
+    value: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+  server_public_ip:
+    description: Floating IP address of server in public network
+    value: { get_attr: [ server_floating_ip, floating_ip_address ] }
diff --git a/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
new file mode 100644
index 0000000..51d5228
--- /dev/null
+++ b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
@@ -0,0 +1,151 @@
+heat_template_version: queens
+
+parameters:
+
+  metadata:
+    type: json
+    default: {}
+  node_type:
+    type: string
+  key_name:
+    type: string
+    description: Name of keypair to assign to servers
+  image:
+    type: string
+    description: Name of image to use for servers
+  flavor:
+    type: string
+    description: Flavor to use for servers
+  accessible_network:
+    type: string
+  accessible_subnet_id:
+    type: string
+  private_floating_network:
+    type: string
+  private_floating_network_cidr:
+    type: string
+  private_floating_subnet_id:
+    type: string
+  private_floating_interface:
+    type: string
+  storage_backend_network:
+    type: string
+  storage_backend_subnet_id:
+    type: string
+  storage_frontend_network:
+    type: string
+  storage_frontend_subnet_id:
+    type: string
+  host_interface:
+    type: string
+  functions_override:
+    type: string
+  boot_timeout:
+    type: number
+    description: Boot timeout for instance
+    default: 1200
+  ucp_master_host:
+    type: string
+    default: ''
+  public_net_id:
+    type: string
+  docker_ee_release:
+    type: string
+  docker_ee_url:
+    type: string
+
+resources:
+
+  software_config:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: { get_file: ../scripts/instance_boot.sh }
+          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 }
+            $node_metadata: { get_param: metadata }
+            $host_interface: { get_param: host_interface }
+            $private_floating_interface: { get_param: private_floating_interface }
+            $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+            $private_floating_network_cidr: { get_param: private_floating_network_cidr }
+            $functions_override: { get_param: functions_override }
+
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: { get_param: image }
+      flavor: { get_param: flavor }
+      key_name: { get_param: key_name }
+      availability_zone: nova
+      networks:
+        - port: { get_resource: accessible_server_port }
+        - port: { get_resource: private_floating_server_port }
+        - port: { get_resource: storage_backend_server_port }
+        - port: { get_resource: storage_frontend_server_port }
+      user_data_format: RAW
+      user_data: { get_resource: software_config }
+      metadata: { get_param: metadata }
+
+  accessible_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: accessible_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: accessible_subnet_id }
+
+  storage_backend_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: storage_backend_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: storage_backend_subnet_id }
+
+  storage_frontend_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: storage_frontend_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: storage_frontend_subnet_id }
+
+  private_floating_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: private_floating_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: private_floating_subnet_id }
+
+  server_floating_ip:
+    type: OS::Neutron::FloatingIP
+    properties:
+      floating_network_id: { get_param: public_net_id }
+      port_id: { get_resource: accessible_server_port }
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: { get_resource: wait_handle }
+      timeout: { get_param: boot_timeout }
+
+outputs:
+  server_private_ip:
+    description: IP address of server in private network
+    value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  server_private_floating_ip:
+    description: IP address of server in private floating network
+    value: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+  server_public_ip:
+    description: Floating IP address of server in public network
+    value: { get_attr: [ server_floating_ip, floating_ip_address ] }
diff --git a/de/heat-templates/top.yaml b/de/heat-templates/top.yaml
index 86324a6..70728ae 100644
--- a/de/heat-templates/top.yaml
+++ b/de/heat-templates/top.yaml
@@ -62,6 +62,12 @@
   private_floating_interface:
     description: Interface which carries floating network for child OpenStack.
     type: string
+  storage_backend_network_cidr:
+    type: string
+    default: '10.11.0.0/24'
+  storage_frontend_network_cidr:
+    type: string
+    default: '10.12.0.0/24'
   worker_metadata:
     type: json
     default: {}
@@ -100,7 +106,7 @@
     default: 'system.compact.openstack.control'
   osds_flavor:
     type: string
-    default: 'system.compact.openstack.control'
+    default: 'system.virtual.ceph.osd'
   ntws_flavor:
     type: string
     default: 'system.compact.openstack.control'
@@ -141,8 +147,16 @@
     properties:
       private_floating_network_cidr: { get_param: private_floating_network_cidr }
 
+  storage_network:
+    type: MCP2::NetworkAccStorage
+    properties:
+      storage_backend_network_cidr: { get_param: storage_backend_network_cidr }
+      storage_frontend_network_cidr: { get_param: storage_frontend_network_cidr }
+
   ucp:
-    depends_on: accessible_network
+    depends_on:
+     - accessible_network
+     - storage_network
     type: MCP2::SrvInstances
     properties:
       metadata: {"role":"ucp"}
@@ -198,22 +212,26 @@
     properties:
       count: { get_param: worker_size }
       resource_def:
-        type: MCP2::SrvInstances
+        type: MCP2::SrvInstancesCephOSD
         properties:
           metadata: { get_param: worker_metadata}
           node_type: "worker"
           key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
-          flavor: { get_param: workers_flavor }
+          flavor: { get_param: osds_flavor }
           key_name: { get_param: "OS::stack_name" }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
           accessible_network: { get_attr: [accessible_network, public_network] }
+          storage_backend_network: { get_attr: [storage_network, storage_backend_network_id]}
+          storage_frontend_network: { get_attr: [storage_network, storage_frontend_network_id]}
           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] }
           private_floating_interface: { get_param: private_floating_interface }
           private_floating_network_cidr: { get_param: private_floating_network_cidr }
           accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+          storage_backend_subnet_id: { get_attr: [storage_network, storage_backend_subnet_id]}
+          storage_frontend_subnet_id: { get_attr: [storage_network, storage_frontend_subnet_id]}
           public_net_id: { get_param: public_net_id }
           host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
@@ -226,21 +244,25 @@
     properties:
       count: { get_param: cmp_size }
       resource_def:
-        type: MCP2::SrvInstances
+        type: MCP2::SrvInstancesCephOSD
         properties:
           metadata: { get_param: cmp_metadata }
           node_type: "worker"
           key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
-          flavor: { get_param: cmps_flavor }
+          flavor: { get_param: osds_flavor }
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
           accessible_network: { get_attr: [accessible_network, public_network] }
+          storage_backend_network: { get_attr: [storage_network, storage_backend_network_id] }
+          storage_frontend_network: { get_attr: [storage_network, storage_frontend_network_id] }
           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] }
           private_floating_interface: { get_param: private_floating_interface }
           private_floating_network_cidr: { get_param: private_floating_network_cidr }
           accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+          storage_backend_subnet_id: { get_attr: [storage_network, storage_backend_subnet_id]}
+          storage_frontend_subnet_id: { get_attr: [storage_network, storage_frontend_subnet_id]}
           public_net_id: { get_param: public_net_id }
           host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
@@ -280,7 +302,7 @@
     properties:
       count: { get_param: lma_size }
       resource_def:
-        type: MCP2::SrvInstances
+        type: MCP2::SrvInstancesCeph
         properties:
           metadata: { get_param: lma_metadata }
           node_type: "worker"
@@ -290,11 +312,13 @@
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
           accessible_network: { get_attr: [accessible_network, public_network] }
+          storage_frontend_network: { get_attr: [storage_network, storage_frontend_network_id] }
           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] }
           private_floating_interface: { get_param: private_floating_interface }
           private_floating_network_cidr: { get_param: private_floating_network_cidr }
           accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+          storage_frontend_subnet_id: { get_attr: [storage_network, storage_frontend_subnet_id]}
           public_net_id: { get_param: public_net_id }
           host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
@@ -307,7 +331,7 @@
     properties:
       count: { get_param: osd_size }
       resource_def:
-        type: MCP2::SrvInstances
+        type: MCP2::SrvInstancesCephOSD
         properties:
           metadata: { get_param: osd_metadata }
           node_type: "worker"
@@ -317,11 +341,15 @@
           docker_ee_url: { get_param: docker_ee_url }
           docker_ee_release: { get_param: docker_ee_release }
           accessible_network: { get_attr: [accessible_network, public_network] }
+          storage_backend_network: { get_attr: [storage_network, storage_backend_network_id] }
+          storage_frontend_network: { get_attr: [storage_network, storage_frontend_network_id] }
           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] }
           private_floating_interface: { get_param: private_floating_interface }
           private_floating_network_cidr: { get_param: private_floating_network_cidr }
           accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+          storage_backend_subnet_id: { get_attr: [storage_network, storage_backend_subnet_id]}
+          storage_frontend_subnet_id: { get_attr: [storage_network, storage_frontend_subnet_id]}
           public_net_id: { get_param: public_net_id }
           host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }