NFP (contrib) - Build and Configure Changes of NFP
This changeset contains the following changes: 1) Added configure NFP to the setup_nfp script 2) Replaced ssh keypair with nova keypair 3) Installs neutron-lib from python repository Change-Id: I6d18d8a37e4bc5c1d15f0cb0e895553d64f5b015 Implements: blueprint gbp-network-services-framework Co-Authored-By: Deepak S <in.live.in@live.in>
This commit is contained in:
		@@ -262,9 +262,6 @@ function create_nfp_image {
 | 
			
		||||
        if [[ $ConfiguratorQcow2Image = build ]]; then
 | 
			
		||||
            echo "Building Image: $ConfiguratorQcow2ImageName"
 | 
			
		||||
            # Prepare source for configurator
 | 
			
		||||
            git clone -b $NEUTRON_SRC_BRANCH_FOR_NFP_CONTROLLER https://github.com/openstack/neutron-lib.git
 | 
			
		||||
            cp -r neutron-lib/neutron_lib $DISKIMAGE_CREATE_DIR/neutron_lib
 | 
			
		||||
            rm -rf neutron-lib
 | 
			
		||||
            git_clone $GBPSERVICE_REPO $DEVSTACK_DIR/group-based-policy $GBPSERVICE_BRANCH
 | 
			
		||||
            cp -r $DEVSTACK_DIR/group-based-policy/gbpservice $DISKIMAGE_CREATE_DIR/gbpservice
 | 
			
		||||
            rm -rf $DEVSTACK_DIR/group-based-policy
 | 
			
		||||
@@ -280,7 +277,7 @@ function create_nfp_image {
 | 
			
		||||
 DIB.conf["ubuntu_release"] = {"release": "trusty"};\
 | 
			
		||||
 DIB.conf["dib"] = {"image_size": 10, "elements": ["configurator"], "offline": True, "cache_dir": "'$HOME'/.cache/image-create"};\
 | 
			
		||||
 DIB.dib()'
 | 
			
		||||
            rm -rf $DISKIMAGE_CREATE_DIR/neutron_lib $DISKIMAGE_CREATE_DIR/gbpservice $DISKIMAGE_CREATE_DIR/neutron $DISKIMAGE_CREATE_DIR/neutron_lbaas
 | 
			
		||||
            rm -rf $DISKIMAGE_CREATE_DIR/gbpservice $DISKIMAGE_CREATE_DIR/neutron $DISKIMAGE_CREATE_DIR/neutron_lbaas
 | 
			
		||||
            ConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path)
 | 
			
		||||
        fi
 | 
			
		||||
        echo "Uploading Image: $ConfiguratorQcow2ImageName"
 | 
			
		||||
@@ -300,21 +297,6 @@ function create_nfp_image {
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# configure_configurator_user_data() - Configure Configurator user data
 | 
			
		||||
function configure_configurator_user_data {
 | 
			
		||||
    CUR_DIR=$PWD
 | 
			
		||||
    sudo rm -rf /opt/configurator_user_data
 | 
			
		||||
    sudo cp -r $DISKIMAGE_CREATE_DIR/configurator_user_data /opt/.
 | 
			
		||||
    cd /opt
 | 
			
		||||
    sudo rm -rf my.key my.key.pub
 | 
			
		||||
    sudo ssh-keygen -t rsa -N "" -f my.key
 | 
			
		||||
    value=`sudo cat my.key.pub`
 | 
			
		||||
    sudo echo $value
 | 
			
		||||
    sudo sed -i "8 i\      -\ $value" configurator_user_data
 | 
			
		||||
    sudo sed -i '9d' configurator_user_data
 | 
			
		||||
    cd $CUR_DIR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# launch_configuratorVM() - Launch the Configurator VM
 | 
			
		||||
function launch_configuratorVM {
 | 
			
		||||
    echo "Collecting ImageId : for $configurator_image_name"
 | 
			
		||||
@@ -326,10 +308,13 @@ function launch_configuratorVM {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    configure_configurator_user_data
 | 
			
		||||
    nova keypair-add configurator_key > $HOME/configurator_key.pem
 | 
			
		||||
    chmod 600 $HOME/configurator_key.pem
 | 
			
		||||
 | 
			
		||||
    nova boot\
 | 
			
		||||
 --flavor m1.medium\
 | 
			
		||||
 --user-data /opt/configurator_user_data\
 | 
			
		||||
 --key-name configurator_key\
 | 
			
		||||
 --user-data $DISKIMAGE_CREATE_DIR/configurator_user_data\
 | 
			
		||||
 --image $ImageId\
 | 
			
		||||
 --nic port-id=$configurator_port_id\
 | 
			
		||||
 $ConfiguratorInstanceName
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,10 @@ RUN pip install \
 | 
			
		||||
 pecan==1.0.4\
 | 
			
		||||
 amqp==1.4.9\
 | 
			
		||||
 wsme\
 | 
			
		||||
 neutron-lib\
 | 
			
		||||
 "octavia<0.8"
 | 
			
		||||
 | 
			
		||||
# copy local src to docker image
 | 
			
		||||
COPY ./neutron_lib /usr/local/lib/python2.7/dist-packages/neutron_lib
 | 
			
		||||
COPY ./gbpservice /usr/local/lib/python2.7/dist-packages/gbpservice
 | 
			
		||||
COPY ./neutron /usr/local/lib/python2.7/dist-packages/neutron
 | 
			
		||||
COPY ./neutron_lbaas /usr/local/lib/python2.7/dist-packages/neutron_lbaas
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,4 @@
 | 
			
		||||
#cloud-config
 | 
			
		||||
users:
 | 
			
		||||
  - name: ubuntu
 | 
			
		||||
    groups: sudo
 | 
			
		||||
    shell: /bin/bash
 | 
			
		||||
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 | 
			
		||||
    ssh-authorized-keys:
 | 
			
		||||
      - <SSH PUBLIC KEY>
 | 
			
		||||
 | 
			
		||||
runcmd:
 | 
			
		||||
  - docker run -d --name configurator -it -p 5672:5672 -p 8070:8080 configurator-docker
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# configure_configurator_user_data() - Configure Configurator user data
 | 
			
		||||
function configure_configurator_user_data {
 | 
			
		||||
    rm -rf ssh_key ssh_key.pub
 | 
			
		||||
    ssh-keygen -t rsa -N "" -f ssh_key
 | 
			
		||||
    value=`cat ssh_key.pub`
 | 
			
		||||
    sed -i "8 i\      -\ $value" configurator_user_data
 | 
			
		||||
    sed -i '9d' configurator_user_data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
configure_configurator_user_data
 | 
			
		||||
 | 
			
		||||
@@ -28,6 +28,9 @@ dst_dir = "/tmp/controller_docker_build/"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
parser = argparse.ArgumentParser()
 | 
			
		||||
parser.add_argument('--configure', action='store_true',
 | 
			
		||||
                    dest='configure_nfp',
 | 
			
		||||
                    default=False, help='Configure NFP')
 | 
			
		||||
parser.add_argument('--build-controller-vm', action='store_true',
 | 
			
		||||
                    dest='build_controller_vm',
 | 
			
		||||
                    default=False, help='enable building controller vm')
 | 
			
		||||
@@ -57,6 +60,44 @@ parser.add_argument('--controller-path', type=str, dest='controller_path',
 | 
			
		||||
args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def configure_nfp():
 | 
			
		||||
    # Enable FW plugin
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf DEFAULT service_plugins neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,group_policy,ncp,neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPlugin,neutron.services.metering.metering_plugin.MeteringPlugin,neutron_vpnaas.services.vpn.plugin.VPNDriverPlugin,gbpservice.contrib.nfp.service_plugins.firewall.nfp_fwaas_plugin.NFPFirewallPlugin".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Enable GBP extension driver for service sharing
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf group_policy policy_drivers implicit_policy,resource_mapping,chain_mapping".split(' '))
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf group_policy extension_drivers proxy_group".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Configure service owner
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf admin_owned_resources_apic_tscp plumbing_resource_owner_user neutron".split(' '))
 | 
			
		||||
    admin_password = commands.getoutput("crudini --get /etc/neutron/neutron.conf keystone_authtoken admin_password")
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf admin_owned_resources_apic_tscp plumbing_resource_owner_password".split(' ') + [admin_password])
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf admin_owned_resources_apic_tscp plumbing_resource_owner_tenant_name services".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Configure NFP drivers
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf node_composition_plugin node_plumber admin_owned_resources_apic_plumber".split(' '))
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf node_composition_plugin node_drivers nfp_node_driver".split(' '))
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf nfp_node_driver is_service_admin_owned True".split(' '))
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf nfp_node_driver svc_management_ptg_name svc_management_ptg".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Enable ML2 port security
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Update neutron server to use GBP policy
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron.conf DEFAULT policy_file /etc/group-based-policy/policy.d/policy.json".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Update neutron LBaaS with NFP LBaaS service provider
 | 
			
		||||
    subprocess.call("crudini --set /etc/neutron/neutron_lbaas.conf service_providers service_provider LOADBALANCER:loadbalancer:gbpservice.contrib.nfp.service_plugins.loadbalancer.drivers.nfp_lbaas_plugin_driver.HaproxyOnVMPluginDriver:default".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Update DB
 | 
			
		||||
    subprocess.call("gbp-db-manage --config-file /usr/share/neutron/neutron-dist.conf --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini upgrade head".split(' '))
 | 
			
		||||
 | 
			
		||||
    # Restart the services to make the configuration effective
 | 
			
		||||
    subprocess.call("systemctl restart nfp_orchestrator".split(' '))
 | 
			
		||||
    subprocess.call("systemctl restart nfp_config_orch".split(' '))
 | 
			
		||||
    subprocess.call("systemctl restart neutron-server".split(' '))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_src_dirs():
 | 
			
		||||
    print("Getting source dirs for copying inside the docker image")
 | 
			
		||||
    # get the operating system type
 | 
			
		||||
@@ -95,13 +136,6 @@ def clean_src_dirs():
 | 
			
		||||
    subprocess.call(["rm", "-rf", dst_dir])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def update_user_data():
 | 
			
		||||
    os.chdir(DIB.cur_dir)
 | 
			
		||||
    print("Updating user_data with fresh ssh key")
 | 
			
		||||
    subprocess.call(["bash", "edit_user_data.sh"])
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def build_configuration_vm():
 | 
			
		||||
 | 
			
		||||
    cur_dir = os.path.dirname(__file__)
 | 
			
		||||
@@ -115,9 +149,6 @@ def build_configuration_vm():
 | 
			
		||||
    if(get_src_dirs()):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    # update configurator user_data with a fresh rsa ssh keypair
 | 
			
		||||
    update_user_data()
 | 
			
		||||
 | 
			
		||||
    # set the cache dir where trusty tar.gz will be present
 | 
			
		||||
    if args.image_build_cache_dir:
 | 
			
		||||
        cache_dir = args.image_build_cache_dir
 | 
			
		||||
@@ -496,6 +527,24 @@ def create_nfp_resources():
 | 
			
		||||
              " gbp_services_stack")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def add_nova_key_pair():
 | 
			
		||||
    tools_dir = os.path.dirname(__file__)
 | 
			
		||||
    tools_dir = os.path.realpath(tools_dir)
 | 
			
		||||
    if not tools_dir:
 | 
			
		||||
        # if script is executed from current dir, get abs path
 | 
			
		||||
        tools_dir = os.path.realpath('./')
 | 
			
		||||
    os.chdir(tools_dir)
 | 
			
		||||
    subprocess.call(["mkdir", "-p", "keys"])
 | 
			
		||||
 | 
			
		||||
    configurator_key_name = "configurator_key"
 | 
			
		||||
    print("Creating nova keypair for configurator VM.")
 | 
			
		||||
    pem_file_content = commands.getoutput("nova keypair-add" + " " + configurator_key_name)
 | 
			
		||||
    with open("keys/configurator_key.pem", "w") as f:
 | 
			
		||||
        f.write(pem_file_content)
 | 
			
		||||
    os.chmod("keys/configurator_key.pem", 0o600)
 | 
			
		||||
    return configurator_key_name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def launch_configurator():
 | 
			
		||||
    get_openstack_creds()
 | 
			
		||||
    if os.path.isfile(args.controller_path):
 | 
			
		||||
@@ -505,6 +554,10 @@ def launch_configurator():
 | 
			
		||||
    else:
 | 
			
		||||
        print("Error " + args.controller_path + " does not exist")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    # add nova keypair for configurator VM.
 | 
			
		||||
    configurator_key_name = add_nova_key_pair()
 | 
			
		||||
 | 
			
		||||
    Port_id = commands.getstatusoutput(
 | 
			
		||||
        "gbp policy-target-create --policy-target-group svc_management_ptg"
 | 
			
		||||
        " configuratorVM_instance | grep port_id  | awk '{print $4}'")[1]
 | 
			
		||||
@@ -513,12 +566,13 @@ def launch_configurator():
 | 
			
		||||
    if Image_id and Port_id:
 | 
			
		||||
        os.system("nova boot --flavor m1.medium --image " +
 | 
			
		||||
                  Image_id + " --user-data " + CONFIGURATOR_USER_DATA +
 | 
			
		||||
                  " --key-name " + configurator_key_name +
 | 
			
		||||
                  " --nic port-id=" + Port_id + " configuratorVM_instance")
 | 
			
		||||
    else:
 | 
			
		||||
        if not Port_id:
 | 
			
		||||
            print("Error unable to create the controller port id")
 | 
			
		||||
        else:
 | 
			
		||||
            print("Erro unable to get configurator image info")
 | 
			
		||||
            print("Error unable to get configurator image info")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -569,7 +623,9 @@ def clean_up():
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    if args.build_controller_vm:
 | 
			
		||||
    if args.configure_nfp:
 | 
			
		||||
        configure_nfp()
 | 
			
		||||
    elif args.build_controller_vm:
 | 
			
		||||
        build_configuration_vm()
 | 
			
		||||
    elif args.enable_orchestrator:
 | 
			
		||||
        create_orchestrator_ctl()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user