summaryrefslogtreecommitdiffstats
path: root/puppet/cinder-storage-puppet.yaml
blob: cc8d17c47d6d15dbd076fd4bf3a9a1ccf554fc48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background
heat_template_version: 2015-04-30
description: 'OpenStack cinder storage configured by Puppet'
parameters:
  Image:
    default: overcloud-cinder-volume
    type: string
  CinderEnableIscsiBackend:
    default: true
    description: Whether to enable or not the Iscsi backend for Cinder
    type: boolean
  CinderISCSIHelper:
    default: tgtadm
    description: The iSCSI helper to use with cinder.
    type: string
  CinderLVMLoopDeviceSize:
    default: 5000
    description: The size of the loopback file used by the cinder LVM driver.
    type: number
  CinderPassword:
    default: unset
    description: The password for the cinder service and db account, used by cinder-api.
    type: string
    hidden: true
  Debug:
    default: ''
    description: Set to True to enable debugging on all services.
    type: string
  VirtualIP: # deprecated. Use per service VIPs instead.
    default: ''
    type: string
  ExtraConfig:
    default: {}
    description: |
      Additional configuration to inject into the cluster. The JSON should have
      the following structure:
        {"FILEKEY":
          {"config":
            [{"section": "SECTIONNAME",
              "values":
                [{"option": "OPTIONNAME",
                  "value": "VALUENAME"
                 }
                ]
             }
            ]
          }
        }
      For instance:
        {"nova":
          {"config":
            [{"section": "default",
              "values":
                [{"option": "force_config_drive",
                  "value": "always"
                 }
                ]
             },
             {"section": "cells",
              "values":
                [{"option": "driver",
                  "value": "nova.cells.rpc_driver.CellsRPCDriver"
                 }
                ]
             }
            ]
          }
        }
    type: json
  Flavor:
    description: Flavor for block storage nodes to request when deploying.
    type: string
    constraints:
      - custom_constraint: nova.flavor
  GlancePort:
    default: "9292"
    description: Glance port.
    type: string
  GlanceProtocol:
    default: http
    description: Protocol to use when connecting to glance, set to https for SSL.
    type: string
  KeyName:
    default: default
    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    type: string
  RabbitPassword:
    default: 'guest'
    type: string
  RabbitUserName:
    default: 'guest'
    type: string
  RabbitClientUseSSL:
    default: false
    description: >
        Rabbit client subscriber parameter to specify
        an SSL connection to the RabbitMQ host.
    type: string
  RabbitClientPort:
    default: 5672
    description: Set rabbit subscriber port, change this if using SSL
    type: number
  SnmpdReadonlyUserName:
    default: ro_snmp_user
    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
    type: string
  SnmpdReadonlyUserPassword:
    default: unset
    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
    type: string
    hidden: true
  NtpServer:
    type: string
    default: ''
  EnablePackageInstall:
    default: 'false'
    description: Set to true to enable package installation via Puppet
    type: boolean
  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
  ServiceNetMap:
    default: {}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  GlanceApiVirtualIP:
    type: string
    default: ''
  MysqlVirtualIP:
    type: string
    default: ''

resources:
  BlockStorage:
    type: OS::Nova::Server
    properties:
      image:
        {get_param: Image}
      flavor: {get_param: Flavor}
      key_name: {get_param: KeyName}
      networks:
        - network: ctlplane
      user_data_format: SOFTWARE_CONFIG
      user_data: {get_resource: NodeUserData}
      name: {get_param: Hostname}

  NodeUserData:
    type: OS::TripleO::NodeUserData

  InternalApiPort:
    type: OS::TripleO::BlockStorage::Ports::InternalApiPort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  StoragePort:
    type: OS::TripleO::BlockStorage::Ports::StoragePort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  StorageMgmtPort:
    type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  NetworkConfig:
    type: OS::TripleO::BlockStorage::Net::SoftwareConfig
    properties:
      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
      StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}

  NetIpMap:
    type: OS::TripleO::Network::Ports::NetIpMap
    properties:
      InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
      StorageIp: {get_attr: [StoragePort, ip_address]}
      StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}

  NetworkDeployment:
    type: OS::TripleO::SoftwareDeployment
    properties:
      config: {get_resource: NetworkConfig}
      server: {get_resource: BlockStorage}

  BlockStorageDeployment:
    type: OS::Heat::StructuredDeployment
    depends_on: NetworkDeployment
    properties:
      server: {get_resource: BlockStorage}
      config: {get_resource: BlockStorageConfig}
      input_values:
        debug: {get_param: Debug}
        cinder_dsn: {list_join: ['', ['mysql://cinder:', {get_param: CinderPassword}, '@', {get_param: MysqlVirtualIP} , '/cinder']]}
        snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
        snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
        cinder_lvm_loop_device_size:
          str_replace:
            template: sizeM
            params:
              size: {get_param: CinderLVMLoopDeviceSize}
        cinder_enable_iscsi_backend: {get_param: CinderEnableIscsiBackend}
        cinder_iscsi_helper: {get_param: CinderISCSIHelper}
        cinder_iscsi_ip_address: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CinderIscsiNetwork]}]}
        glance_api_servers:
          list_join:
            - ''
            - - {get_param: GlanceProtocol}
              - '://'
              - {get_param: GlanceApiVirtualIP}
              - ':'
              - {get_param: GlancePort}
        rabbit_username: {get_param: RabbitUserName}
        rabbit_password: {get_param: RabbitPassword}
        rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
        rabbit_client_port: {get_param: RabbitClientPort}
        ntp_servers:
          str_replace:
            template: '["server"]'
            params:
              server: {get_param: NtpServer}
        enable_package_install: {get_param: EnablePackageInstall}

  # Map heat metadata into hiera datafiles
  BlockStorageConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        hiera:
          hierarchy:
            - heat_config_%{::deploy_config_name}
            - volume
            - all_nodes # provided by allNodesConfig
            - '"%{::osfamily}"'
            - common
          datafiles:
            common:
              raw_data: {get_file: hieradata/common.yaml}
            volume:
              raw_data: {get_file: hieradata/volume.yaml}
              mapped_data:
                # Cinder
                cinder::debug: {get_input: debug}
                cinder::setup_test_volume::size: {get_input: cinder_lvm_loop_device_size}
                cinder_iscsi_helper: {get_input: cinder_iscsi_helper}
                cinder::database_connection: {get_input: cinder_dsn}
                cinder::rabbit_userid: {get_input: rabbit_username}
                cinder::rabbit_password: {get_input: rabbit_password}
                cinder::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
                cinder::rabbit_port: {get_input: rabbit_client_port}
                cinder_enable_iscsi_backend: {get_input: cinder_enable_iscsi_backend}
                cinder_iscsi_ip_address: {get_input: cinder_iscsi_ip_address}
                cinder::glance::glance_api_servers: {get_input: glance_api_servers}
                ntp::servers: {get_input: ntp_servers}
                enable_package_install: {get_input: enable_package_install}
                snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
                snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}

  UpdateConfig:
    type: OS::TripleO::Tasks::PackageUpdate

  UpdateDeployment:
    type: OS::Heat::SoftwareDeployment
    properties:
      config: {get_resource: UpdateConfig}
      server: {get_resource: BlockStorage}
      input_values:
        update_identifier:
          get_param: UpdateIdentifier

outputs:
  hosts_entry:
    value:
      str_replace:
        template: "IP HOST.localdomain HOST"
        params:
          IP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
          HOST: {get_attr: [BlockStorage, name]}
  nova_server_resource:
    description: Heat resource handle for the block storage server
    value:
      {get_resource: BlockStorage}
  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]}
  config_identifier:
    description: identifier which changes if the node configuration may need re-applying
    value: {get_attr: [BlockStorageDeployment, deploy_stdout]}