Add generic template for custom roles.
authorCarlos Camacho <ccamacho@redhat.com>
Tue, 4 Oct 2016 09:50:33 +0000 (11:50 +0200)
committerEmilien Macchi <emilien@redhat.com>
Thu, 6 Oct 2016 02:13:36 +0000 (02:13 +0000)
This submission creates a generic template
file to deploy custom roles.

Also adds a file to specify an exclusion role
list in order to avoid not to generate the
template for those roles.

Partial-Bug: #1626976

Depends-On: I6d7247bbb8702eb0ab9bdf133b5ab1c6e8349d98

Change-Id: I3e11c089023b793a5063d9e1714527a3fe2b7458

j2_excludes.yaml [new file with mode: 0644]
puppet/role.role.j2.yaml [new file with mode: 0644]

diff --git a/j2_excludes.yaml b/j2_excludes.yaml
new file mode 100644 (file)
index 0000000..063e63d
--- /dev/null
@@ -0,0 +1,10 @@
+# This template specifies which j2 rendered templates
+# should be excluded in the render process from
+# tripleo-common/tripleo_common/actions/templates.py
+
+name:
+  - puppet/controller-role.yaml
+  - puppet/compute-role.yaml
+  - puppet/blockstorage-role.yaml
+  - puppet/objectstorage-role.yaml
+  - puppet/cephstorage-role.yaml
diff --git a/puppet/role.role.j2.yaml b/puppet/role.role.j2.yaml
new file mode 100644 (file)
index 0000000..66b754f
--- /dev/null
@@ -0,0 +1,407 @@
+heat_template_version: 2016-10-14
+description: 'OpenStack {{role}} node configured by Puppet'
+parameters:
+  Overcloud{{role}}Flavor:
+    description: Flavor for the {{role}} node.
+    default: baremetal
+    type: string
+    constraints:
+      - custom_constraint: nova.flavor
+  {{role}}Image:
+    type: string
+    default: overcloud-full
+    constraints:
+      - custom_constraint: glance.image
+  ImageUpdatePolicy:
+    default: 'REBUILD_PRESERVE_EPHEMERAL'
+    description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
+    type: string
+  KeyName:
+    description: Name of an existing Nova key pair to enable SSH access to the instances
+    type: string
+    default: default
+    constraints:
+      - custom_constraint: nova.keypair
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  UpdateIdentifier:
+    default: ''
+    type: string
+    description: >
+      Setting to a previously unused value during stack-update will trigger
+      package update on all nodes
+  Hostname:
+    type: string
+    default: '' # Defaults to Heat created hostname
+  HostnameMap:
+    type: json
+    default: {}
+    description: Optional mapping to override hostnames
+  ExtraConfig:
+    default: {}
+    description: |
+      Additional hiera configuration to inject into the cluster. Note
+      that {{role}}ExtraConfig takes precedence over ExtraConfig.
+    type: json
+  {{role}}ExtraConfig:
+    default: {}
+    description: |
+      Role specific additional hiera configuration to inject into the cluster.
+    type: json
+  {{role}}IPs:
+    default: {}
+    type: json
+  NetworkDeploymentActions:
+    type: comma_delimited_list
+    description: >
+      Heat action when to apply network configuration changes
+    default: ['CREATE']
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
+  CloudDomain:
+    type: string
+    description: >
+      The DNS domain used for the hosts. This should match the dhcp_domain
+      configured in the Undercloud neutron. Defaults to localdomain.
+  ServerMetadata:
+    default: {}
+    description: >
+      Extra properties or metadata passed to Nova for the created nodes in
+      the overcloud. It's accessible via the Nova metadata API.
+    type: json
+  {{role}}SchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
+  NodeIndex:
+    type: number
+    default: 0
+  ServiceConfigSettings:
+    type: json
+    default: {}
+  ServiceNames:
+    type: comma_delimited_list
+    default: []
+  MonitoringSubscriptions:
+    type: comma_delimited_list
+    default: []
+  ConfigCommand:
+    type: string
+    description: Command which will be run whenever configuration data changes
+    default: os-refresh-config --timeout 14400
+  LoggingSources:
+    type: json
+    default: []
+  LoggingGroups:
+    type: comma_delimited_list
+    default: []
+
+resources:
+  {{role}}:
+    type: OS::TripleO::Server
+    metadata:
+      os-collect-config:
+        command: {get_param: ConfigCommand}
+    properties:
+      image: {get_param: {{role}}Image}
+      image_update_policy: {get_param: ImageUpdatePolicy}
+      flavor: {get_param: Overcloud{{role}}Flavor}
+      key_name: {get_param: KeyName}
+      networks:
+        - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: UserData}
+      name:
+        str_replace:
+            template: {get_param: Hostname}
+            params: {get_param: HostnameMap}
+      software_config_transport: {get_param: SoftwareConfigTransport}
+      metadata: {get_param: ServerMetadata}
+      scheduler_hints: {get_param: {{role}}SchedulerHints}
+
+  # Combine the NodeAdminUserData and NodeUserData mime archives
+  UserData:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+      - config: {get_resource: NodeAdminUserData}
+        type: multipart
+      - config: {get_resource: NodeUserData}
+        type: multipart
+
+  # Creates the "heat-admin" user if configured via the environment
+  # Should return a OS::Heat::MultipartMime reference via OS::stack_id
+  NodeAdminUserData:
+    type: OS::TripleO::NodeAdminUserData
+
+  # For optional operator additional userdata
+  # Should return a OS::Heat::MultipartMime reference via OS::stack_id
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
+  ExternalPort:
+    type: OS::TripleO::{{role}}::Ports::ExternalPort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  InternalApiPort:
+    type: OS::TripleO::{{role}}::Ports::InternalApiPort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  StoragePort:
+    type: OS::TripleO::{{role}}::Ports::StoragePort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  StorageMgmtPort:
+    type: OS::TripleO::{{role}}::Ports::StorageMgmtPort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  TenantPort:
+    type: OS::TripleO::{{role}}::Ports::TenantPort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  ManagementPort:
+    type: OS::TripleO::{{role}}::Ports::ManagementPort
+    properties:
+      ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      IPPool: {get_param: {{role}}IPs}
+      NodeIndex: {get_param: NodeIndex}
+
+  NetworkConfig:
+    type: OS::TripleO::{{role}}::Net::SoftwareConfig
+    properties:
+      ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
+      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
+      StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
+      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
+
+  NetIpMap:
+    type: OS::TripleO::Network::Ports::NetIpMap
+    properties:
+      ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
+      ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
+      InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
+      StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
+      StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
+      TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
+
+  NetworkDeployment:
+    type: OS::TripleO::SoftwareDeployment
+    properties:
+      name: NetworkDeployment
+      config: {get_resource: NetworkConfig}
+      server: {get_resource: {{role}}}
+      actions: {get_param: NetworkDeploymentActions}
+
+  {{role}}Deployment:
+    type: OS::Heat::StructuredDeployment
+    depends_on: NetworkDeployment
+    properties:
+      name: {{role}}Deployment
+      config: {get_resource: {{role}}Config}
+      server: {get_resource: {{role}}}
+      input_values:
+        enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
+
+  {{role}}Config:
+    type: OS::Heat::StructuredConfig
+    properties:
+      group: os-apply-config
+      config:
+        hiera:
+          hierarchy:
+            - '"%{::uuid}"'
+            - heat_config_%{::deploy_config_name}
+            - {{role.lower()}}_extraconfig
+            - extraconfig
+            - service_names
+            - service_configs
+            - bootstrap_node # provided by allNodesConfig
+            - all_nodes # provided by allNodesConfig
+            - vip_data # provided by allNodesConfig
+            - '"%{::osfamily}"'
+          merge_behavior: deeper
+          datafiles:
+            service_names:
+              mapped_data:
+                service_names: {get_param: ServiceNames}
+                sensu::subscriptions: {get_param: MonitoringSubscriptions}
+            service_configs:
+              mapped_data:
+                map_replace:
+                  - {get_param: ServiceConfigSettings}
+                  - values: {get_attr: [NetIpMap, net_ip_map]}
+            {{role.lower()}}_extraconfig:
+              mapped_data: {get_param: {{role}}ExtraConfig}
+            extraconfig:
+              mapped_data: {get_param: ExtraConfig}
+            {{role.lower()}}:
+              mapped_data:
+                tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
+                tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: LoggingSources}
+                tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: LoggingGroups}
+
+  # Resource for site-specific injection of root certificate
+  NodeTLSCAData:
+    depends_on: {{role}}Deployment
+    type: OS::TripleO::NodeTLSCAData
+    properties:
+      server: {get_resource: {{role}}}
+
+  # Hook for site-specific additional pre-deployment config, e.g extra hieradata
+  {{role}}ExtraConfigPre:
+    depends_on: {{role}}Deployment
+    type: OS::TripleO::{{role}}ExtraConfigPre
+    properties:
+        server: {get_resource: {{role}}}
+
+  # Hook for site-specific additional pre-deployment config,
+  # applying to all nodes, e.g node registration/unregistration
+  NodeExtraConfig:
+    depends_on: [{{role}}ExtraConfigPre, NodeTLSCAData]
+    type: OS::TripleO::NodeExtraConfig
+    properties:
+        server: {get_resource: {{role}}}
+
+  UpdateConfig:
+    type: OS::TripleO::Tasks::PackageUpdate
+
+  UpdateDeployment:
+    type: OS::Heat::SoftwareDeployment
+    properties:
+      config: {get_resource: UpdateConfig}
+      server: {get_resource: {{role}}}
+      input_values:
+        update_identifier:
+          get_param: UpdateIdentifier
+
+outputs:
+  ip_address:
+    description: IP address of the server in the ctlplane network
+    value: {get_attr: [{{role}}, networks, ctlplane, 0]}
+  hostname:
+    description: Hostname of the server
+    value: {get_attr: [{{role}}, name]}
+  hosts_entry:
+    value:
+      str_replace:
+        template: |
+          PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
+          EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
+          INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
+          STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
+          STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
+          TENANTIP TENANTHOST.DOMAIN TENANTHOST
+          MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
+          CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
+        params:
+          PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
+          DOMAIN: {get_param: CloudDomain}
+          PRIMARYHOST: {get_attr: [{{role}}, name]}
+          EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
+          EXTERNALHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - external
+          INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
+          INTERNAL_APIHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - internalapi
+          STORAGEIP: {get_attr: [StoragePort, ip_address]}
+          STORAGEHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - storage
+          STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
+          STORAGE_MGMTHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - storagemgmt
+          TENANTIP: {get_attr: [TenantPort, ip_address]}
+          TENANTHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - tenant
+          MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
+          MANAGEMENTHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - management
+          CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
+          CTLPLANEHOST:
+            list_join:
+            - '.'
+            - - {get_attr: [{{role}}, name]}
+              - ctlplane
+  nova_server_resource:
+    description: Heat resource handle for {{role}} server
+    value:
+      {get_resource: {{role}}}
+  external_ip_address:
+    description: IP address of the server in the external network
+    value: {get_attr: [ExternalPort, ip_address]}
+  internal_api_ip_address:
+    description: IP address of the server in the internal_api network
+    value: {get_attr: [InternalApiPort, ip_address]}
+  storage_ip_address:
+    description: IP address of the server in the storage network
+    value: {get_attr: [StoragePort, ip_address]}
+  storage_mgmt_ip_address:
+    description: IP address of the server in the storage_mgmt network
+    value: {get_attr: [StorageMgmtPort, ip_address]}
+  tenant_ip_address:
+    description: IP address of the server in the tenant network
+    value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}