Browse code

Merge "Add Ironic hardware deployment support"

Jenkins authored on 2014/11/19 02:09:27
Showing 2 changed files
... ...
@@ -40,6 +40,18 @@ IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf
40 40
 IRONIC_ROOTWRAP_CONF=$IRONIC_CONF_DIR/rootwrap.conf
41 41
 IRONIC_POLICY_JSON=$IRONIC_CONF_DIR/policy.json
42 42
 
43
+# Deploy to hardware platform
44
+IRONIC_HW_NODE_CPU=${IRONIC_HW_NODE_CPU:-1}
45
+IRONIC_HW_NODE_RAM=${IRONIC_HW_NODE_RAM:-512}
46
+IRONIC_HW_NODE_DISK=${IRONIC_HW_NODE_DISK:-10}
47
+IRONIC_HW_EPHEMERAL_DISK=${IRONIC_HW_EPHEMERAL_DISK:-0}
48
+# The file is composed of multiple lines, each line includes four field
49
+# separated by white space: IPMI address, MAC address, IPMI username
50
+# and IPMI password.
51
+# An example:
52
+#   192.168.110.107 00:1e:67:57:50:4c root otc123
53
+IRONIC_IPMIINFO_FILE=${IRONIC_IPMIINFO_FILE:-$IRONIC_DATA_DIR/hardware_info}
54
+
43 55
 # Set up defaults for functional / integration testing
44 56
 IRONIC_SCRIPTS_DIR=${IRONIC_SCRIPTS_DIR:-$TOP_DIR/tools/ironic/scripts}
45 57
 IRONIC_TEMPLATES_DIR=${IRONIC_TEMPLATES_DIR:-$TOP_DIR/tools/ironic/templates}
... ...
@@ -51,6 +63,7 @@ IRONIC_SSH_KEY_FILENAME=${IRONIC_SSH_KEY_FILENAME:-ironic_key}
51 51
 IRONIC_KEY_FILE=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME
52 52
 IRONIC_SSH_VIRT_TYPE=${IRONIC_SSH_VIRT_TYPE:-virsh}
53 53
 IRONIC_TFTPBOOT_DIR=${IRONIC_TFTPBOOT_DIR:-$IRONIC_DATA_DIR/tftpboot}
54
+IRONIC_TFTPSERVER_IP=${IRONIC_TFTPSERVER_IP:-$HOST_IP}
54 55
 IRONIC_VM_SSH_PORT=${IRONIC_VM_SSH_PORT:-22}
55 56
 IRONIC_VM_SSH_ADDRESS=${IRONIC_VM_SSH_ADDRESS:-$HOST_IP}
56 57
 IRONIC_VM_COUNT=${IRONIC_VM_COUNT:-1}
... ...
@@ -80,7 +93,7 @@ IRONIC_AGENT_KERNEL_URL=${IRONIC_AGENT_KERNEL_URL:-http://tarballs.openstack.org
80 80
 IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz}
81 81
 
82 82
 # Which deploy driver to use - valid choices right now
83
-# are 'pxe_ssh' and 'agent_ssh'.
83
+# are 'pxe_ssh', 'pxe_ipmitool' and 'agent_ssh'.
84 84
 IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ssh}
85 85
 
86 86
 #TODO(agordeev): replace 'ubuntu' with host distro name getting
... ...
@@ -133,6 +146,11 @@ function is_ironic_enabled {
133 133
     return 1
134 134
 }
135 135
 
136
+function is_ironic_hardware {
137
+    is_ironic_enabled && [[ -n "${IRONIC_DEPLOY_DRIVER##*_ssh}" ]] && return 0
138
+    return 1
139
+}
140
+
136 141
 # install_ironic() - Collect source and prepare
137 142
 function install_ironic {
138 143
     # make sure all needed service were enabled
... ...
@@ -281,7 +299,7 @@ function configure_ironic_conductor {
281 281
     iniset $IRONIC_CONF_FILE DEFAULT rootwrap_config $IRONIC_ROOTWRAP_CONF
282 282
     iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $IRONIC_ENABLED_DRIVERS
283 283
     iniset $IRONIC_CONF_FILE conductor api_url http://$HOST_IP:6385
284
-    iniset $IRONIC_CONF_FILE pxe tftp_server $HOST_IP
284
+    iniset $IRONIC_CONF_FILE pxe tftp_server $IRONIC_TFTPSERVER_IP
285 285
     iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR
286 286
     iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images
287 287
     if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then
... ...
@@ -483,7 +501,7 @@ function create_bridge_and_vms {
483 483
     create_ovs_taps
484 484
 }
485 485
 
486
-function enroll_vms {
486
+function enroll_nodes {
487 487
     local chassis_id=$(ironic chassis-create -d "ironic test chassis" | grep " uuid " | get_field 2)
488 488
     local idx=0
489 489
 
... ...
@@ -495,34 +513,65 @@ function enroll_vms {
495 495
         local _IRONIC_DEPLOY_RAMDISK_KEY=deploy_ramdisk
496 496
     fi
497 497
 
498
-    while read MAC; do
499
-
500
-        local node_id=$(ironic node-create --chassis_uuid $chassis_id \
501
-            --driver $IRONIC_DEPLOY_DRIVER \
498
+    if ! is_ironic_hardware; then
499
+        local ironic_node_cpu=$IRONIC_VM_SPECS_CPU
500
+        local ironic_node_ram=$IRONIC_VM_SPECS_RAM
501
+        local ironic_node_disk=$IRONIC_VM_SPECS_DISK
502
+        local ironic_ephemeral_disk=$IRONIC_VM_EPHEMERAL_DISK
503
+        local ironic_hwinfo_file=$IRONIC_VM_MACS_CSV_FILE
504
+        local node_options="\
502 505
             -i $_IRONIC_DEPLOY_KERNEL_KEY=$IRONIC_DEPLOY_KERNEL_ID \
503 506
             -i $_IRONIC_DEPLOY_RAMDISK_KEY=$IRONIC_DEPLOY_RAMDISK_ID \
504 507
             -i ssh_virt_type=$IRONIC_SSH_VIRT_TYPE \
505 508
             -i ssh_address=$IRONIC_VM_SSH_ADDRESS \
506 509
             -i ssh_port=$IRONIC_VM_SSH_PORT \
507 510
             -i ssh_username=$IRONIC_SSH_USERNAME \
508
-            -i ssh_key_filename=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME \
509
-            -p cpus=$IRONIC_VM_SPECS_CPU \
510
-            -p memory_mb=$IRONIC_VM_SPECS_RAM \
511
-            -p local_gb=$IRONIC_VM_SPECS_DISK \
511
+            -i ssh_key_filename=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME"
512
+    else
513
+        local ironic_node_cpu=$IRONIC_HW_NODE_CPU
514
+        local ironic_node_ram=$IRONIC_HW_NODE_RAM
515
+        local ironic_node_disk=$IRONIC_HW_NODE_DISK
516
+        local ironic_ephemeral_disk=$IRONIC_HW_EPHEMERAL_DISK
517
+        if [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]]; then
518
+            local ironic_hwinfo_file=$IRONIC_IPMIINFO_FILE
519
+        fi
520
+    fi
521
+
522
+    while read hardware_info; do
523
+        if ! is_ironic_hardware; then
524
+            local mac_address=$hardware_info
525
+        elif [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]]; then
526
+            local ipmi_address=$(echo $hardware_info |awk  '{print $1}')
527
+            local mac_address=$(echo $hardware_info |awk '{print $2}')
528
+            local ironic_ipmi_username=$(echo $hardware_info |awk '{print $3}')
529
+            local ironic_ipmi_passwd=$(echo $hardware_info |awk '{print $4}')
530
+            # Currently we require all hardware platform have same CPU/RAM/DISK info
531
+            # in future, this can be enhanced to support different type, and then
532
+            # we create the bare metal flavor with minimum value
533
+            local node_options="-i ipmi_address=$ipmi_address -i ipmi_password=$ironic_ipmi_passwd\
534
+                -i ipmi_username=$ironic_ipmi_username"
535
+        fi
536
+
537
+        local node_id=$(ironic node-create --chassis_uuid $chassis_id \
538
+            --driver $IRONIC_DEPLOY_DRIVER \
539
+            -p cpus=$ironic_node_cpu\
540
+            -p memory_mb=$ironic_node_ram\
541
+            -p local_gb=$ironic_node_disk\
512 542
             -p cpu_arch=x86_64 \
543
+            $node_options \
513 544
             | grep " uuid " | get_field 2)
514 545
 
515
-        ironic port-create --address $MAC --node_uuid $node_id
546
+        ironic port-create --address $mac_address --node_uuid $node_id
516 547
 
517 548
         idx=$((idx+1))
518
-    done < $IRONIC_VM_MACS_CSV_FILE
549
+    done < $ironic_hwinfo_file
519 550
 
520 551
     # create the nova flavor
521 552
     # NOTE(adam_g): Attempting to use an autogenerated UUID for flavor id here uncovered
522 553
     # bug (LP: #1333852) in Trove.  This can be changed to use an auto flavor id when the
523 554
     # bug is fixed in Juno.
524
-    local adjusted_disk=$(($IRONIC_VM_SPECS_DISK - $IRONIC_VM_EPHEMERAL_DISK))
525
-    nova flavor-create --ephemeral $IRONIC_VM_EPHEMERAL_DISK baremetal 551 $IRONIC_VM_SPECS_RAM $adjusted_disk $IRONIC_VM_SPECS_CPU
555
+    local adjusted_disk=$(($ironic_node_disk - $ironic_ephemeral_disk))
556
+    nova flavor-create --ephemeral $ironic_ephemeral_disk baremetal 551 $ironic_node_ram $adjusted_disk $ironic_node_cpu
526 557
 
527 558
     # TODO(lucasagomes): Remove the 'baremetal:deploy_kernel_id'
528 559
     # and 'baremetal:deploy_ramdisk_id' parameters
... ...
@@ -670,11 +719,15 @@ function upload_baremetal_ironic_deploy {
670 670
 
671 671
 function prepare_baremetal_basic_ops {
672 672
     upload_baremetal_ironic_deploy
673
-    create_bridge_and_vms
674
-    enroll_vms
673
+    if ! is_ironic_hardware; then
674
+        create_bridge_and_vms
675
+    fi
676
+    enroll_nodes
675 677
     configure_tftpd
676 678
     configure_iptables
677
-    configure_ironic_auxiliary
679
+    if ! is_ironic_hardware; then
680
+        configure_ironic_auxiliary
681
+    fi
678 682
 }
679 683
 
680 684
 function cleanup_baremetal_basic_ops {
... ...
@@ -523,7 +523,7 @@ function create_neutron_initial_network {
523 523
         die_if_not_set $LINENO PHYSICAL_NETWORK "You must specify the PHYSICAL_NETWORK"
524 524
         die_if_not_set $LINENO PROVIDER_NETWORK_TYPE "You must specifiy the PROVIDER_NETWORK_TYPE"
525 525
         NET_ID=$(neutron net-create $PHYSICAL_NETWORK --tenant_id $TENANT_ID --provider:network_type $PROVIDER_NETWORK_TYPE --provider:physical_network "$PHYSICAL_NETWORK" ${SEGMENTATION_ID:+--provider:segmentation_id $SEGMENTATION_ID} --shared | grep ' id ' | get_field 2)
526
-        SUBNET_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 4 ${ALLOCATION_POOL:+--allocation-pool $ALLOCATION_POOL} --name $PROVIDER_SUBNET_NAME $NET_ID $FIXED_RANGE | grep ' id ' | get_field 2)
526
+        SUBNET_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 4 ${ALLOCATION_POOL:+--allocation-pool $ALLOCATION_POOL} --name $PROVIDER_SUBNET_NAME --gateway $NETWORK_GATEWAY $NET_ID $FIXED_RANGE | grep ' id ' | get_field 2)
527 527
         SUBNET_V6_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 6 --ipv6-address-mode slaac --gateway $V6_NETWORK_GATEWAY --name $PROVIDER_SUBNET_NAME_V6 $NET_ID $FIXED_RANGE_V6 | grep 'id' | get_field 2)
528 528
         sudo ip link set $OVS_PHYSICAL_BRIDGE up
529 529
         sudo ip link set br-int up
... ...
@@ -678,6 +678,13 @@ function start_neutron_agents {
678 678
         sudo ip link set $OVS_PHYSICAL_BRIDGE up
679 679
         sudo ip link set br-int up
680 680
         sudo ip link set $PUBLIC_INTERFACE up
681
+        if is_ironic_hardware; then
682
+            for IP in $(ip addr show dev $PUBLIC_INTERFACE | grep ' inet ' | awk '{print $2}'); do
683
+                sudo ip addr del $IP dev $PUBLIC_INTERFACE
684
+                sudo ip addr add $IP dev $OVS_PHYSICAL_BRIDGE
685
+            done
686
+            sudo route add -net $FIXED_RANGE gw $NETWORK_GATEWAY dev $OVS_PHYSICAL_BRIDGE
687
+        fi
681 688
     fi
682 689
 
683 690
     if is_service_enabled q-vpn; then
... ...
@@ -729,6 +736,14 @@ function stop_neutron {
729 729
 # cleanup_neutron() - Remove residual data files, anything left over from previous
730 730
 # runs that a clean run would need to clean up
731 731
 function cleanup_neutron {
732
+    if [[ is_provider_network && is_ironic_hardware ]]; then
733
+        for IP in $(ip addr show dev $OVS_PHYSICAL_BRIDGE | grep ' inet ' | awk '{print $2}'); do
734
+            sudo ip addr del $IP dev $OVS_PHYSICAL_BRIDGE
735
+            sudo ip addr add $IP dev $PUBLIC_INTERFACE
736
+        done
737
+        sudo route del -net $FIXED_RANGE gw $NETWORK_GATEWAY dev $OVS_PHYSICAL_BRIDGE
738
+    fi
739
+
732 740
     if is_neutron_ovs_base_plugin; then
733 741
         neutron_ovs_base_cleanup
734 742
     fi