def launch_upgrade_downgrade_kolla(controller_ip, version):
    updown_pb = pkg_resources.resource_filename(
        consts.KOLLA_PB_PKG, consts.UPGRADE_DOWNGRADE_KOLLA_YAML)
    list_controller = []
    list_controller.append(controller_ip)
    ret = apbl.launch_ansible_playbook(list_controller, updown_pb, {'version': version})
    return ret
def clean_up_kolla(list_ip, docker_registry, service_list,
                   operation, pull_from_hub, host_storage_node_map,dpdk_enable):
    """
    This method is responsible for the cleanup of openstack services
    """
    if list_ip:
        cleanup_hosts_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_CLEANUP_HOSTS)
        ret = apbl.launch_ansible_playbook(
            list_ip, cleanup_hosts_pb, {
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file,
                'DPDK_ENABLE':dpdk_enable})
        if ret != 0:
            logger.info('FAILED IN CLEANUP')
            exit(1)
        if 'cinder' in service_list:
            for key,value in host_storage_node_map.iteritems():
               ip = key
               second_storage = value
               logger.info(ip)
               logger.info(second_storage)   
               remove_storage_pb = pkg_resources.resource_filename(
                   consts.KOLLA_PB_PKG, consts.KOLLA_REMOVE_STORAGE)
               ret_storage = apbl.launch_ansible_playbook(
                   list_ip, remove_storage_pb, {
                       'target': ip,
                       'PROXY_DATA_FILE': proxy_data_file,
                       'VARIABLE_FILE': variable_file,
                       'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                       'SECOND_STORAGE': second_storage})
               if ret_storage != 0:
                   logger.info('FAILED')
                   exit(1)

        remove_images_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_REMOVE_IMAGES)

        if operation is "cleanregistry" and pull_from_hub != "yes":
            remove_registry_pb = pkg_resources.resource_filename(
                consts.KOLLA_PB_PKG, consts.KOLLA_REMOVE_REGISTRY)

            ret1 = apbl.launch_ansible_playbook(
                list_ip, remove_registry_pb, {
                    'target': docker_registry,
                    'PROXY_DATA_FILE': proxy_data_file,
                    'VARIABLE_FILE': variable_file})
            if ret1 != 0:
                logger.info('Regsitery cleanup problems might be there')

            ret_image = apbl.launch_ansible_playbook(
                list_ip, remove_images_pb,
                {'PROXY_DATA_FILE': proxy_data_file,
                 'VARIABLE_FILE': variable_file})
            if ret_image != 0:
                logger.info('Image cleanup problems might be there')
        elif operation is "cleanregistry" and pull_from_hub == "yes":
            ret_image = apbl.launch_ansible_playbook(
                list_ip, remove_images_pb, {
                    'PROXY_DATA_FILE': proxy_data_file,
                    'VARIABLE_FILE': variable_file})
            if ret_image != 0:
                logger.info('Image cleanup problems might be there')
def launch_provisioning_kolla(iplist, git_branch, kolla_tag, kolla_ansible_tag,
                              host_name_map, host_node_type_map,
                              docker_registry, docker_port, kolla_base,
                              kolla_install, ext_sub, ext_gw, ip_pool_start,
                              ip_pool_end, operation,
                              host_cpu_map, reserve_memory, base_size, count,
                              default, vxlan, pull_from_hub, host_storage_node_map, host_sriov_interface_node_map,
							  dpdk_enable):
    if pull_from_hub != "yes":
        docker_opts = "--insecure-registry  " + docker_registry + ":" + str(
            docker_port)
        docker_registry_ip = docker_registry + ":" + str(docker_port)
    else:
        docker_opts = ""
        docker_registry_ip = ""

    list_network = []
    list_storage = []
    list_node = []
    list_all = []
    list_controller = []
    list_compute = []
    ip_control = None
    second_storage = None 
    for key, value in host_name_map.items():
        ip = value
        host_name = key
        logger.info('EXECUTING SET HOSTS PLAY')
        logger.info(consts.KOLLA_SET_HOSTS)

        set_hosts_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_SET_HOSTS)
        ret_hosts = apbl.launch_ansible_playbook(
            iplist, set_hosts_pb, {
                'target': ip, 'host_name': host_name,
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file,
                'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH})
        if ret_hosts != 0:
            logger.info("FAILED IN SETTING HOSTS FILE")
            exit(1)
        else:
            logger.info('SET HOSTNAME IN HOSTS')

        set_hostname_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_SET_HOSTSNAME)
        apbl.launch_ansible_playbook(
            iplist, set_hostname_pb, {
                'target': ip, 'host_name': host_name,
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file})
    for key, value in host_node_type_map.items():
        ip = key
        node_type = value
        if len(host_node_type_map) == 1:
            list_all.append(ip)
            ip_control = ip
        if 'compute' in node_type:
            list_compute.append(ip)
        if 'controller' in node_type:
            list_controller.append(ip)
            ip_control = ip
        if 'network' in node_type:
            list_network.append(ip)
        if 'storage' in node_type:
            list_storage.append(ip)
        if 'controller' not in node_type:
            list_node.append(ip)
    logger.info('+++++++++++++++++++++++++++++++++++++++++++++++++++')
    logger.info(list_all)
    logger.info(list_compute)
    logger.info(list_controller)
    logger.info(list_node)
    logger.info(list_storage)
    if ip_control in list_compute:
        check_var = 'present'
        logger.info('controller also a compute')
        logger.info(ip_control)
    else:
        check_var = 'absent'
        logger.info('controller not a compute')
    if ip_control != docker_registry:
        get_tag = False
        logger.info("IMAGE SERVER IS DIFFERENT THAN CONTROLLER")
        logger.info(get_tag)
    else:
        get_tag = True
        logger.info(get_tag)
    logger.info('++++++++++++++++++++++++++++++++++++++++++++++++++++')
    logger.info('SETUP KOLLA BASE PACKAGES')
    if pull_from_hub != "yes":
        set_kolla_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_SET_KOLLA)
        ret = apbl.launch_ansible_playbook(
            iplist, set_kolla_pb, {
                'target': docker_registry, 'DOCKER_OPTS': docker_opts,
                'DOCKER_REGISTRY_IP': docker_registry_ip,
                'kolla_base': kolla_base, 'kolla_install': kolla_install,
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file,
                'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                'GIT_BRANCH': git_branch,
                'KOLLA_TAG': kolla_tag,
                'KOLLA_ANSIBLE_TAG': kolla_ansible_tag,
                'LIST_ALL':iplist})
        logger.info(ret)
        print('#####################################################')
        if ret != 0:
            logger.info('FAILED IN SETTING KOLLA BASE PACKAGES')
            exit(1)

    if operation is "deployregistry" and pull_from_hub != "yes":
        logger.info('++++++++++++++++++++++++++++++++++++++++++++++++++++')
        logger.info(
            'SETUP REGISTRY:It will take a bit time to setup your registry with '
            'compiled images')

        set_registry_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_SET_REGISTRY)
        ret = apbl.launch_ansible_playbook(
            iplist, set_registry_pb, {
                'target': docker_registry, 'DOCKER_OPTS': docker_opts,
                'DOCKER_REGISTRY_IP': docker_registry_ip,
                'kolla_base': kolla_base, 'kolla_install': kolla_install,
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file,
                'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                'PULL_HUB': pull_from_hub})
        logger.info(ret)
        print('#####################################################')
        if ret != 0:
            logger.info('FAILED IN SETTING DOCKER REGISTRY')
            exit(1)

    copy_key_pb = pkg_resources.resource_filename(
        consts.KOLLA_PB_PKG, consts.KOLLA_COPY_KEY)
    apbl.launch_ansible_playbook(
        iplist, copy_key_pb, {
            'target': ip_control, 'PROXY_DATA_FILE': proxy_data_file,
            'VARIABLE_FILE': variable_file})
    for key_ip in iplist:
        push_key_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.KOLLA_PUSH_KEY)
        apbl.launch_ansible_playbook(
            iplist, push_key_pb, {
                'target': key_ip, 'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file})

    if not list_all:
        logger.info(
            '**********************MULTINODE_DEPLOYMENT**********************')
        if list_storage:
            for storage_ip in list_storage:
              for key,value in host_storage_node_map.iteritems():
                if key is storage_ip:
                  second_storage=value 
                  set_storage_pb = pkg_resources.resource_filename(
                    consts.KOLLA_PB_PKG, consts.KOLLA_SET_STORAGE)
                  ret_storage = apbl.launch_ansible_playbook(
                    iplist, set_storage_pb, {
                        'target': storage_ip,
                        'PROXY_DATA_FILE': proxy_data_file,
                        'VARIABLE_FILE': variable_file,
                        'SECOND_STORAGE': second_storage,
                        'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                        'OPERATION': operation, 'BASE_SIZE': base_size,
                        'COUNT': count})

                  if ret_storage != 0:
                    logger.info("FAILED IN SETTING STORAGE")
                    exit(1)
        
        for node_ip in list_node:
          for key,value in host_sriov_interface_node_map.iteritems():
            if key is node_ip:
               sriov_interface=value
               multi_node_pb = pkg_resources.resource_filename(
                   consts.KOLLA_PB_PKG,
                   consts.MULTI_NODE_KOLLA_COMPUTE_YAML)
               ret = apbl.launch_ansible_playbook(
                 iplist, multi_node_pb, {
                     'DOCKER_OPTS': docker_opts,
                     'DOCKER_REGISTRY_IP': docker_registry_ip,
                     'target': node_ip,
                     'PROXY_DATA_FILE': proxy_data_file,
                     'VARIABLE_FILE': variable_file,
                     'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                     'SECOND_STORAGE': second_storage,
                     'BASE_SIZE': base_size,
                     'COUNT': count, 'GIT_BRANCH': git_branch,
                     'KOLLA_TAG': kolla_tag,
                     'KOLLA_ANSIBLE_TAG': kolla_ansible_tag,
                     'DEFAULT': default, 'VXLAN': vxlan,
                     'PULL_HUB': pull_from_hub,
                     'SRIOV_INTERFACE': sriov_interface})

               if ret != 0:
                  print(ret)
                  logger.info("FAILED IN COMPUTE")
                  exit(1)
               else:
                 logger.info(
                   "***********PLAYBOOK EXECUTED SUCCESSFULLY***********")

        for controller_ip in list_controller:
            if len(list_storage) == 1:
                ceph_pb = pkg_resources.resource_filename(
                    consts.KOLLA_PB_PKG, consts.KOLLA_CEPH_SETUP)
                apbl.launch_ansible_playbook(
                    iplist, ceph_pb, {
                        'target': controller_ip,
                        'VARIABLE_FILE': variable_file,
                        'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH})
            for key,value in host_sriov_interface_node_map.iteritems():
              if key is node_ip:
                 sriov_interface=value
                 nova_str = ""
                 sriov_str = ""
                    
                 if sriov_interface is not None: 
                   for iface in sriov_interface:
                     nova_str = '{}{{"devname":"{}", "physical_network": "physnet1"}},'.format(nova_str,iface)
                     sriov_str = '{}physnet1:{},'.format(sriov_str,iface) 
                   sriov_str = sriov_str.rstrip(",")
                   nova_str = "[" + nova_str.rstrip(",") + "]"

            multi_node_pb = pkg_resources.resource_filename(
                consts.KOLLA_PB_PKG,
                consts.MULTI_NODE_KOLLA_CONTROLLER_YAML)
            ret_controller = apbl.launch_ansible_playbook(
                iplist, multi_node_pb,
                {'target': controller_ip, 'DOCKER_OPTS': docker_opts,
                 'DOCKER_REGISTRY_IP': docker_registry_ip,
                 'kolla_base': kolla_base, 'kolla_install': kolla_install,
                 'PROXY_DATA_FILE': proxy_data_file,
                 'VARIABLE_FILE': variable_file,
                 'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                 'EXT_SUB': ext_sub, 'EXT_GW': ext_gw,
                 'START_IP': ip_pool_start, 'END_IP': ip_pool_end,
                 'DEFAULT': default, 'VXLAN': vxlan,
                 'GIT_BRANCH': git_branch, 'KOLLA_TAG': kolla_tag,
                 'KOLLA_ANSIBLE_TAG': kolla_ansible_tag,
                 'CHECK_VAR': check_var, 'PULL_HUB': pull_from_hub,
                 'GET_TAG': get_tag, 'SRIOV_INTERFACE': sriov_interface,
                 'SRIOV_STRING': sriov_str,'NOVA_STRING': nova_str})
            if ret_controller != 0:
                logger.info("FAILED IN CONTROLLER" )
                print(ret_controller)
                exit(1)

        for node_ip in list_node:
           if dpdk_enable!="yes":
              multi_node_pb = pkg_resources.resource_filename(
                  consts.KOLLA_PB_PKG,
                  consts.MULTI_NODE_KOLLA_ISO_NWK_YAML)
              ret = apbl.launch_ansible_playbook(
                  iplist, multi_node_pb, {
                      'target': node_ip,
                      'PROXY_DATA_FILE': proxy_data_file,
                      'VARIABLE_FILE': variable_file,
                      'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH})
              if ret != 0:
                  logger.error("NETWORK ADAPTATION FAILED IN COMPUTE")
                  exit(1)
              else:
                  logger.info(
                      "*********ISO NWK PLAYBOOK EXECUTED SUCCESSFULLY*********")

        for node_ip in list_compute:
            for key,value in host_sriov_interface_node_map.iteritems():
                if key is node_ip:
                   sriov_interface=value
                   nova_str = ""
                   sriov_str = ""
                   if sriov_interface is not None: 
                       for iface in sriov_interface:
                         nova_str = '{}{{"devname":"{}", "physical_network": "physnet1"}},'.format(nova_str,iface)
                         sriov_str = '{}physnet1:{},'.format(sriov_str,iface)                         
                       sriov_str = sriov_str.rstrip(",")
                       nova_str = "[" + nova_str.rstrip(",") + "]"

            vcpu_pin = host_cpu_map.get(node_ip)
            memory = reserve_memory.get(node_ip)
            set_pin_pb = pkg_resources.resource_filename(
                consts.KOLLA_PB_PKG, consts.KOLLA_SET_PIN)
            ret = apbl.launch_ansible_playbook(
                iplist, set_pin_pb, {
                    'target': node_ip,
                    'PROXY_DATA_FILE': proxy_data_file,
                    'VARIABLE_FILE': variable_file,
                    'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                    'vcpu_pin': vcpu_pin, 'memory': memory,
                    'DEFAULT': default, 'VXLAN': vxlan,
                    'KOLLA_TAG': kolla_tag,
                    'KOLLA_ANSIBLE_TAG': kolla_ansible_tag,
                    'SRIOV_STRING': sriov_str,'NOVA_STRING': nova_str,
                    'CONTROLLER_IP': ip_control})
            if ret != 0:
                logger.error(" FAILED IN COMPUTE")
                exit(1)
            else:
                logger.info(
                    "*****************EXECUTED SUCCESSFULLY*****************")
    else:
        logger.info('ALL IN ONE DEPLOYEMENT')
        if(len(host_storage_node_map)==1):
          second_storage=host_storage_node_map.values()[0]
          logger.info(host_storage_node_map)
          logger.info(second_storage)
        else:
          logger.info("Failed in creating storage map")
          exit(1)

        single_node_pb = pkg_resources.resource_filename(
            consts.KOLLA_PB_PKG, consts.SINGLE_NODE_KOLLA_YAML)
        ret_all = apbl.launch_ansible_playbook(
            list_all, single_node_pb, {
                'DOCKER_OPTS': docker_opts,
                'DOCKER_REGISTRY_IP': docker_registry_ip,
                'kolla_base': kolla_base, 'kolla_install': kolla_install,
                'PROXY_DATA_FILE': proxy_data_file,
                'VARIABLE_FILE': variable_file,
                'BASE_FILE_PATH': consts.KOLLA_SOURCE_PATH,
                'EXT_SUB': ext_sub, 'EXT_GW': ext_gw,
                'START_IP': ip_pool_start, 'END_IP': ip_pool_end,
                'SECOND_STORAGE': second_storage, 'BASE_SIZE': base_size,
                'COUNT': count, 'DEFAULT': default,
                'VXLAN': vxlan, 'GIT_BRANCH': git_branch,
                'KOLLA_TAG': kolla_tag,
                'KOLLA_ANSIBLE_TAG': kolla_ansible_tag,
                'PULL_HUB': pull_from_hub})
        if ret_all != 0:
            logger.info("FAILED IN DEPLOYMENT")
            print(ret_all)
            exit(1)
        else:
            logger.info("SINGLE NODE COMPLETED")

    logger.info("PROCESS COMPLETE")