├── custom-templates ├── compute.yaml ├── first-boot-template.yaml ├── post-deploy-template.yaml ├── wipe-disk.sh ├── ceph.yaml ├── network.yaml ├── layout.yaml ├── numa-systemd-osd.sh ├── nic-configs │ ├── compute-nics.yaml │ └── controller-nics.yaml ├── custom-roles.yaml.10 └── custom-roles.yaml.11 ├── README.md ├── other-scenarios └── mixed-nodes │ ├── compute-mixed.yaml │ ├── deploy-mixed.sh │ ├── network-mixed.yaml │ ├── ceph-mixed.yaml │ ├── layout-mixed.yaml │ ├── README.md │ └── custom-roles-mixed.yaml ├── deploy.sh ├── scripts ├── deploy.sh ├── ironic-assign.sh ├── configure_fence.sh └── nova_mem_cpu_calc.py └── LICENSE /custom-templates/compute.yaml: -------------------------------------------------------------------------------- 1 | parameter_defaults: 2 | ExtraConfig: 3 | nova::compute::reserved_host_memory: 181000 4 | nova::cpu_allocation_ratio: 8.2 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hci 2 | Hyper Converged Infrastructure: Scripts and Templates to deploy OpenStack with Nova Computes and Ceph-OSDs running on the same server using OSPd for Red Hat OpenStack Platform 10 and Red Hat Ceph Storage 2. 3 | 4 | This repository accompanies the Red Hat Reference Archicture Hyper-Converged Red Hat OpenStack Platform 10 and Red Hat Ceph Storage 2, which can be accessed at https://access.redhat.com/articles/2861641. 5 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/compute-mixed.yaml: -------------------------------------------------------------------------------- 1 | parameter_defaults: 2 | ComputeExtraConfig: 3 | nova::compute::reserved_host_memory: 2048 4 | nova::cpu_allocation_ratio: 16 5 | OsdComputeTwelveExtraConfig: 6 | nova::compute::reserved_host_memory: 181000 7 | nova::cpu_allocation_ratio: 8.2 8 | OsdComputeSixExtraConfig: 9 | nova::compute::reserved_host_memory: 19000 10 | nova::cpu_allocation_ratio: 8.9 11 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | source ~/stackrc 2 | time openstack overcloud deploy --templates \ 3 | -r ~/custom-templates/custom-roles.yaml \ 4 | -e /usr/share/openstack-tripleo-heat-templates/environments/puppet-pacemaker.yaml \ 5 | -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ 6 | -e /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml \ 7 | -e ~/custom-templates/network.yaml \ 8 | -e ~/custom-templates/ceph.yaml \ 9 | -e ~/custom-templates/compute.yaml \ 10 | -e ~/custom-templates/layout.yaml 11 | -------------------------------------------------------------------------------- /custom-templates/first-boot-template.yaml: -------------------------------------------------------------------------------- 1 | heat_template_version: 2014-10-16 2 | 3 | description: > 4 | Wipe and convert all disks to GPT (except the disk containing the root file system) 5 | 6 | resources: 7 | userdata: 8 | type: OS::Heat::MultipartMime 9 | properties: 10 | parts: 11 | - config: {get_resource: wipe_disk} 12 | 13 | wipe_disk: 14 | type: OS::Heat::SoftwareConfig 15 | properties: 16 | config: {get_file: wipe-disk.sh} 17 | 18 | outputs: 19 | OS::stack_id: 20 | value: {get_resource: userdata} -------------------------------------------------------------------------------- /scripts/deploy.sh: -------------------------------------------------------------------------------- 1 | source ~/stackrc 2 | time openstack overcloud deploy --templates \ 3 | -r ~/custom-templates/custom-roles.yaml \ 4 | -e /usr/share/openstack-tripleo-heat-templates/environments/puppet-pacemaker.yaml \ 5 | -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ 6 | -e /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml \ 7 | -e ~/custom-templates/network.yaml \ 8 | -e ~/custom-templates/ceph.yaml \ 9 | -e ~/custom-templates/compute.yaml \ 10 | -e ~/custom-templates/layout.yaml 11 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/deploy-mixed.sh: -------------------------------------------------------------------------------- 1 | source ~/stackrc 2 | time openstack overcloud deploy --templates \ 3 | -r ~/custom-templates/custom-roles-mixed.yaml \ 4 | -e /usr/share/openstack-tripleo-heat-templates/environments/puppet-pacemaker.yaml \ 5 | -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ 6 | -e /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml \ 7 | -e ~/custom-templates/network-mixed.yaml \ 8 | -e ~/custom-templates/ceph-mixed.yaml \ 9 | -e ~/custom-templates/compute-mixed.yaml \ 10 | -e ~/custom-templates/layout-mixed.yaml 11 | -------------------------------------------------------------------------------- /custom-templates/post-deploy-template.yaml: -------------------------------------------------------------------------------- 1 | heat_template_version: 2014-10-16 2 | 3 | parameters: 4 | servers: 5 | type: json 6 | 7 | resources: 8 | 9 | ExtraConfig: 10 | type: OS::Heat::SoftwareConfig 11 | properties: 12 | group: script 13 | inputs: 14 | - name: OSD_NUMA_INTERFACE 15 | config: {get_file: numa-systemd-osd.sh} 16 | 17 | ExtraDeployments: 18 | type: OS::Heat::SoftwareDeployments 19 | properties: 20 | servers: {get_param: servers} 21 | config: {get_resource: ExtraConfig} 22 | input_values: 23 | OSD_NUMA_INTERFACE: 'em2' 24 | actions: ['CREATE'] 25 | -------------------------------------------------------------------------------- /custom-templates/wipe-disk.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | if [[ `hostname` = *"ceph"* ]] || [[ `hostname` = *"osd-compute"* ]] 3 | then 4 | echo "Number of disks detected: $(lsblk -no NAME,TYPE,MOUNTPOINT | grep "disk" | awk '{print $1}' | wc -l)" 5 | for DEVICE in `lsblk -no NAME,TYPE,MOUNTPOINT | grep "disk" | awk '{print $1}'` 6 | do 7 | ROOTFOUND=0 8 | echo "Checking /dev/$DEVICE..." 9 | echo "Number of partitions on /dev/$DEVICE: $(expr $(lsblk -n /dev/$DEVICE | awk '{print $7}' | wc -l) - 1)" 10 | for MOUNTS in `lsblk -n /dev/$DEVICE | awk '{print $7}'` 11 | do 12 | if [ "$MOUNTS" = "/" ] 13 | then 14 | ROOTFOUND=1 15 | fi 16 | done 17 | if [ $ROOTFOUND = 0 ] 18 | then 19 | echo "Root not found in /dev/${DEVICE}" 20 | echo "Wiping disk /dev/${DEVICE}" 21 | sgdisk -Z /dev/${DEVICE} 22 | sgdisk -g /dev/${DEVICE} 23 | else 24 | echo "Root found in /dev/${DEVICE}" 25 | fi 26 | done 27 | fi 28 | -------------------------------------------------------------------------------- /scripts/ironic-assign.sh: -------------------------------------------------------------------------------- 1 | # Filename: ironic-assign.sh 2 | # Description: Assign ironic nodes to $name 3 | # Supported Langauge(s): GNU Bash 4.2.x 4 | # Time-stamp: <2016-11-23 19:34:25 jfulton> 5 | # ------------------------------------------------------- 6 | if [[ $# -eq 0 ]] ; then 7 | echo "usage: $0 " 8 | echo " regex matching the nodes to be tagged; e.g. \"730\" or \"630\"" 9 | echo " name desired for node; e.g. \"osd-compute\" or \"controller\"" 10 | exit 1 11 | fi 12 | regex=$1 13 | name=$2 14 | 15 | source ~/stackrc 16 | echo "Assigning nodes from ironic's list that match $regex" 17 | for id in $(ironic node-list | grep available | awk '{print $2}'); do 18 | match=0; 19 | match=$(ironic node-show $id | egrep $regex | wc -l); 20 | if [[ $match -gt 0 ]]; then 21 | echo $id; 22 | fi 23 | done > /tmp/n_nodes 24 | 25 | count=$(cat /tmp/n_nodes | wc -l) 26 | echo "$count nodes match $regex" 27 | 28 | i=0 29 | for id in $(cat /tmp/n_nodes); do 30 | node="$name-$i" 31 | ironic node-update $id replace properties/capabilities=node:$node,boot_option:local 32 | i=$(expr $i + 1) 33 | done 34 | 35 | echo "Ironic node properties have been set to the following:" 36 | for ironic_id in $(ironic node-list | awk {'print $2'} | grep -v UUID | egrep -v '^$'); 37 | do 38 | echo $ironic_id; 39 | ironic node-show $ironic_id | egrep -A 1 "memory_mb|profile|wwn" ; 40 | echo ""; 41 | done 42 | -------------------------------------------------------------------------------- /custom-templates/ceph.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | OS::TripleO::NodeUserData: /home/stack/custom-templates/first-boot-template.yaml 3 | OS::TripleO::NodeExtraConfigPost: /home/stack/custom-templates/post-deploy-template.yaml 4 | 5 | parameter_defaults: 6 | ExtraConfig: 7 | ceph::profile::params::fsid: eb2bb192-b1c9-11e6-9205-525400330666 8 | ceph::profile::params::osd_pool_default_pg_num: 256 9 | ceph::profile::params::osd_pool_default_pgp_num: 256 10 | ceph::profile::params::osd_pool_default_size: 3 11 | ceph::profile::params::osd_pool_default_min_size: 2 12 | ceph::profile::params::osd_recovery_max_active: 3 13 | ceph::profile::params::osd_max_backfills: 1 14 | ceph::profile::params::osd_recovery_op_priority: 2 15 | OsdComputeExtraConfig: 16 | ceph::profile::params::osd_journal_size: 5120 17 | ceph::profile::params::osds: 18 | '/dev/sda': 19 | journal: '/dev/sdm' 20 | '/dev/sdb': 21 | journal: '/dev/sdm' 22 | '/dev/sdc': 23 | journal: '/dev/sdm' 24 | '/dev/sdd': 25 | journal: '/dev/sdm' 26 | '/dev/sde': 27 | journal: '/dev/sdn' 28 | '/dev/sdf': 29 | journal: '/dev/sdn' 30 | '/dev/sdg': 31 | journal: '/dev/sdn' 32 | '/dev/sdh': 33 | journal: '/dev/sdn' 34 | '/dev/sdi': 35 | journal: '/dev/sdo' 36 | '/dev/sdj': 37 | journal: '/dev/sdo' 38 | '/dev/sdk': 39 | journal: '/dev/sdo' 40 | '/dev/sdl': 41 | journal: '/dev/sdo' 42 | -------------------------------------------------------------------------------- /custom-templates/network.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | OS::TripleO::OsdCompute::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/compute-nics.yaml 3 | OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/controller-nics.yaml 4 | 5 | parameter_defaults: 6 | NeutronBridgeMappings: 'datacentre:br-ex,tenant:br-tenant' 7 | NeutronNetworkType: 'vxlan' 8 | NeutronTunnelType: 'vxlan' 9 | NeutronExternalNetworkBridge: "''" 10 | 11 | # Internal API used for private OpenStack Traffic 12 | InternalApiNetCidr: 192.168.2.0/24 13 | InternalApiAllocationPools: [{'start': '192.168.2.10', 'end': '192.168.2.200'}] 14 | InternalApiNetworkVlanID: 4049 15 | 16 | # Tenant Network Traffic - will be used for VXLAN over VLAN 17 | TenantNetCidr: 192.168.3.0/24 18 | TenantAllocationPools: [{'start': '192.168.3.10', 'end': '192.168.3.200'}] 19 | TenantNetworkVlanID: 4050 20 | 21 | # Public Storage Access - e.g. Nova/Glance <--> Ceph 22 | StorageNetCidr: 172.16.1.0/24 23 | StorageAllocationPools: [{'start': '172.16.1.10', 'end': '172.16.1.200'}] 24 | StorageNetworkVlanID: 4046 25 | 26 | # Private Storage Access - i.e. Ceph background cluster/replication 27 | StorageMgmtNetCidr: 172.16.2.0/24 28 | StorageMgmtAllocationPools: [{'start': '172.16.2.10', 'end': '172.16.2.200'}] 29 | StorageMgmtNetworkVlanID: 4047 30 | 31 | # External Networking Access - Public API Access 32 | ExternalNetCidr: 10.19.137.0/21 33 | # Leave room for floating IPs in the External allocation pool (if required) 34 | ExternalAllocationPools: [{'start': '10.19.139.37', 'end': '10.19.139.48'}] 35 | # Set to the router gateway on the external network 36 | ExternalInterfaceDefaultRoute: 10.19.143.254 37 | 38 | # Gateway router for the provisioning network (or Undercloud IP) 39 | ControlPlaneDefaultRoute: 192.168.1.1 40 | # The IP address of the EC2 metadata server. Generally the IP of the Undercloud 41 | EC2MetadataIp: 192.168.1.1 42 | # Define the DNS servers (maximum 2) for the overcloud nodes 43 | DnsServers: ["10.19.143.247","10.19.143.248"] 44 | -------------------------------------------------------------------------------- /scripts/configure_fence.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | source ~/stackrc 4 | env | grep OS_ 5 | SSH_CMD="ssh -l heat-admin" 6 | 7 | function usage { 8 | echo "USAGE: $0 [enable|test]" 9 | exit 1 10 | } 11 | 12 | function enable_stonith { 13 | # for all controller nodes 14 | for i in $(nova list | awk ' /controller/ { print $12 } ' | cut -f2 -d=) 15 | do 16 | echo $i 17 | # create the fence device 18 | $SSH_CMD $i 'sudo pcs stonith create $(hostname -s)-ipmi fence_ipmilan pcmk_host_list=$(hostname -s) ipaddr=$(sudo ipmitool lan print 1 | awk " /IP Address / { print \$4 } ") login=root passwd=PASSWORD lanplus=1 cipher=1 op monitor interval=60sr' 19 | # avoid fencing yourself 20 | $SSH_CMD $i 'sudo pcs constraint location $(hostname -s)-ipmi avoids $(hostname -s)' 21 | done 22 | 23 | # enable STONITH devices from any controller 24 | $SSH_CMD $i 'sudo pcs property set stonith-enabled=true' 25 | $SSH_CMD $i 'sudo pcs property show' 26 | 27 | } 28 | 29 | function test_fence { 30 | 31 | for i in $(nova list | awk ' /controller/ { print $12 } ' | cut -f2 -d= | head -n 1) 32 | do 33 | # get REDIS_IP 34 | REDIS_IP=$($SSH_CMD $i 'sudo grep -ri redis_vip /etc/puppet/hieradata/' | awk '/vip_data.yaml/ { print $2 } ') 35 | done 36 | # for all controller nodes 37 | for i in $(nova list | awk ' /controller/ { print $12 } ' | cut -f2 -d=) 38 | do 39 | if $SSH_CMD $i "sudo ip a" | grep -q $REDIS_IP 40 | then 41 | FENCE_DEVICE=$($SSH_CMD $i 'sudo pcs stonith show $(hostname -s)-ipmi' | awk ' /Attributes/ { print $2 } ' | cut -f2 -d=) 42 | IUUID=$(nova list | awk " /$i/ { print \$2 } ") 43 | UUID=$(ironic node-list | awk " /$IUUID/ { print \$2 } ") 44 | else 45 | FENCER=$i 46 | fi 47 | done 2>/dev/null 48 | 49 | echo "REDIS_IP $REDIS_IP" 50 | echo "FENCER $FENCER" 51 | echo "FENCE_DEVICE $FENCE_DEVICE" 52 | echo "UUID $UUID" 53 | echo "IUUID $IUUID" 54 | 55 | # stonith REDIS_IP owner 56 | $SSH_CMD $FENCER sudo pcs stonith fence $FENCE_DEVICE 57 | 58 | sleep 30 59 | 60 | # fence REDIS_IP owner to keep ironic from powering it on 61 | sudo ironic node-set-power-state $UUID off 62 | 63 | sleep 60 64 | 65 | # check REDIS_IP failover 66 | $SSH_CMD $FENCER sudo pcs status | grep $REDIS_IP 67 | } 68 | 69 | if [ "$1" == "test" ] 70 | then 71 | test_fence 72 | elif [ "$1" == "enable" ] 73 | then 74 | enable_stonith 75 | else 76 | usage 77 | fi 78 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/network-mixed.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/controller-nics.yaml 3 | OS::TripleO::Compute::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/compute-nics.yaml 4 | OS::TripleO::CephStorage::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/compute-nics.yaml 5 | OS::TripleO::OsdComputeTwelve::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/compute-nics.yaml 6 | OS::TripleO::OsdComputeSix::Net::SoftwareConfig: /home/stack/custom-templates/nic-configs/compute-nics.yaml 7 | 8 | parameter_defaults: 9 | NeutronBridgeMappings: 'datacentre:br-ex,tenant:br-tenant' 10 | NeutronNetworkType: 'vxlan' 11 | NeutronTunnelType: 'vxlan' 12 | NeutronExternalNetworkBridge: "''" 13 | 14 | # Internal API used for private OpenStack Traffic 15 | InternalApiNetCidr: 192.168.2.0/24 16 | InternalApiAllocationPools: [{'start': '192.168.2.10', 'end': '192.168.2.200'}] 17 | InternalApiNetworkVlanID: 4049 18 | 19 | # Tenant Network Traffic - will be used for VXLAN over VLAN 20 | TenantNetCidr: 192.168.3.0/24 21 | TenantAllocationPools: [{'start': '192.168.3.10', 'end': '192.168.3.200'}] 22 | TenantNetworkVlanID: 4050 23 | 24 | # Public Storage Access - e.g. Nova/Glance <--> Ceph 25 | StorageNetCidr: 172.16.1.0/24 26 | StorageAllocationPools: [{'start': '172.16.1.10', 'end': '172.16.1.200'}] 27 | StorageNetworkVlanID: 4046 28 | 29 | # Private Storage Access - i.e. Ceph background cluster/replication 30 | StorageMgmtNetCidr: 172.16.2.0/24 31 | StorageMgmtAllocationPools: [{'start': '172.16.2.10', 'end': '172.16.2.200'}] 32 | StorageMgmtNetworkVlanID: 4047 33 | 34 | # External Networking Access - Public API Access 35 | ExternalNetCidr: 10.19.137.0/21 36 | # Leave room for floating IPs in the External allocation pool (if required) 37 | ExternalAllocationPools: [{'start': '10.19.139.37', 'end': '10.19.139.48'}] 38 | # Set to the router gateway on the external network 39 | ExternalInterfaceDefaultRoute: 10.19.143.254 40 | 41 | # Gateway router for the provisioning network (or Undercloud IP) 42 | ControlPlaneDefaultRoute: 192.168.1.1 43 | # The IP address of the EC2 metadata server. Generally the IP of the Undercloud 44 | EC2MetadataIp: 192.168.1.1 45 | # Define the DNS servers (maximum 2) for the overcloud nodes 46 | DnsServers: ["10.19.143.247","10.19.143.248"] 47 | -------------------------------------------------------------------------------- /custom-templates/layout.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | 3 | OS::TripleO::Controller::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 4 | OS::TripleO::Controller::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 5 | OS::TripleO::Controller::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 6 | OS::TripleO::Controller::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 7 | 8 | OS::TripleO::OsdCompute::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 9 | OS::TripleO::OsdCompute::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 10 | OS::TripleO::OsdCompute::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 11 | OS::TripleO::OsdCompute::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 12 | 13 | 14 | parameter_defaults: 15 | NtpServer: 10.5.26.10 16 | 17 | ControllerCount: 3 18 | ComputeCount: 0 19 | CephStorageCount: 0 20 | OsdComputeCount: 3 21 | 22 | ControllerSchedulerHints: 23 | 'capabilities:node': 'controller-%index%' 24 | NovaComputeSchedulerHints: 25 | 'capabilities:node': 'compute-%index%' 26 | CephStorageSchedulerHints: 27 | 'capabilities:node': 'ceph-storage-%index%' 28 | OsdComputeSchedulerHints: 29 | 'capabilities:node': 'osd-compute-%index%' 30 | 31 | ControllerIPs: 32 | internal_api: 33 | - 192.168.2.200 34 | - 192.168.2.201 35 | - 192.168.2.202 36 | tenant: 37 | - 192.168.3.200 38 | - 192.168.3.201 39 | - 192.168.3.202 40 | storage: 41 | - 172.16.1.200 42 | - 172.16.1.201 43 | - 172.16.1.202 44 | storage_mgmt: 45 | - 172.16.2.200 46 | - 172.16.2.201 47 | - 172.16.2.202 48 | 49 | OsdComputeIPs: 50 | internal_api: 51 | - 192.168.2.203 52 | - 192.168.2.204 53 | - 192.168.2.205 54 | #- 192.168.2.206 55 | tenant: 56 | - 192.168.3.203 57 | - 192.168.3.204 58 | - 192.168.3.205 59 | #- 192.168.3.206 60 | storage: 61 | - 172.16.1.203 62 | - 172.16.1.204 63 | - 172.16.1.205 64 | #- 172.16.1.206 65 | storage_mgmt: 66 | - 172.16.2.203 67 | - 172.16.2.204 68 | - 172.16.2.205 69 | #- 172.16.2.206 70 | 71 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/ceph-mixed.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | OS::TripleO::NodeUserData: /home/stack/custom-templates/first-boot-template.yaml 3 | OS::TripleO::NodeExtraConfigPost: /home/stack/custom-templates/post-deploy-template.yaml 4 | 5 | parameter_defaults: 6 | ExtraConfig: 7 | ceph::profile::params::fsid: eb2bb192-b1c9-11e6-9205-525400330666 8 | ceph::profile::params::osd_pool_default_pg_num: 256 9 | ceph::profile::params::osd_pool_default_pgp_num: 256 10 | ceph::profile::params::osd_pool_default_size: 3 11 | ceph::profile::params::osd_pool_default_min_size: 2 12 | ceph::profile::params::osd_recovery_max_active: 3 13 | ceph::profile::params::osd_max_backfills: 1 14 | ceph::profile::params::osd_recovery_op_priority: 2 15 | CephStorageExtraConfig: 16 | ceph::profile::params::osd_journal_size: 5120 17 | ceph::profile::params::osds: 18 | '/dev/sda': 19 | journal: '/dev/sdm' 20 | '/dev/sdb': 21 | journal: '/dev/sdm' 22 | '/dev/sdc': 23 | journal: '/dev/sdm' 24 | '/dev/sdd': 25 | journal: '/dev/sdm' 26 | '/dev/sde': 27 | journal: '/dev/sdn' 28 | '/dev/sdf': 29 | journal: '/dev/sdn' 30 | '/dev/sdg': 31 | journal: '/dev/sdn' 32 | '/dev/sdh': 33 | journal: '/dev/sdn' 34 | '/dev/sdi': 35 | journal: '/dev/sdo' 36 | '/dev/sdj': 37 | journal: '/dev/sdo' 38 | OsdComputeTwelveExtraConfig: 39 | ceph::profile::params::osd_journal_size: 5120 40 | ceph::profile::params::osds: 41 | '/dev/sda': 42 | journal: '/dev/sdm' 43 | '/dev/sdb': 44 | journal: '/dev/sdm' 45 | '/dev/sdc': 46 | journal: '/dev/sdm' 47 | '/dev/sdd': 48 | journal: '/dev/sdm' 49 | '/dev/sde': 50 | journal: '/dev/sdn' 51 | '/dev/sdf': 52 | journal: '/dev/sdn' 53 | '/dev/sdg': 54 | journal: '/dev/sdn' 55 | '/dev/sdh': 56 | journal: '/dev/sdn' 57 | '/dev/sdi': 58 | journal: '/dev/sdo' 59 | '/dev/sdj': 60 | journal: '/dev/sdo' 61 | '/dev/sdk': 62 | journal: '/dev/sdo' 63 | '/dev/sdl': 64 | journal: '/dev/sdo' 65 | OsdComputeSixExtraConfig: 66 | ceph::profile::params::osd_journal_size: 5120 67 | ceph::profile::params::osds: 68 | '/dev/sda': 69 | journal: '/dev/sdm' 70 | '/dev/sdb': 71 | journal: '/dev/sdm' 72 | '/dev/sdc': 73 | journal: '/dev/sdm' 74 | '/dev/sdd': 75 | journal: '/dev/sdm' 76 | '/dev/sde': 77 | journal: '/dev/sdn' 78 | '/dev/sdf': 79 | journal: '/dev/sdn' 80 | -------------------------------------------------------------------------------- /custom-templates/numa-systemd-osd.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | { 3 | if [[ `hostname` = *"ceph"* ]] || [[ `hostname` = *"osd-compute"* ]]; then 4 | 5 | # Verify the passed network interface exists 6 | if [[ ! $(ip add show $OSD_NUMA_INTERFACE) ]]; then 7 | exit 1 8 | fi 9 | 10 | # If NUMA related packages are missing, then install them 11 | # If packages are baked into image, no install attempted 12 | for PKG in numactl hwloc; do 13 | if [[ ! $(rpm -q $PKG) ]]; then 14 | yum install -y $PKG 15 | if [[ ! $? ]]; then 16 | echo "Unable to install $PKG with yum" 17 | exit 1 18 | fi 19 | fi 20 | done 21 | 22 | if [[ ! $(lstopo-no-graphics | tr -d [:punct:] | egrep "NUMANode|$OSD_NUMA_INTERFACE") ]]; 23 | then 24 | echo "No NUMAnodes found. Exiting." 25 | exit 1 26 | fi 27 | 28 | # Find the NUMA socket of the $OSD_NUMA_INTERFACE 29 | declare -A NUMASOCKET 30 | while read TYPE SOCKET_NUM NIC ; do 31 | if [[ "$TYPE" == "NUMANode" ]]; then 32 | NUMASOCKET=$(echo $SOCKET_NUM | sed s/L//g); 33 | fi 34 | if [[ "$NIC" == "$OSD_NUMA_INTERFACE" ]]; then 35 | # because $NIC is the $OSD_NUMA_INTERFACE, 36 | # the NUMASOCKET has been set correctly above 37 | break # so stop looking 38 | fi 39 | done < <(lstopo-no-graphics | tr -d [:punct:] | egrep "NUMANode|$OSD_NUMA_INTERFACE") 40 | 41 | if [[ -z $NUMASOCKET ]]; then 42 | echo "No NUMAnode found for $OSD_NUMA_INTERFACE. Exiting." 43 | exit 1 44 | fi 45 | 46 | UNIT='/usr/lib/systemd/system/ceph-osd@.service' 47 | # Preserve the original ceph-osd start command 48 | CMD=$(crudini --get $UNIT Service ExecStart) 49 | 50 | if [[ $(echo $CMD | grep numactl) ]]; then 51 | echo "numactl already in $UNIT. No changes required." 52 | exit 0 53 | fi 54 | 55 | # NUMA control options to append in front of $CMD 56 | NUMA="/usr/bin/numactl -N $NUMASOCKET --preferred=$NUMASOCKET" 57 | 58 | # Update the unit file to start with numactl 59 | # TODO: why doesn't a copy of $UNIT in /etc/systemd/system work with numactl? 60 | crudini --verbose --set $UNIT Service ExecStart "$NUMA $CMD" 61 | 62 | # Reload so updated file is used 63 | systemctl daemon-reload 64 | 65 | # Restart OSDs with NUMA policy (print results for log) 66 | OSD_IDS=$(ls /var/lib/ceph/osd | awk 'BEGIN { FS = "-" } ; { print $2 }') 67 | for OSD_ID in $OSD_IDS; do 68 | echo -e "\nStatus of OSD $OSD_ID before unit file update\n" 69 | systemctl status ceph-osd@$OSD_ID 70 | echo -e "\nRestarting OSD $OSD_ID..." 71 | systemctl restart ceph-osd@$OSD_ID 72 | echo -e "\nStatus of OSD $OSD_ID after unit file update\n" 73 | systemctl status ceph-osd@$OSD_ID 74 | done 75 | fi 76 | } 2>&1 > /root/post_deploy_heat_output.txt 77 | -------------------------------------------------------------------------------- /scripts/nova_mem_cpu_calc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # Filename: nova_mem_cpu_calc.py 3 | # Supported Langauge(s): Python 2.7.x, Python 3.7.x 4 | # Time-stamp: <2020-02-20 13:52:01 fultonj> 5 | # ------------------------------------------------------- 6 | # This program was originally written by Ben England 7 | # ------------------------------------------------------- 8 | # Calculates cpu_allocation_ratio and reserved_host_memory 9 | # for nova.conf based on on the following inputs: 10 | # 11 | # input command line parameters: 12 | # 1 - total host RAM in GB 13 | # 2 - total host cores 14 | # 3 - Ceph OSDs per server 15 | # 4 - average guest size in GB 16 | # 5 - average guest CPU utilization (0.0 to 1.0) 17 | # 18 | # It assumes that we want to allow 3 GB per OSD 19 | # (based on prior Ceph Hammer testing) 20 | # and that we want to allow an extra 1/2 GB per Nova (KVM guest) 21 | # based on test observations that KVM guests' virtual memory footprint 22 | # was actually significantly bigger than the declared guest memory size 23 | # This is more of a factor for small guests than for large guests. 24 | # ------------------------------------------------------- 25 | import sys 26 | from sys import argv 27 | 28 | NOTOK = 1 # process exit status signifying failure 29 | MB_per_GB = 1000 30 | 31 | GB_per_OSD = 3 32 | GB_overhead_per_guest = 0.5 # based on measurement in test environment 33 | cores_per_OSD = 1.0 # may be a little low in I/O intensive workloads 34 | 35 | def usage(msg): 36 | print(msg) 37 | print( 38 | ("Usage: %s Total-host-RAM-GB Total-host-cores OSDs-per-server " + 39 | "Avg-guest-size-GB Avg-guest-CPU-util") % sys.argv[0]) 40 | sys.exit(NOTOK) 41 | 42 | if len(argv) < 6: usage("Too few command line params") 43 | try: 44 | mem = int(argv[1]) 45 | cores = int(argv[2]) 46 | osds = int(argv[3]) 47 | average_guest_size = int(argv[4]) 48 | average_guest_util = float(argv[5]) 49 | except ValueError: 50 | usage("Non-integer input parameter") 51 | 52 | average_guest_util_percent = 100 * average_guest_util 53 | 54 | # print inputs 55 | print("Inputs:") 56 | print("- Total host RAM in GB: %d" % mem) 57 | print("- Total host cores: %d" % cores) 58 | print("- Ceph OSDs per host: %d" % osds) 59 | print("- Average guest memory size in GB: %d" % average_guest_size) 60 | print("- Average guest CPU utilization: %.0f%%" % average_guest_util_percent) 61 | 62 | # calculate operating parameters based on memory constraints only 63 | left_over_mem = mem - (GB_per_OSD * osds) 64 | number_of_guests = int(left_over_mem / 65 | (average_guest_size + GB_overhead_per_guest)) 66 | nova_reserved_mem_MB = MB_per_GB * ( 67 | (GB_per_OSD * osds) + 68 | (number_of_guests * GB_overhead_per_guest)) 69 | nonceph_cores = cores - (cores_per_OSD * osds) 70 | guest_vCPUs = nonceph_cores / average_guest_util 71 | cpu_allocation_ratio = guest_vCPUs / cores 72 | 73 | # display outputs including how to tune Nova reserved mem 74 | 75 | print("\nResults:") 76 | print("- number of guests allowed based on memory = %d" % number_of_guests) 77 | print("- number of guest vCPUs allowed = %d" % int(guest_vCPUs)) 78 | print("- nova.conf reserved_host_memory = %d MB" % nova_reserved_mem_MB) 79 | print("- nova.conf cpu_allocation_ratio = %f" % cpu_allocation_ratio) 80 | 81 | if nova_reserved_mem_MB > (MB_per_GB * mem * 0.8): 82 | print("ERROR: you do not have enough memory to run hyperconverged!") 83 | sys.exit(NOTOK) 84 | 85 | if cpu_allocation_ratio < 0.5: 86 | print("WARNING: you may not have enough CPU to run hyperconverged!") 87 | 88 | if cpu_allocation_ratio > 16.0: 89 | print( 90 | "WARNING: do not increase VCPU overcommit ratio " + 91 | "beyond OSP8 default of 16:1") 92 | sys.exit(NOTOK) 93 | 94 | print("\nCompare \"guest vCPUs allowed\" to \"guests allowed based on memory\" for actual guest count") 95 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/layout-mixed.yaml: -------------------------------------------------------------------------------- 1 | resource_registry: 2 | 3 | OS::TripleO::Controller::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 4 | OS::TripleO::Controller::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 5 | OS::TripleO::Controller::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 6 | OS::TripleO::Controller::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 7 | 8 | OS::TripleO::Compute::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 9 | OS::TripleO::Compute::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 10 | OS::TripleO::Compute::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 11 | OS::TripleO::Compute::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 12 | 13 | OS::TripleO::CephStorage::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 14 | OS::TripleO::CephStorage::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 15 | OS::TripleO::CephStorage::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 16 | OS::TripleO::CephStorage::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 17 | 18 | OS::TripleO::OsdComputeSix::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 19 | OS::TripleO::OsdComputeSix::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 20 | OS::TripleO::OsdComputeSix::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 21 | OS::TripleO::OsdComputeSix::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 22 | 23 | OS::TripleO::OsdComputeTwelve::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/internal_api_from_pool.yaml 24 | OS::TripleO::OsdComputeTwelve::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/tenant_from_pool.yaml 25 | OS::TripleO::OsdComputeTwelve::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_from_pool.yaml 26 | OS::TripleO::OsdComputeTwelve::Ports::StorageMgmtPort: /usr/share/openstack-tripleo-heat-templates/network/ports/storage_mgmt_from_pool.yaml 27 | 28 | parameter_defaults: 29 | NtpServer: 10.5.26.10 30 | 31 | ControllerCount: 3 32 | ComputeCount: 1 33 | CephStorageCount: 1 34 | OsdComputeTwelveCount: 1 35 | OsdComputeSixCount: 1 36 | 37 | ControllerSchedulerHints: 38 | 'capabilities:node': 'controller-%index%' 39 | NovaComputeSchedulerHints: 40 | 'capabilities:node': 'compute-%index%' 41 | CephStorageSchedulerHints: 42 | 'capabilities:node': 'ceph-storage-%index%' 43 | OsdComputeTwelveSchedulerHints: 44 | 'capabilities:node': 'osd-compute-twelve-%index%' 45 | OsdComputeSixSchedulerHints: 46 | 'capabilities:node': 'osd-compute-six-%index%' 47 | 48 | ControllerIPs: 49 | internal_api: 50 | - 192.168.2.200 51 | - 192.168.2.201 52 | - 192.168.2.202 53 | tenant: 54 | - 192.168.3.200 55 | - 192.168.3.201 56 | - 192.168.3.202 57 | storage: 58 | - 172.16.1.200 59 | - 172.16.1.201 60 | - 172.16.1.202 61 | storage_mgmt: 62 | - 172.16.2.200 63 | - 172.16.2.201 64 | - 172.16.2.202 65 | 66 | NovaComputeIPs: 67 | internal_api: 68 | - 192.168.2.203 69 | tenant: 70 | - 192.168.3.203 71 | storage: 72 | - 172.16.1.203 73 | storage_mgmt: 74 | - 172.16.2.203 75 | 76 | CephStorageIPs: 77 | internal_api: 78 | - 192.168.2.204 79 | tenant: 80 | - 192.168.3.204 81 | storage: 82 | - 172.16.1.204 83 | storage_mgmt: 84 | - 172.16.2.204 85 | 86 | OsdComputeSixIPs: 87 | internal_api: 88 | - 192.168.2.205 89 | tenant: 90 | - 192.168.3.205 91 | storage: 92 | - 172.16.1.205 93 | storage_mgmt: 94 | - 172.16.2.205 95 | 96 | OsdComputeTwelveIPs: 97 | internal_api: 98 | - 192.168.2.206 99 | tenant: 100 | - 192.168.3.206 101 | storage: 102 | - 172.16.1.206 103 | storage_mgmt: 104 | - 172.16.2.206 105 | -------------------------------------------------------------------------------- /custom-templates/nic-configs/compute-nics.yaml: -------------------------------------------------------------------------------- 1 | heat_template_version: 2015-04-30 2 | 3 | description: > 4 | Software Config to drive os-net-config to configure VLANs for the 5 | compute and osd role (assumption is that compute and osd cohabitate) 6 | 7 | parameters: 8 | ControlPlaneIp: 9 | default: '' 10 | description: IP address/subnet on the ctlplane network 11 | type: string 12 | ExternalIpSubnet: 13 | default: '' 14 | description: IP address/subnet on the external network 15 | type: string 16 | InternalApiIpSubnet: 17 | default: '' 18 | description: IP address/subnet on the internal API network 19 | type: string 20 | StorageIpSubnet: 21 | default: '' 22 | description: IP address/subnet on the storage network 23 | type: string 24 | StorageMgmtIpSubnet: 25 | default: '' 26 | description: IP address/subnet on the storage mgmt network 27 | type: string 28 | TenantIpSubnet: 29 | default: '' 30 | description: IP address/subnet on the tenant network 31 | type: string 32 | ManagementIpSubnet: # Only populated when including environments/network-management.yaml 33 | default: '' 34 | description: IP address/subnet on the management network 35 | type: string 36 | ExternalNetworkVlanID: 37 | default: 10 38 | description: Vlan ID for the external network traffic. 39 | type: number 40 | InternalApiNetworkVlanID: 41 | default: 20 42 | description: Vlan ID for the internal_api network traffic. 43 | type: number 44 | StorageNetworkVlanID: 45 | default: 30 46 | description: Vlan ID for the storage network traffic. 47 | type: number 48 | StorageMgmtNetworkVlanID: 49 | default: 40 50 | description: Vlan ID for the storage mgmt network traffic. 51 | type: number 52 | TenantNetworkVlanID: 53 | default: 50 54 | description: Vlan ID for the tenant network traffic. 55 | type: number 56 | ManagementNetworkVlanID: 57 | default: 60 58 | description: Vlan ID for the management network traffic. 59 | type: number 60 | ExternalInterfaceDefaultRoute: 61 | default: '10.0.0.1' 62 | description: default route for the external network 63 | type: string 64 | ControlPlaneSubnetCidr: # Override this via parameter_defaults 65 | default: '24' 66 | description: The subnet CIDR of the control plane network. 67 | type: string 68 | ControlPlaneDefaultRoute: # Override this via parameter_defaults 69 | description: The subnet CIDR of the control plane network. 70 | type: string 71 | DnsServers: # Override this via parameter_defaults 72 | default: [] 73 | description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf. 74 | type: comma_delimited_list 75 | EC2MetadataIp: # Override this via parameter_defaults 76 | description: The IP address of the EC2 metadata server. 77 | type: string 78 | 79 | resources: 80 | OsNetConfigImpl: 81 | type: OS::Heat::StructuredConfig 82 | properties: 83 | group: os-apply-config 84 | config: 85 | os_net_config: 86 | network_config: 87 | - 88 | type: interface 89 | name: em3 90 | use_dhcp: false 91 | dns_servers: {get_param: DnsServers} 92 | addresses: 93 | - 94 | ip_netmask: 95 | list_join: 96 | - '/' 97 | - - {get_param: ControlPlaneIp} 98 | - {get_param: ControlPlaneSubnetCidr} 99 | routes: 100 | - 101 | ip_netmask: 169.254.169.254/32 102 | next_hop: {get_param: EC2MetadataIp} 103 | - 104 | default: true 105 | next_hop: {get_param: ControlPlaneDefaultRoute} 106 | - 107 | type: interface 108 | name: em2 109 | use_dhcp: false 110 | mtu: 9000 111 | - 112 | type: vlan 113 | device: em2 114 | mtu: 9000 115 | use_dhcp: false 116 | vlan_id: {get_param: StorageMgmtNetworkVlanID} 117 | addresses: 118 | - 119 | ip_netmask: {get_param: StorageMgmtIpSubnet} 120 | - 121 | type: vlan 122 | device: em2 123 | mtu: 9000 124 | use_dhcp: false 125 | vlan_id: {get_param: StorageNetworkVlanID} 126 | addresses: 127 | - 128 | ip_netmask: {get_param: StorageIpSubnet} 129 | - 130 | type: interface 131 | name: em4 132 | use_dhcp: false 133 | addresses: 134 | - 135 | ip_netmask: {get_param: InternalApiIpSubnet} 136 | - 137 | # VLAN for VXLAN tenant networking 138 | type: ovs_bridge 139 | name: br-tenant 140 | mtu: 1500 141 | use_dhcp: false 142 | members: 143 | - 144 | type: interface 145 | name: em1 146 | mtu: 1500 147 | use_dhcp: false 148 | # force the MAC address of the bridge to this interface 149 | primary: true 150 | - 151 | type: vlan 152 | mtu: 1500 153 | vlan_id: {get_param: TenantNetworkVlanID} 154 | addresses: 155 | - 156 | ip_netmask: {get_param: TenantIpSubnet} 157 | # Uncomment when including environments/network-management.yaml 158 | #- 159 | # type: interface 160 | # name: nic7 161 | # use_dhcp: false 162 | # addresses: 163 | # - 164 | # ip_netmask: {get_param: ManagementIpSubnet} 165 | 166 | outputs: 167 | OS::stack_id: 168 | description: The OsNetConfigImpl resource. 169 | value: {get_resource: OsNetConfigImpl} 170 | -------------------------------------------------------------------------------- /custom-templates/nic-configs/controller-nics.yaml: -------------------------------------------------------------------------------- 1 | heat_template_version: 2015-04-30 2 | 3 | description: > 4 | Software Config to drive os-net-config to configure VLANs for the 5 | controller role. 6 | 7 | parameters: 8 | ControlPlaneIp: 9 | default: '' 10 | description: IP address/subnet on the ctlplane network 11 | type: string 12 | ExternalIpSubnet: 13 | default: '' 14 | description: IP address/subnet on the external network 15 | type: string 16 | InternalApiIpSubnet: 17 | default: '' 18 | description: IP address/subnet on the internal API network 19 | type: string 20 | StorageIpSubnet: 21 | default: '' 22 | description: IP address/subnet on the storage network 23 | type: string 24 | StorageMgmtIpSubnet: 25 | default: '' 26 | description: IP address/subnet on the storage mgmt network 27 | type: string 28 | TenantIpSubnet: 29 | default: '' 30 | description: IP address/subnet on the tenant network 31 | type: string 32 | ManagementIpSubnet: # Only populated when including environments/network-management.yaml 33 | default: '' 34 | description: IP address/subnet on the management network 35 | type: string 36 | ExternalNetworkVlanID: 37 | default: 10 38 | description: Vlan ID for the external network traffic. 39 | type: number 40 | InternalApiNetworkVlanID: 41 | default: 20 42 | description: Vlan ID for the internal_api network traffic. 43 | type: number 44 | StorageNetworkVlanID: 45 | default: 30 46 | description: Vlan ID for the storage network traffic. 47 | type: number 48 | StorageMgmtNetworkVlanID: 49 | default: 40 50 | description: Vlan ID for the storage mgmt network traffic. 51 | type: number 52 | TenantNetworkVlanID: 53 | default: 50 54 | description: Vlan ID for the tenant network traffic. 55 | type: number 56 | ManagementNetworkVlanID: 57 | default: 60 58 | description: Vlan ID for the management network traffic. 59 | type: number 60 | ExternalInterfaceDefaultRoute: 61 | default: '10.0.0.1' 62 | description: default route for the external network 63 | type: string 64 | ControlPlaneSubnetCidr: # Override this via parameter_defaults 65 | default: '24' 66 | description: The subnet CIDR of the control plane network. 67 | type: string 68 | ControlPlaneDefaultRoute: # Override this via parameter_defaults 69 | description: The default route of the control plane network. 70 | type: string 71 | DnsServers: # Override this via parameter_defaults 72 | default: [] 73 | description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf. 74 | type: comma_delimited_list 75 | EC2MetadataIp: # Override this via parameter_defaults 76 | description: The IP address of the EC2 metadata server. 77 | type: string 78 | 79 | resources: 80 | OsNetConfigImpl: 81 | type: OS::Heat::StructuredConfig 82 | properties: 83 | group: os-apply-config 84 | config: 85 | os_net_config: 86 | network_config: 87 | - 88 | type: interface 89 | name: p2p1 90 | use_dhcp: false 91 | dns_servers: {get_param: DnsServers} 92 | addresses: 93 | - 94 | ip_netmask: 95 | list_join: 96 | - '/' 97 | - - {get_param: ControlPlaneIp} 98 | - {get_param: ControlPlaneSubnetCidr} 99 | routes: 100 | - 101 | ip_netmask: 169.254.169.254/32 102 | next_hop: {get_param: EC2MetadataIp} 103 | - 104 | type: ovs_bridge 105 | # Assuming you want to keep br-ex as external bridge name 106 | name: {get_input: bridge_name} 107 | use_dhcp: false 108 | addresses: 109 | - 110 | ip_netmask: {get_param: ExternalIpSubnet} 111 | routes: 112 | - 113 | ip_netmask: 0.0.0.0/0 114 | next_hop: {get_param: ExternalInterfaceDefaultRoute} 115 | members: 116 | - 117 | type: interface 118 | name: p2p2 119 | # force the MAC address of the bridge to this interface 120 | primary: true 121 | - 122 | # Unused Interface 123 | type: interface 124 | name: em3 125 | use_dhcp: false 126 | defroute: false 127 | - 128 | # Unused Interface 129 | type: interface 130 | name: em4 131 | use_dhcp: false 132 | defroute: false 133 | - 134 | # Unused Interface 135 | type: interface 136 | name: p2p3 137 | use_dhcp: false 138 | defroute: false 139 | - 140 | type: interface 141 | name: p2p4 142 | use_dhcp: false 143 | addresses: 144 | - 145 | ip_netmask: {get_param: InternalApiIpSubnet} 146 | - 147 | type: interface 148 | name: em2 149 | use_dhcp: false 150 | mtu: 9000 151 | - 152 | type: vlan 153 | device: em2 154 | mtu: 9000 155 | use_dhcp: false 156 | vlan_id: {get_param: StorageMgmtNetworkVlanID} 157 | addresses: 158 | - 159 | ip_netmask: {get_param: StorageMgmtIpSubnet} 160 | - 161 | type: vlan 162 | device: em2 163 | mtu: 9000 164 | use_dhcp: false 165 | vlan_id: {get_param: StorageNetworkVlanID} 166 | addresses: 167 | - 168 | ip_netmask: {get_param: StorageIpSubnet} 169 | - 170 | # VLAN for VXLAN tenant networking 171 | type: ovs_bridge 172 | name: br-tenant 173 | mtu: 1500 174 | use_dhcp: false 175 | members: 176 | - 177 | type: interface 178 | name: em1 179 | mtu: 1500 180 | use_dhcp: false 181 | # force the MAC address of the bridge to this interface 182 | primary: true 183 | - 184 | type: vlan 185 | mtu: 1500 186 | vlan_id: {get_param: TenantNetworkVlanID} 187 | addresses: 188 | - 189 | ip_netmask: {get_param: TenantIpSubnet} 190 | # Uncomment when including environments/network-management.yaml 191 | #- 192 | # type: interface 193 | # name: nic7 194 | # use_dhcp: false 195 | # addresses: 196 | # - 197 | # ip_netmask: {get_param: ManagementIpSubnet} 198 | 199 | outputs: 200 | OS::stack_id: 201 | description: The OsNetConfigImpl resource. 202 | value: {get_resource: OsNetConfigImpl} 203 | -------------------------------------------------------------------------------- /custom-templates/custom-roles.yaml.10: -------------------------------------------------------------------------------- 1 | # Valid for Newton/RH-OSP10 ONLY 2 | # Specifies which roles (groups of nodes) will be deployed 3 | # Note this is used as an input to the various *.j2.yaml 4 | # jinja2 templates, so that they are converted into *.yaml 5 | # during the plan creation (via a mistral action/workflow). 6 | # 7 | # The format is a list, with the following format: 8 | # 9 | # * name: (string) mandatory, name of the role, must be unique 10 | # 11 | # CountDefault: (number) optional, default number of nodes, defaults to 0 12 | # sets the default for the {{role.name}}Count parameter in overcloud.yaml 13 | # 14 | # HostnameFormatDefault: (string) optional default format string for hostname 15 | # defaults to '%stackname%-{{role.name.lower()}}-%index%' 16 | # sets the default for {{role.name}}HostnameFormat parameter in overcloud.yaml 17 | # 18 | # ServicesDefault: (list) optional default list of services to be deployed 19 | # on the role, defaults to an empty list. Sets the default for the 20 | # {{role.name}}Services parameter in overcloud.yaml 21 | 22 | - name: Controller 23 | CountDefault: 1 24 | ServicesDefault: 25 | - OS::TripleO::Services::CACerts 26 | - OS::TripleO::Services::CephMon 27 | - OS::TripleO::Services::CephExternal 28 | - OS::TripleO::Services::CephRgw 29 | - OS::TripleO::Services::CinderApi 30 | - OS::TripleO::Services::CinderBackup 31 | - OS::TripleO::Services::CinderScheduler 32 | - OS::TripleO::Services::CinderVolume 33 | - OS::TripleO::Services::Core 34 | - OS::TripleO::Services::Kernel 35 | - OS::TripleO::Services::Keystone 36 | - OS::TripleO::Services::GlanceApi 37 | - OS::TripleO::Services::GlanceRegistry 38 | - OS::TripleO::Services::HeatApi 39 | - OS::TripleO::Services::HeatApiCfn 40 | - OS::TripleO::Services::HeatApiCloudwatch 41 | - OS::TripleO::Services::HeatEngine 42 | - OS::TripleO::Services::MySQL 43 | - OS::TripleO::Services::NeutronDhcpAgent 44 | - OS::TripleO::Services::NeutronL3Agent 45 | - OS::TripleO::Services::NeutronMetadataAgent 46 | - OS::TripleO::Services::NeutronApi 47 | - OS::TripleO::Services::NeutronCorePlugin 48 | - OS::TripleO::Services::NeutronOvsAgent 49 | - OS::TripleO::Services::RabbitMQ 50 | - OS::TripleO::Services::HAproxy 51 | - OS::TripleO::Services::Keepalived 52 | - OS::TripleO::Services::Memcached 53 | - OS::TripleO::Services::Pacemaker 54 | - OS::TripleO::Services::Redis 55 | - OS::TripleO::Services::NovaConductor 56 | - OS::TripleO::Services::MongoDb 57 | - OS::TripleO::Services::NovaApi 58 | - OS::TripleO::Services::NovaMetadata 59 | - OS::TripleO::Services::NovaScheduler 60 | - OS::TripleO::Services::NovaConsoleauth 61 | - OS::TripleO::Services::NovaVncProxy 62 | - OS::TripleO::Services::Ntp 63 | - OS::TripleO::Services::SwiftProxy 64 | - OS::TripleO::Services::SwiftStorage 65 | - OS::TripleO::Services::SwiftRingBuilder 66 | - OS::TripleO::Services::Snmp 67 | - OS::TripleO::Services::Timezone 68 | - OS::TripleO::Services::CeilometerApi 69 | - OS::TripleO::Services::CeilometerCollector 70 | - OS::TripleO::Services::CeilometerExpirer 71 | - OS::TripleO::Services::CeilometerAgentCentral 72 | - OS::TripleO::Services::CeilometerAgentNotification 73 | - OS::TripleO::Services::Horizon 74 | - OS::TripleO::Services::GnocchiApi 75 | - OS::TripleO::Services::GnocchiMetricd 76 | - OS::TripleO::Services::GnocchiStatsd 77 | - OS::TripleO::Services::ManilaApi 78 | - OS::TripleO::Services::ManilaScheduler 79 | - OS::TripleO::Services::ManilaBackendGeneric 80 | - OS::TripleO::Services::ManilaBackendNetapp 81 | - OS::TripleO::Services::ManilaBackendCephFs 82 | - OS::TripleO::Services::ManilaShare 83 | - OS::TripleO::Services::AodhApi 84 | - OS::TripleO::Services::AodhEvaluator 85 | - OS::TripleO::Services::AodhNotifier 86 | - OS::TripleO::Services::AodhListener 87 | - OS::TripleO::Services::SaharaApi 88 | - OS::TripleO::Services::SaharaEngine 89 | - OS::TripleO::Services::IronicApi 90 | - OS::TripleO::Services::IronicConductor 91 | - OS::TripleO::Services::NovaIronic 92 | - OS::TripleO::Services::TripleoPackages 93 | - OS::TripleO::Services::TripleoFirewall 94 | - OS::TripleO::Services::OpenDaylightApi 95 | - OS::TripleO::Services::OpenDaylightOvs 96 | - OS::TripleO::Services::SensuClient 97 | - OS::TripleO::Services::FluentdClient 98 | - OS::TripleO::Services::VipHosts 99 | 100 | - name: Compute 101 | CountDefault: 1 102 | HostnameFormatDefault: '%stackname%-compute-%index%' 103 | ServicesDefault: 104 | - OS::TripleO::Services::CACerts 105 | - OS::TripleO::Services::CephClient 106 | - OS::TripleO::Services::CephExternal 107 | - OS::TripleO::Services::Timezone 108 | - OS::TripleO::Services::Ntp 109 | - OS::TripleO::Services::Snmp 110 | - OS::TripleO::Services::NovaCompute 111 | - OS::TripleO::Services::NovaLibvirt 112 | - OS::TripleO::Services::Kernel 113 | - OS::TripleO::Services::ComputeNeutronCorePlugin 114 | - OS::TripleO::Services::ComputeNeutronOvsAgent 115 | - OS::TripleO::Services::ComputeCeilometerAgent 116 | - OS::TripleO::Services::ComputeNeutronL3Agent 117 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 118 | - OS::TripleO::Services::TripleoPackages 119 | - OS::TripleO::Services::TripleoFirewall 120 | - OS::TripleO::Services::NeutronSriovAgent 121 | - OS::TripleO::Services::OpenDaylightOvs 122 | - OS::TripleO::Services::SensuClient 123 | - OS::TripleO::Services::FluentdClient 124 | - OS::TripleO::Services::VipHosts 125 | 126 | - name: BlockStorage 127 | ServicesDefault: 128 | - OS::TripleO::Services::CACerts 129 | - OS::TripleO::Services::BlockStorageCinderVolume 130 | - OS::TripleO::Services::Kernel 131 | - OS::TripleO::Services::Ntp 132 | - OS::TripleO::Services::Timezone 133 | - OS::TripleO::Services::Snmp 134 | - OS::TripleO::Services::TripleoPackages 135 | - OS::TripleO::Services::TripleoFirewall 136 | - OS::TripleO::Services::SensuClient 137 | - OS::TripleO::Services::FluentdClient 138 | - OS::TripleO::Services::VipHosts 139 | 140 | - name: ObjectStorage 141 | ServicesDefault: 142 | - OS::TripleO::Services::CACerts 143 | - OS::TripleO::Services::Kernel 144 | - OS::TripleO::Services::Ntp 145 | - OS::TripleO::Services::SwiftStorage 146 | - OS::TripleO::Services::SwiftRingBuilder 147 | - OS::TripleO::Services::Snmp 148 | - OS::TripleO::Services::Timezone 149 | - OS::TripleO::Services::TripleoPackages 150 | - OS::TripleO::Services::TripleoFirewall 151 | - OS::TripleO::Services::SensuClient 152 | - OS::TripleO::Services::FluentdClient 153 | - OS::TripleO::Services::VipHosts 154 | 155 | - name: CephStorage 156 | ServicesDefault: 157 | - OS::TripleO::Services::CACerts 158 | - OS::TripleO::Services::CephOSD 159 | - OS::TripleO::Services::Kernel 160 | - OS::TripleO::Services::Ntp 161 | - OS::TripleO::Services::Snmp 162 | - OS::TripleO::Services::Timezone 163 | - OS::TripleO::Services::TripleoPackages 164 | - OS::TripleO::Services::TripleoFirewall 165 | - OS::TripleO::Services::SensuClient 166 | - OS::TripleO::Services::FluentdClient 167 | - OS::TripleO::Services::VipHosts 168 | 169 | - name: OsdCompute 170 | CountDefault: 0 171 | HostnameFormatDefault: '%stackname%-osd-compute-%index%' 172 | ServicesDefault: 173 | - OS::TripleO::Services::CephOSD 174 | - OS::TripleO::Services::CACerts 175 | - OS::TripleO::Services::CephClient 176 | - OS::TripleO::Services::CephExternal 177 | - OS::TripleO::Services::Timezone 178 | - OS::TripleO::Services::Ntp 179 | - OS::TripleO::Services::Snmp 180 | - OS::TripleO::Services::NovaCompute 181 | - OS::TripleO::Services::NovaLibvirt 182 | - OS::TripleO::Services::Kernel 183 | - OS::TripleO::Services::ComputeNeutronCorePlugin 184 | - OS::TripleO::Services::ComputeNeutronOvsAgent 185 | - OS::TripleO::Services::ComputeCeilometerAgent 186 | - OS::TripleO::Services::ComputeNeutronL3Agent 187 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 188 | - OS::TripleO::Services::TripleoPackages 189 | - OS::TripleO::Services::TripleoFirewall 190 | - OS::TripleO::Services::NeutronSriovAgent 191 | - OS::TripleO::Services::OpenDaylightOvs 192 | - OS::TripleO::Services::SensuClient 193 | - OS::TripleO::Services::FluentdClient 194 | - OS::TripleO::Services::VipHosts 195 | 196 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/README.md: -------------------------------------------------------------------------------- 1 | # HCI with Mixed Nodes 2 | 3 | This example shows how to do an HCI deployment with Compute or OSD 4 | nodes that are not homogeneous. Though the nodes are still physically 5 | homogenus, they will be configured differently as follows: 6 | 7 | * r730xd_u29: Compute 8 | * r730xd_u31: Osd10 9 | * r730xd_u33: OsdComputeTwelve 10 | * r730xd_u35: OsdComputeSix 11 | 12 | In the above example, the number after each name, e.g. twelve or six, 13 | represents the amount of OSDs per node. The first two will use the 14 | default roles of Compute and CephStorage. The last two will be custom 15 | roles named as above. 16 | 17 | Only the OsdComputeTwelve node is using all of its physical resources as a 18 | fully converged node. OsdComputeSix uses half of its actual HDD and SSD 19 | capacity in order to show how to handle nodes that are smaller but 20 | still have resources to contribute to the OpenStack cloud. The same 21 | idea applies to Compute, which won't use any of its HDDs or SSDs, 22 | aside from the RAID1 pair to support the operating system. Similarly, 23 | Osd10 has capacity to offer compute services but will only offer Ceph 24 | OSD services with less disks than it actually has. 25 | 26 | ## Assignment in Ironic 27 | 28 | Each node is assigned to the roles above using the ironic-assign.sh 29 | script as follows: 30 | 31 | ``` 32 | ./ironic-assign.sh r730xd_u29 compute 33 | ./ironic-assign.sh r730xd_u31 ceph-storage 34 | ./ironic-assign.sh r730xd_u33 osd-compute-twelve 35 | ./ironic-assign.sh r730xd_u35 osd-compute-six 36 | ``` 37 | 38 | After running the above, a variation of running `openstack baremetal 39 | node show $uuid | grep properties` on each node looks like the 40 | following: 41 | 42 | ``` 43 | {u'cpu_arch': u'x86_64', u'root_device': {u'wwn': u'0x614187704e9ea700'}, u'cpus': u'56', u'capabilities': u'node:compute-0,boot_option:local', u'memory_mb': u'262144', u'local_gb': 277} 44 | {u'cpu_arch': u'x86_64', u'root_device': {u'wwn': u'0x614187704e9ea500'}, u'cpus': u'56', u'capabilities': u'node:ceph-storage-0,boot_option:local', u'memory_mb': u'262144', u'local_gb': 277} 45 | {u'cpu_arch': u'x86_64', u'root_device': {u'wwn': u'0x614187704e9ea900'}, u'cpus': u'56', u'capabilities': u'node:osd-compute-twelve-0,boot_option:local', u'memory_mb': u'262144', u'local_gb': 277} 46 | {u'cpu_arch': u'x86_64', u'root_device': {u'wwn': u'0x614187704e9c7700'}, u'cpus': u'56', u'capabilities': u'node:osd-compute-six-0,boot_option:local', u'memory_mb': u'262144', u'local_gb': 277} 47 | ``` 48 | 49 | ## Custom Templates for Mixed Deployment 50 | 51 | The yaml files custom-templates-mixed contains the following files 52 | which are variations custom-templates: 53 | 54 | * custom-roles-mixed.yaml 55 | * layout-mixed.yaml 56 | * network-mixed.yaml 57 | * ceph-mixed.yaml 58 | * compute-mixed.yaml 59 | 60 | For example, custom-roles-mixed.yaml is a variation of 61 | custom-roles.yaml which had an additional and identical copy of the 62 | OsdCompute role added to the bottom of the file. The first OsdCompute 63 | then had a 12 appended to its name and its HostnameFormatDefault. The 64 | second OsdCompute had the same change but 6 was used instead 65 | of 12. Though these two custom roles are very similar, having two 66 | definitions will be useful when assigning different lists of disks 67 | when ceph-mixed.yaml is created and the same applies to the other 68 | files listed above. 69 | 70 | ## Compute Tuning 71 | 72 | compute-mixed.yaml is a variation of compute.yaml. It has a different 73 | reserved host memory or CPU allocation ratio per compute node. The 74 | standard compute node, which does not run OSD services, uses the 75 | recommended default for reserved host memory of 2048 MB (see RH BZ 76 | 1282644). It also uses the CPU allocation ratio deafult of 16. 77 | 78 | The compute nodes which run OSD services reserve differing amounts of 79 | memory or provide differing CPU allocation ratios to the Nova 80 | scheduler since they have have to reserve memory and CPU for the OSD 81 | services that they run. However, they reserve differing amounts based 82 | on the number of OSDs. For example, OsdComputeTwelve needs to reserve more 83 | than OsdComputeSix because it has more OSDs which need those resources. 84 | 85 | ``` 86 | ComputeExtraConfig: 87 | nova::compute::reserved_host_memory: 2048 88 | nova::cpu_allocation_ratio: 16 89 | OsdComputeTwelveExtraConfig: 90 | nova::compute::reserved_host_memory: 181000 91 | nova::cpu_allocation_ratio: 8.2 92 | OsdComputeSixExtraConfig: 93 | nova::compute::reserved_host_memory: 19000 94 | nova::cpu_allocation_ratio: 8.9 95 | ``` 96 | 97 | The 19000 and 8.9 MB above for OsdComputeSix was reached using the 98 | nova_mem_cpu_calc.py as follows: 99 | 100 | ``` 101 | [stack@hci-director scripts]$ ./nova_mem_cpu_calc.py 256 56 6 2 0.1 102 | Inputs: 103 | - Total host RAM in GB: 256 104 | - Total host cores: 56 105 | - Ceph OSDs per host: 6 106 | - Average guest memory size in GB: 2 107 | - Average guest CPU utilization: 10% 108 | 109 | Results: 110 | - number of guests allowed based on memory = 95 111 | - number of guest vCPUs allowed = 500 112 | - nova.conf reserved_host_memory = 190000 MB 113 | - nova.conf cpu_allocation_ratio = 8.928571 114 | 115 | Compare "guest vCPUs allowed" to "guests allowed based on memory" for actual guest count 116 | [stack@hci-director scripts]$ 117 | ``` 118 | 119 | ## Deployment 120 | 121 | The mixed node HCI OpenStack cloud is deloyed with deploy-mixed.sh. 122 | 123 | ## Observations 124 | 125 | The deploy-mixed.sh script produces a working overcloud: 126 | 127 | ``` 128 | [stack@hci-director ~]$ openstack server list 129 | +-------------------------+-------------------------+--------+-----------------------+----------------+ 130 | | ID | Name | Status | Networks | Image Name | 131 | +-------------------------+-------------------------+--------+-----------------------+----------------+ 132 | | a3ac512a-430a-4f1e- | overcloud-compute-0 | ACTIVE | ctlplane=192.168.1.23 | overcloud-full | 133 | | a5f0-da51cbb597a3 | | | | | 134 | | 32397cfa-5bd4-4336-9fb9 | overcloud-cephstorage-0 | ACTIVE | ctlplane=192.168.1.25 | overcloud-full | 135 | | -2af8cae721ee | | | | | 136 | | 205cd598-8ea8-4dbb- | overcloud-osd-compute- | ACTIVE | ctlplane=192.168.1.27 | overcloud-full | 137 | | a5ca-5e19aaf5589c | six-0 | | | | 138 | | 59d6ec10-2eb4-4d12-b8f2 | overcloud-controller-2 | ACTIVE | ctlplane=192.168.1.29 | overcloud-full | 139 | | -badd5d063287 | | | | | 140 | | 594277df-0336-4942-a909 | overcloud-controller-1 | ACTIVE | ctlplane=192.168.1.32 | overcloud-full | 141 | | -dce338f68df8 | | | | | 142 | | cf309150-aa82-4ae2 | overcloud-osd-compute- | ACTIVE | ctlplane=192.168.1.26 | overcloud-full | 143 | | -a6ba-7f503bcaee8e | twelve-0 | | | | 144 | | 80512072-d9bd-4d4d- | overcloud-controller-0 | ACTIVE | ctlplane=192.168.1.21 | overcloud-full | 145 | | addd-011124c536ed | | | | | 146 | +-------------------------+-------------------------+--------+-----------------------+----------------+ 147 | [stack@hci-director ~]$ 148 | ``` 149 | 150 | The compute node tunings per role are reflected in the _nova.conf_ 151 | files of each compute node. If Ansible is installed, only for the 152 | purposes of inspecting the nodes with ad hoc scripts, then these 153 | Nova compute settings may be observed as follows: 154 | 155 | ``` 156 | [stack@hci-director ~]$ ansible computes -b -m shell -a "hostname; egrep 'cpu_allocation_ratio|reserved_host_memory' /etc/nova/nova.conf" 157 | 192.168.1.23 | SUCCESS | rc=0 >> 158 | overcloud-compute-0.localdomain 159 | reserved_host_memory_mb=2048 160 | 161 | 192.168.1.27 | SUCCESS | rc=0 >> 162 | overcloud-osd-compute-six-0.localdomain 163 | reserved_host_memory_mb=19000 164 | cpu_allocation_ratio=8.9 165 | 166 | 192.168.1.26 | SUCCESS | rc=0 >> 167 | overcloud-osd-compute-twelve-0.localdomain 168 | reserved_host_memory_mb=181000 169 | cpu_allocation_ratio=8.2 170 | 171 | [stack@hci-director ~]$ 172 | ``` 173 | 174 | -------------------------------------------------------------------------------- /other-scenarios/mixed-nodes/custom-roles-mixed.yaml: -------------------------------------------------------------------------------- 1 | # Specifies which roles (groups of nodes) will be deployed 2 | # Note this is used as an input to the various *.j2.yaml 3 | # jinja2 templates, so that they are converted into *.yaml 4 | # during the plan creation (via a mistral action/workflow). 5 | # 6 | # The format is a list, with the following format: 7 | # 8 | # * name: (string) mandatory, name of the role, must be unique 9 | # 10 | # CountDefault: (number) optional, default number of nodes, defaults to 0 11 | # sets the default for the {{role.name}}Count parameter in overcloud.yaml 12 | # 13 | # HostnameFormatDefault: (string) optional default format string for hostname 14 | # defaults to '%stackname%-{{role.name.lower()}}-%index%' 15 | # sets the default for {{role.name}}HostnameFormat parameter in overcloud.yaml 16 | # 17 | # ServicesDefault: (list) optional default list of services to be deployed 18 | # on the role, defaults to an empty list. Sets the default for the 19 | # {{role.name}}Services parameter in overcloud.yaml 20 | 21 | - name: Controller 22 | CountDefault: 1 23 | ServicesDefault: 24 | - OS::TripleO::Services::CACerts 25 | - OS::TripleO::Services::CephMon 26 | - OS::TripleO::Services::CephExternal 27 | - OS::TripleO::Services::CephRgw 28 | - OS::TripleO::Services::CinderApi 29 | - OS::TripleO::Services::CinderBackup 30 | - OS::TripleO::Services::CinderScheduler 31 | - OS::TripleO::Services::CinderVolume 32 | - OS::TripleO::Services::Core 33 | - OS::TripleO::Services::Kernel 34 | - OS::TripleO::Services::Keystone 35 | - OS::TripleO::Services::GlanceApi 36 | - OS::TripleO::Services::GlanceRegistry 37 | - OS::TripleO::Services::HeatApi 38 | - OS::TripleO::Services::HeatApiCfn 39 | - OS::TripleO::Services::HeatApiCloudwatch 40 | - OS::TripleO::Services::HeatEngine 41 | - OS::TripleO::Services::MySQL 42 | - OS::TripleO::Services::NeutronDhcpAgent 43 | - OS::TripleO::Services::NeutronL3Agent 44 | - OS::TripleO::Services::NeutronMetadataAgent 45 | - OS::TripleO::Services::NeutronApi 46 | - OS::TripleO::Services::NeutronCorePlugin 47 | - OS::TripleO::Services::NeutronOvsAgent 48 | - OS::TripleO::Services::RabbitMQ 49 | - OS::TripleO::Services::HAproxy 50 | - OS::TripleO::Services::Keepalived 51 | - OS::TripleO::Services::Memcached 52 | - OS::TripleO::Services::Pacemaker 53 | - OS::TripleO::Services::Redis 54 | - OS::TripleO::Services::NovaConductor 55 | - OS::TripleO::Services::MongoDb 56 | - OS::TripleO::Services::NovaApi 57 | - OS::TripleO::Services::NovaMetadata 58 | - OS::TripleO::Services::NovaScheduler 59 | - OS::TripleO::Services::NovaConsoleauth 60 | - OS::TripleO::Services::NovaVncProxy 61 | - OS::TripleO::Services::Ntp 62 | - OS::TripleO::Services::SwiftProxy 63 | - OS::TripleO::Services::SwiftStorage 64 | - OS::TripleO::Services::SwiftRingBuilder 65 | - OS::TripleO::Services::Snmp 66 | - OS::TripleO::Services::Timezone 67 | - OS::TripleO::Services::CeilometerApi 68 | - OS::TripleO::Services::CeilometerCollector 69 | - OS::TripleO::Services::CeilometerExpirer 70 | - OS::TripleO::Services::CeilometerAgentCentral 71 | - OS::TripleO::Services::CeilometerAgentNotification 72 | - OS::TripleO::Services::Horizon 73 | - OS::TripleO::Services::GnocchiApi 74 | - OS::TripleO::Services::GnocchiMetricd 75 | - OS::TripleO::Services::GnocchiStatsd 76 | - OS::TripleO::Services::ManilaApi 77 | - OS::TripleO::Services::ManilaScheduler 78 | - OS::TripleO::Services::ManilaBackendGeneric 79 | - OS::TripleO::Services::ManilaBackendNetapp 80 | - OS::TripleO::Services::ManilaBackendCephFs 81 | - OS::TripleO::Services::ManilaShare 82 | - OS::TripleO::Services::AodhApi 83 | - OS::TripleO::Services::AodhEvaluator 84 | - OS::TripleO::Services::AodhNotifier 85 | - OS::TripleO::Services::AodhListener 86 | - OS::TripleO::Services::SaharaApi 87 | - OS::TripleO::Services::SaharaEngine 88 | - OS::TripleO::Services::IronicApi 89 | - OS::TripleO::Services::IronicConductor 90 | - OS::TripleO::Services::NovaIronic 91 | - OS::TripleO::Services::TripleoPackages 92 | - OS::TripleO::Services::TripleoFirewall 93 | - OS::TripleO::Services::OpenDaylightApi 94 | - OS::TripleO::Services::OpenDaylightOvs 95 | - OS::TripleO::Services::SensuClient 96 | - OS::TripleO::Services::FluentdClient 97 | - OS::TripleO::Services::VipHosts 98 | 99 | - name: Compute 100 | CountDefault: 1 101 | HostnameFormatDefault: '%stackname%-compute-%index%' 102 | ServicesDefault: 103 | - OS::TripleO::Services::CACerts 104 | - OS::TripleO::Services::CephClient 105 | - OS::TripleO::Services::CephExternal 106 | - OS::TripleO::Services::Timezone 107 | - OS::TripleO::Services::Ntp 108 | - OS::TripleO::Services::Snmp 109 | - OS::TripleO::Services::NovaCompute 110 | - OS::TripleO::Services::NovaLibvirt 111 | - OS::TripleO::Services::Kernel 112 | - OS::TripleO::Services::ComputeNeutronCorePlugin 113 | - OS::TripleO::Services::ComputeNeutronOvsAgent 114 | - OS::TripleO::Services::ComputeCeilometerAgent 115 | - OS::TripleO::Services::ComputeNeutronL3Agent 116 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 117 | - OS::TripleO::Services::TripleoPackages 118 | - OS::TripleO::Services::TripleoFirewall 119 | - OS::TripleO::Services::NeutronSriovAgent 120 | - OS::TripleO::Services::OpenDaylightOvs 121 | - OS::TripleO::Services::SensuClient 122 | - OS::TripleO::Services::FluentdClient 123 | - OS::TripleO::Services::VipHosts 124 | 125 | - name: BlockStorage 126 | ServicesDefault: 127 | - OS::TripleO::Services::CACerts 128 | - OS::TripleO::Services::BlockStorageCinderVolume 129 | - OS::TripleO::Services::Kernel 130 | - OS::TripleO::Services::Ntp 131 | - OS::TripleO::Services::Timezone 132 | - OS::TripleO::Services::Snmp 133 | - OS::TripleO::Services::TripleoPackages 134 | - OS::TripleO::Services::TripleoFirewall 135 | - OS::TripleO::Services::SensuClient 136 | - OS::TripleO::Services::FluentdClient 137 | - OS::TripleO::Services::VipHosts 138 | 139 | - name: ObjectStorage 140 | ServicesDefault: 141 | - OS::TripleO::Services::CACerts 142 | - OS::TripleO::Services::Kernel 143 | - OS::TripleO::Services::Ntp 144 | - OS::TripleO::Services::SwiftStorage 145 | - OS::TripleO::Services::SwiftRingBuilder 146 | - OS::TripleO::Services::Snmp 147 | - OS::TripleO::Services::Timezone 148 | - OS::TripleO::Services::TripleoPackages 149 | - OS::TripleO::Services::TripleoFirewall 150 | - OS::TripleO::Services::SensuClient 151 | - OS::TripleO::Services::FluentdClient 152 | - OS::TripleO::Services::VipHosts 153 | 154 | - name: CephStorage 155 | ServicesDefault: 156 | - OS::TripleO::Services::CACerts 157 | - OS::TripleO::Services::CephOSD 158 | - OS::TripleO::Services::Kernel 159 | - OS::TripleO::Services::Ntp 160 | - OS::TripleO::Services::Snmp 161 | - OS::TripleO::Services::Timezone 162 | - OS::TripleO::Services::TripleoPackages 163 | - OS::TripleO::Services::TripleoFirewall 164 | - OS::TripleO::Services::SensuClient 165 | - OS::TripleO::Services::FluentdClient 166 | - OS::TripleO::Services::VipHosts 167 | 168 | - name: OsdComputeTwelve 169 | CountDefault: 0 170 | HostnameFormatDefault: '%stackname%-osd-compute-twelve-%index%' 171 | ServicesDefault: 172 | - OS::TripleO::Services::CephOSD 173 | - OS::TripleO::Services::CACerts 174 | - OS::TripleO::Services::CephClient 175 | - OS::TripleO::Services::CephExternal 176 | - OS::TripleO::Services::Timezone 177 | - OS::TripleO::Services::Ntp 178 | - OS::TripleO::Services::Snmp 179 | - OS::TripleO::Services::NovaCompute 180 | - OS::TripleO::Services::NovaLibvirt 181 | - OS::TripleO::Services::Kernel 182 | - OS::TripleO::Services::ComputeNeutronCorePlugin 183 | - OS::TripleO::Services::ComputeNeutronOvsAgent 184 | - OS::TripleO::Services::ComputeCeilometerAgent 185 | - OS::TripleO::Services::ComputeNeutronL3Agent 186 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 187 | - OS::TripleO::Services::TripleoPackages 188 | - OS::TripleO::Services::TripleoFirewall 189 | - OS::TripleO::Services::NeutronSriovAgent 190 | - OS::TripleO::Services::OpenDaylightOvs 191 | - OS::TripleO::Services::SensuClient 192 | - OS::TripleO::Services::FluentdClient 193 | - OS::TripleO::Services::VipHosts 194 | 195 | - name: OsdComputeSix 196 | CountDefault: 0 197 | HostnameFormatDefault: '%stackname%-osd-compute-six-%index%' 198 | ServicesDefault: 199 | - OS::TripleO::Services::CephOSD 200 | - OS::TripleO::Services::CACerts 201 | - OS::TripleO::Services::CephClient 202 | - OS::TripleO::Services::CephExternal 203 | - OS::TripleO::Services::Timezone 204 | - OS::TripleO::Services::Ntp 205 | - OS::TripleO::Services::Snmp 206 | - OS::TripleO::Services::NovaCompute 207 | - OS::TripleO::Services::NovaLibvirt 208 | - OS::TripleO::Services::Kernel 209 | - OS::TripleO::Services::ComputeNeutronCorePlugin 210 | - OS::TripleO::Services::ComputeNeutronOvsAgent 211 | - OS::TripleO::Services::ComputeCeilometerAgent 212 | - OS::TripleO::Services::ComputeNeutronL3Agent 213 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 214 | - OS::TripleO::Services::TripleoPackages 215 | - OS::TripleO::Services::TripleoFirewall 216 | - OS::TripleO::Services::NeutronSriovAgent 217 | - OS::TripleO::Services::OpenDaylightOvs 218 | - OS::TripleO::Services::SensuClient 219 | - OS::TripleO::Services::FluentdClient 220 | - OS::TripleO::Services::VipHosts 221 | 222 | -------------------------------------------------------------------------------- /custom-templates/custom-roles.yaml.11: -------------------------------------------------------------------------------- 1 | # Valid for Mitaka/RH-OSP11 ONLY 2 | # Specifies which roles (groups of nodes) will be deployed 3 | # Note this is used as an input to the various *.j2.yaml 4 | # jinja2 templates, so that they are converted into *.yaml 5 | # during the plan creation (via a mistral action/workflow). 6 | # 7 | # The format is a list, with the following format: 8 | # 9 | # * name: (string) mandatory, name of the role, must be unique 10 | # 11 | # CountDefault: (number) optional, default number of nodes, defaults to 0 12 | # sets the default for the {{role.name}}Count parameter in overcloud.yaml 13 | # 14 | # HostnameFormatDefault: (string) optional default format string for hostname 15 | # defaults to '%stackname%-{{role.name.lower()}}-%index%' 16 | # sets the default for {{role.name}}HostnameFormat parameter in overcloud.yaml 17 | # 18 | # disable_constraints: (boolean) optional, whether to disable Nova and Glance 19 | # constraints for each role specified in the templates. 20 | # 21 | # disable_upgrade_deployment: (boolean) optional, whether to run the 22 | # ansible upgrade steps for all services that are deployed on the role. If set 23 | # to True, the operator will drive the upgrade for this role's nodes. 24 | # 25 | # upgrade_batch_size: (number): batch size for upgrades where tasks are 26 | # specified by services to run in batches vs all nodes at once. 27 | # This defaults to 1, but larger batches may be specified here. 28 | # 29 | # ServicesDefault: (list) optional default list of services to be deployed 30 | # on the role, defaults to an empty list. Sets the default for the 31 | # {{role.name}}Services parameter in overcloud.yaml 32 | 33 | - name: Controller # the 'primary' role goes first 34 | CountDefault: 1 35 | ServicesDefault: 36 | - OS::TripleO::Services::CACerts 37 | - OS::TripleO::Services::CephMds 38 | - OS::TripleO::Services::CephMon 39 | - OS::TripleO::Services::CephExternal 40 | - OS::TripleO::Services::CephRbdMirror 41 | - OS::TripleO::Services::CephRgw 42 | - OS::TripleO::Services::CinderApi 43 | - OS::TripleO::Services::CinderBackup 44 | - OS::TripleO::Services::CinderScheduler 45 | - OS::TripleO::Services::CinderVolume 46 | - OS::TripleO::Services::Congress 47 | - OS::TripleO::Services::Kernel 48 | - OS::TripleO::Services::Keystone 49 | - OS::TripleO::Services::GlanceApi 50 | - OS::TripleO::Services::HeatApi 51 | - OS::TripleO::Services::HeatApiCfn 52 | - OS::TripleO::Services::HeatApiCloudwatch 53 | - OS::TripleO::Services::HeatEngine 54 | - OS::TripleO::Services::MySQL 55 | - OS::TripleO::Services::MySQLClient 56 | - OS::TripleO::Services::NeutronDhcpAgent 57 | - OS::TripleO::Services::NeutronL3Agent 58 | - OS::TripleO::Services::NeutronMetadataAgent 59 | - OS::TripleO::Services::NeutronApi 60 | - OS::TripleO::Services::NeutronCorePlugin 61 | - OS::TripleO::Services::NeutronOvsAgent 62 | - OS::TripleO::Services::RabbitMQ 63 | - OS::TripleO::Services::HAproxy 64 | - OS::TripleO::Services::Keepalived 65 | - OS::TripleO::Services::Memcached 66 | - OS::TripleO::Services::Pacemaker 67 | - OS::TripleO::Services::Redis 68 | - OS::TripleO::Services::NovaConductor 69 | - OS::TripleO::Services::MongoDb 70 | - OS::TripleO::Services::NovaApi 71 | - OS::TripleO::Services::NovaPlacement 72 | - OS::TripleO::Services::NovaMetadata 73 | - OS::TripleO::Services::NovaScheduler 74 | - OS::TripleO::Services::NovaConsoleauth 75 | - OS::TripleO::Services::NovaVncProxy 76 | - OS::TripleO::Services::Ec2Api 77 | - OS::TripleO::Services::Ntp 78 | - OS::TripleO::Services::SwiftProxy 79 | - OS::TripleO::Services::SwiftStorage 80 | - OS::TripleO::Services::SwiftRingBuilder 81 | - OS::TripleO::Services::Snmp 82 | - OS::TripleO::Services::Sshd 83 | - OS::TripleO::Services::Timezone 84 | - OS::TripleO::Services::CeilometerApi 85 | - OS::TripleO::Services::CeilometerCollector 86 | - OS::TripleO::Services::CeilometerExpirer 87 | - OS::TripleO::Services::CeilometerAgentCentral 88 | - OS::TripleO::Services::CeilometerAgentNotification 89 | - OS::TripleO::Services::Horizon 90 | - OS::TripleO::Services::GnocchiApi 91 | - OS::TripleO::Services::GnocchiMetricd 92 | - OS::TripleO::Services::GnocchiStatsd 93 | - OS::TripleO::Services::ManilaApi 94 | - OS::TripleO::Services::ManilaScheduler 95 | - OS::TripleO::Services::ManilaBackendGeneric 96 | - OS::TripleO::Services::ManilaBackendNetapp 97 | - OS::TripleO::Services::ManilaBackendCephFs 98 | - OS::TripleO::Services::ManilaShare 99 | - OS::TripleO::Services::AodhApi 100 | - OS::TripleO::Services::AodhEvaluator 101 | - OS::TripleO::Services::AodhNotifier 102 | - OS::TripleO::Services::AodhListener 103 | - OS::TripleO::Services::SaharaApi 104 | - OS::TripleO::Services::SaharaEngine 105 | - OS::TripleO::Services::IronicApi 106 | - OS::TripleO::Services::IronicConductor 107 | - OS::TripleO::Services::NovaIronic 108 | - OS::TripleO::Services::TripleoPackages 109 | - OS::TripleO::Services::TripleoFirewall 110 | - OS::TripleO::Services::OpenDaylightApi 111 | - OS::TripleO::Services::OpenDaylightOvs 112 | - OS::TripleO::Services::SensuClient 113 | - OS::TripleO::Services::FluentdClient 114 | - OS::TripleO::Services::Collectd 115 | - OS::TripleO::Services::BarbicanApi 116 | - OS::TripleO::Services::PankoApi 117 | - OS::TripleO::Services::Tacker 118 | - OS::TripleO::Services::Zaqar 119 | - OS::TripleO::Services::OVNDBs 120 | - OS::TripleO::Services::NeutronML2FujitsuCfab 121 | - OS::TripleO::Services::NeutronML2FujitsuFossw 122 | - OS::TripleO::Services::CinderHPELeftHandISCSI 123 | - OS::TripleO::Services::Etcd 124 | - OS::TripleO::Services::AuditD 125 | - OS::TripleO::Services::OctaviaApi 126 | - OS::TripleO::Services::OctaviaHealthManager 127 | - OS::TripleO::Services::OctaviaHousekeeping 128 | - OS::TripleO::Services::OctaviaWorker 129 | 130 | - name: Compute 131 | CountDefault: 1 132 | disable_upgrade_deployment: True 133 | ServicesDefault: 134 | - OS::TripleO::Services::CACerts 135 | - OS::TripleO::Services::CephClient 136 | - OS::TripleO::Services::CephExternal 137 | - OS::TripleO::Services::Timezone 138 | - OS::TripleO::Services::Ntp 139 | - OS::TripleO::Services::Snmp 140 | - OS::TripleO::Services::Sshd 141 | - OS::TripleO::Services::NovaCompute 142 | - OS::TripleO::Services::NovaLibvirt 143 | - OS::TripleO::Services::Kernel 144 | - OS::TripleO::Services::ComputeNeutronCorePlugin 145 | - OS::TripleO::Services::ComputeNeutronOvsAgent 146 | - OS::TripleO::Services::ComputeCeilometerAgent 147 | - OS::TripleO::Services::ComputeNeutronL3Agent 148 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 149 | - OS::TripleO::Services::TripleoPackages 150 | - OS::TripleO::Services::TripleoFirewall 151 | - OS::TripleO::Services::NeutronSriovAgent 152 | - OS::TripleO::Services::OpenDaylightOvs 153 | - OS::TripleO::Services::SensuClient 154 | - OS::TripleO::Services::FluentdClient 155 | - OS::TripleO::Services::AuditD 156 | - OS::TripleO::Services::Collectd 157 | 158 | - name: BlockStorage 159 | ServicesDefault: 160 | - OS::TripleO::Services::CACerts 161 | - OS::TripleO::Services::BlockStorageCinderVolume 162 | - OS::TripleO::Services::Kernel 163 | - OS::TripleO::Services::Ntp 164 | - OS::TripleO::Services::Timezone 165 | - OS::TripleO::Services::Snmp 166 | - OS::TripleO::Services::Sshd 167 | - OS::TripleO::Services::TripleoPackages 168 | - OS::TripleO::Services::TripleoFirewall 169 | - OS::TripleO::Services::SensuClient 170 | - OS::TripleO::Services::FluentdClient 171 | - OS::TripleO::Services::AuditD 172 | - OS::TripleO::Services::Collectd 173 | 174 | - name: ObjectStorage 175 | disable_upgrade_deployment: True 176 | ServicesDefault: 177 | - OS::TripleO::Services::CACerts 178 | - OS::TripleO::Services::Kernel 179 | - OS::TripleO::Services::Ntp 180 | - OS::TripleO::Services::SwiftStorage 181 | - OS::TripleO::Services::SwiftRingBuilder 182 | - OS::TripleO::Services::Snmp 183 | - OS::TripleO::Services::Sshd 184 | - OS::TripleO::Services::Timezone 185 | - OS::TripleO::Services::TripleoPackages 186 | - OS::TripleO::Services::TripleoFirewall 187 | - OS::TripleO::Services::SensuClient 188 | - OS::TripleO::Services::FluentdClient 189 | - OS::TripleO::Services::AuditD 190 | - OS::TripleO::Services::Collectd 191 | 192 | - name: CephStorage 193 | ServicesDefault: 194 | - OS::TripleO::Services::CACerts 195 | - OS::TripleO::Services::CephOSD 196 | - OS::TripleO::Services::Kernel 197 | - OS::TripleO::Services::Ntp 198 | - OS::TripleO::Services::Snmp 199 | - OS::TripleO::Services::Sshd 200 | - OS::TripleO::Services::Timezone 201 | - OS::TripleO::Services::TripleoPackages 202 | - OS::TripleO::Services::TripleoFirewall 203 | - OS::TripleO::Services::SensuClient 204 | - OS::TripleO::Services::FluentdClient 205 | - OS::TripleO::Services::AuditD 206 | - OS::TripleO::Services::Collectd 207 | 208 | - name: OsdCompute 209 | CountDefault: 0 210 | HostnameFormatDefault: '%stackname%-osd-compute-%index%' 211 | disable_upgrade_deployment: True 212 | ServicesDefault: 213 | - OS::TripleO::Services::CephOSD 214 | - OS::TripleO::Services::CACerts 215 | - OS::TripleO::Services::CephClient 216 | - OS::TripleO::Services::CephExternal 217 | - OS::TripleO::Services::Timezone 218 | - OS::TripleO::Services::Ntp 219 | - OS::TripleO::Services::Snmp 220 | - OS::TripleO::Services::Sshd 221 | - OS::TripleO::Services::NovaCompute 222 | - OS::TripleO::Services::NovaLibvirt 223 | - OS::TripleO::Services::Kernel 224 | - OS::TripleO::Services::ComputeNeutronCorePlugin 225 | - OS::TripleO::Services::ComputeNeutronOvsAgent 226 | - OS::TripleO::Services::ComputeCeilometerAgent 227 | - OS::TripleO::Services::ComputeNeutronL3Agent 228 | - OS::TripleO::Services::ComputeNeutronMetadataAgent 229 | - OS::TripleO::Services::TripleoPackages 230 | - OS::TripleO::Services::TripleoFirewall 231 | - OS::TripleO::Services::NeutronSriovAgent 232 | - OS::TripleO::Services::OpenDaylightOvs 233 | - OS::TripleO::Services::SensuClient 234 | - OS::TripleO::Services::FluentdClient 235 | - OS::TripleO::Services::AuditD 236 | - OS::TripleO::Services::Collectd 237 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------