diff options
-rw-r--r-- | all-nodes-validation.yaml | 27 | ||||
-rw-r--r-- | overcloud-resource-registry-puppet.yaml | 3 | ||||
-rw-r--r-- | overcloud-resource-registry.yaml | 3 | ||||
-rw-r--r-- | overcloud-without-mergepy.yaml | 48 | ||||
-rw-r--r-- | validation-scripts/all-nodes.sh | 29 |
5 files changed, 110 insertions, 0 deletions
diff --git a/all-nodes-validation.yaml b/all-nodes-validation.yaml new file mode 100644 index 00000000..a7383375 --- /dev/null +++ b/all-nodes-validation.yaml @@ -0,0 +1,27 @@ +heat_template_version: 2015-04-30 + +description: > + Software Config to drive validations that occur on all nodes. + Note, you need the heat-config-script element built into your + images, due to the script group below. + +parameters: + PingTestIps: + default: '' + description: A string containing a space separated list of IP addresses used to ping test each available network interface. + type: string + +resources: + AllNodesValidationsImpl: + type: OS::Heat::SoftwareConfig + properties: + group: script + inputs: + - name: ping_test_ips + default: {get_param: PingTestIps} + config: {get_file: ./validation-scripts/all-nodes.sh} + +outputs: + OS::stack_id: + description: The ID of the AllNodesValidationsImpl resource. + value: {get_resource: AllNodesValidationsImpl} diff --git a/overcloud-resource-registry-puppet.yaml b/overcloud-resource-registry-puppet.yaml index ecb1162e..7680192f 100644 --- a/overcloud-resource-registry-puppet.yaml +++ b/overcloud-resource-registry-puppet.yaml @@ -80,5 +80,8 @@ resource_registry: # Port assignments for service virtual IPs for the controller role OS::TripleO::Controller::Ports::RedisVipPort: network/ports/ctlplane_vip.yaml + # validation resources + OS::TripleO::AllNodes::Validation: all-nodes-validation.yaml + parameter_defaults: EnablePackageInstall: false diff --git a/overcloud-resource-registry.yaml b/overcloud-resource-registry.yaml index 094b3311..eaedf790 100644 --- a/overcloud-resource-registry.yaml +++ b/overcloud-resource-registry.yaml @@ -65,3 +65,6 @@ resource_registry: # Port assignments for service virtual IPs for the controller role OS::TripleO::Controller::Ports::RedisVipPort: network/ports/noop.yaml + + # validation resources + OS::TripleO::AllNodes::Validation: all-nodes-validation.yaml diff --git a/overcloud-without-mergepy.yaml b/overcloud-without-mergepy.yaml index 63cce2a3..260952b3 100644 --- a/overcloud-without-mergepy.yaml +++ b/overcloud-without-mergepy.yaml @@ -1253,6 +1253,54 @@ resources: config: {get_attr: [allNodesConfig, config_id]} servers: {get_attr: [CephStorage, attributes, nova_server_resource]} + # All Nodes Validations + AllNodesValidationConfig: + type: OS::TripleO::AllNodes::Validation + properties: + PingTestIps: + list_join: + - ' ' + - - {get_attr: [Controller, resource.0.external_ip_address]} + - {get_attr: [Controller, resource.0.internal_api_ip_address]} + - {get_attr: [Controller, resource.0.storage_ip_address]} + - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]} + - {get_attr: [Controller, resource.0.tenant_ip_address]} + + ControllerAllNodesValidationDeployment: + type: OS::Heat::StructuredDeployments + depends_on: ControllerAllNodesDeployment + properties: + config: {get_resource: AllNodesValidationConfig} + servers: {get_attr: [Controller, attributes, nova_server_resource]} + + ComputeAllNodesValidationDeployment: + type: OS::Heat::StructuredDeployments + depends_on: ComputeAllNodesDeployment + properties: + config: {get_resource: AllNodesValidationConfig} + servers: {get_attr: [Compute, attributes, nova_server_resource]} + + BlockStorageAllNodesValidationDeployment: + type: OS::Heat::StructuredDeployments + depends_on: BlockStorageAllNodesDeployment + properties: + config: {get_resource: AllNodesValidationConfig} + servers: {get_attr: [BlockStorage, attributes, nova_server_resource]} + + ObjectStorageAllNodesValidationDeployment: + type: OS::Heat::StructuredDeployments + depends_on: ObjectStorageAllNodesDeployment + properties: + config: {get_resource: AllNodesValidationConfig} + servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]} + + CephStorageAllNodesValidationDeployment: + type: OS::Heat::StructuredDeployments + depends_on: CephStorageAllNodesDeployment + properties: + config: {get_resource: AllNodesValidationConfig} + servers: {get_attr: [CephStorage, attributes, nova_server_resource]} + # Nested stack deployment runs after all other controller deployments ControllerNodesPostDeployment: type: OS::TripleO::ControllerPostDeployment diff --git a/validation-scripts/all-nodes.sh b/validation-scripts/all-nodes.sh new file mode 100644 index 00000000..38a5a55e --- /dev/null +++ b/validation-scripts/all-nodes.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# For each unique remote IP (specified via Heat) we check to +# see if one of the locally configured networks matches and if so we +# attempt a ping test on that networks remote IP. +function ping_controller_ips() { + local REMOTE_IPS=$1 + + for REMOTE_IP in $(echo $REMOTE_IPS | sed -e "s| |\n|g" | sort -u); do + + for LOCAL_NETWORK in $(ip r | grep -v default | cut -d " " -f 1); do + local LOCAL_CIDR=$(echo $LOCAL_NETWORK | cut -d "/" -f 2) + local LOCAL_NETMASK=$(ipcalc -m $LOCAL_NETWORK | grep NETMASK | cut -d "=" -f 2) + local REMOTE_NETWORK=$(ipcalc -np $REMOTE_IP $LOCAL_NETMASK | grep NETWORK | cut -d "=" -f 2) + + if [ $REMOTE_NETWORK/$LOCAL_CIDR == $LOCAL_NETWORK ]; then + echo -n "Trying to ping $REMOTE_IP for local network $LOCAL_NETWORK..." + if ! ping -c 1 $REMOTE_IP &> /dev/null; then + echo "FAILURE" + echo "$REMOTE_IP is not pingable. Local Network: $LOCAL_NETWORK" >&2 + exit 1 + fi + echo "SUCCESS" + fi + done + done +} + +ping_controller_ips "$ping_test_ips" |