class GlobalVrouterConfigProvisioner(object):
    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user,
            self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port,
            '/',
            api_server_use_ssl=self._args.api_server_use_ssl)
        try:
            current_config = self._vnc_lib.global_vrouter_config_read(fq_name=[
                'default-global-system-config', 'default-global-vrouter-config'
            ])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    conf_obj = GlobalVrouterConfig(
                        flow_export_rate=self._args.flow_export_rate)
                    result = self._vnc_lib.global_vrouter_config_create(
                        conf_obj)
                    print 'Created.UUID is %s' % (result)
                return
            except RefsExistError:
                print "Already created!"

        if self._args.oper != "add":
            conf_obj = GlobalVrouterConfig()
        else:
            conf_obj = GlobalVrouterConfig(
                flow_export_rate=self._args.flow_export_rate)
        result = self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s' % (result)

    # end __init__

    def _parse_args(self, args_str):
        '''
        Eg. python provision_global_vrouter_config.py 
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --flow_export_rate 10 
                                        --oper <add | delete>
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c",
                                 "--conf_file",
                                 help="Specify config file",
                                 metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'oper': 'add',
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                            help="Use SSL to connect with API server")
        parser.add_argument("--flow_export_rate",
                            type=int,
                            required=True,
                            help="Flow export rate to the collector")
        parser.add_argument(
            "--oper",
            default='add',
            choices=['add', 'delete'],
            help="Provision operation to be done(add or delete)")
        parser.add_argument("--admin_user", help="Name of keystone admin user")
        parser.add_argument("--admin_password",
                            help="Password of keystone admin user")
        parser.add_argument("--admin_tenant_name",
                            help="Tenant name for keystone admin user")
        group = parser.add_mutually_exclusive_group()
        group.add_argument("--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                           default=False,
                           help="Connect to local api-server on admin port",
                           action="store_true")

        self._args = parser.parse_args(remaining_argv)
Beispiel #2
0
class EncapsulationProvision(object):
    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user,
            self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port,
            '/',
            api_server_use_ssl=self._args.api_server_use_ssl)
        encap_obj = EncapsulationPrioritiesType(
            encapsulation=self._args.encap_priority.split(","))
        try:
            current_config = self._vnc_lib.global_vrouter_config_read(fq_name=[
                'default-global-system-config', 'default-global-vrouter-config'
            ])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    conf_obj = GlobalVrouterConfig(
                        encapsulation_priorities=encap_obj,
                        vxlan_network_identifier_mode=self._args.
                        vxlan_vn_id_mode)
                    result = self._vnc_lib.global_vrouter_config_create(
                        conf_obj)
                    print 'Created.UUID is %s' % (result)
                return
            except RefsExistError:
                print "Already created!"

        current_linklocal = current_config.get_linklocal_services()
        encapsulation_priorities = encap_obj
        vxlan_network_identifier_mode = current_config.get_vxlan_network_identifier_mode(
        )
        if self._args.oper != "add":
            encap_obj = EncapsulationPrioritiesType(encapsulation=[])
            conf_obj = GlobalVrouterConfig(
                linklocal_services=current_linklocal,
                encapsulation_priorities=encap_obj)
        else:
            conf_obj = GlobalVrouterConfig(
                linklocal_services=current_linklocal,
                encapsulation_priorities=encapsulation_priorities,
                vxlan_network_identifier_mode=self._args.vxlan_vn_id_mode)
        result = self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s' % (result)

    # end __init__

    def _parse_args(self, args_str):
        '''
        Eg. python provision_encap.py 
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --encap_priority "MPLSoUDP,MPLSoGRE,VXLAN"
                                        --vxlan_vn_id_mode "automatic"
                                        --oper <add | delete>
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c",
                                 "--conf_file",
                                 help="Specify config file",
                                 metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'oper': 'add',
            'encap_priority': 'MPLSoUDP,MPLSoGRE,VXLAN',
            'vxlan_vn_id_mode': 'automatic'
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.RawDescriptionHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                            help="Use SSL to connect with API server")
        parser.add_argument("--encap_priority",
                            help="List of Encapsulation priority",
                            required=True)
        parser.add_argument("--vxlan_vn_id_mode",
                            help="Virtual Network id type to be used")
        parser.add_argument(
            "--oper",
            default='add',
            help="Provision operation to be done(add or delete)")
        parser.add_argument("--admin_user", help="Name of keystone admin user")
        parser.add_argument("--admin_password",
                            help="Password of keystone admin user")
        parser.add_argument("--admin_tenant_name",
                            help="Tenant name for keystone admin user")
        group = parser.add_mutually_exclusive_group()
        group.add_argument("--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                           default=False,
                           help="Connect to local api-server on admin port",
                           action="store_true")

        self._args = parser.parse_args(remaining_argv)
        if not self._args.encap_priority:
            parser.error('encap_priority is required')
Beispiel #3
0
class MetadataProvisioner(object):

    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user, self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port, '/',
            api_server_use_ssl=self._args.api_server_use_ssl)
        
        linklocal_obj=LinklocalServiceEntryType(
                 linklocal_service_name=self._args.linklocal_service_name,
                 linklocal_service_ip=self._args.linklocal_service_ip,
                 linklocal_service_port=self._args.linklocal_service_port,
                 ip_fabric_DNS_service_name=self._args.ipfabric_dns_service_name,
                 ip_fabric_service_port=self._args.ipfabric_service_port)
        if self._args.ipfabric_service_ip:
            linklocal_obj.ip_fabric_service_ip=[self._args.ipfabric_service_ip]

        try:
            current_config=self._vnc_lib.global_vrouter_config_read(
                                fq_name=['default-global-system-config',
                                         'default-global-vrouter-config'])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    linklocal_services_obj=LinklocalServicesTypes([linklocal_obj])
                    conf_obj=GlobalVrouterConfig(linklocal_services=linklocal_services_obj)
                    result=self._vnc_lib.global_vrouter_config_create(conf_obj)
                    print 'Created.UUID is %s'%(result)
                return
            except RefsExistError:
                print "Already created!"

        current_linklocal=current_config.get_linklocal_services()
        if current_linklocal is None:
            obj = {'linklocal_service_entry': []}
        else:
            obj = current_linklocal.__dict__
        new_linklocal=[]
        for key, value in obj.iteritems():
            found=False
            for vl in value:
                entry = vl.__dict__
                if ('linklocal_service_name' in entry and
                    entry['linklocal_service_name'] == self._args.linklocal_service_name):
                    if self._args.oper == "add":
                        new_linklocal.append(linklocal_obj)
                    found=True
                else:
                    new_linklocal.append(vl)
            if not found and self._args.oper == "add":
                new_linklocal.append(linklocal_obj)
            obj[key] = new_linklocal
        
        conf_obj=GlobalVrouterConfig(linklocal_services=obj)
        result=self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s'%(result)

    # end __init__
    
    def _parse_args(self, args_str):
        '''
        Eg. python provision_metadata.py 
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --linklocal_service_name name
                                        --linklocal_service_ip 1.2.3.4
                                        --linklocal_service_port 1234
                                        --ipfabric_dns_service_name fabric_server_name
                                        --ipfabric_service_ip 10.1.1.1
                                        --ipfabric_service_port 5775
                                        --oper <add | delete>
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c", "--conf_file",
                                 help="Specify config file", metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'linklocal_service_name': '',
            'linklocal_service_ip': '',
            'linklocal_service_port': 0,
            'ipfabric_dns_service_name': '',
            'ipfabric_service_ip': [],
            'ipfabric_service_port': 0,
            'oper': 'add',
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.RawDescriptionHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                        help="Use SSL to connect with API server")
        parser.add_argument(
            "--linklocal_service_name", help="Service Name")
        parser.add_argument(
            "--linklocal_service_ip", help="Link Local Service IP")
        parser.add_argument(
            "--linklocal_service_port", type=int, help="Link Local Service Port")
        parser.add_argument(
            "--ipfabric_dns_service_name", help="IP Fabric DNS Service Name")
        parser.add_argument(
            "--ipfabric_service_ip", help="IP Fabric Service IP")
        parser.add_argument(
            "--ipfabric_service_port", type=int, help="IP Fabric Service Port")
        parser.add_argument(
            "--oper", default='add', help="Provision operation to be done(add or delete)")
        parser.add_argument(
            "--admin_tenant_name", help="Tenant to create the Link Local Service")
        parser.add_argument(
            "--admin_user", help="Name of keystone admin user")
        parser.add_argument(
            "--admin_password", help="Password of keystone admin user")
        group = parser.add_mutually_exclusive_group()
        group.add_argument(
            "--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                            default=False,
                            help = "Connect to local api-server on admin port",
                            action="store_true")

        self._args = parser.parse_args(remaining_argv)
        if not self._args.linklocal_service_name:
            parser.error('linklocal_service_name is required')
class GlobalVrouterConfigProvisioner(object):
    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user,
            self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port,
            '/',
            api_server_use_ssl=self._args.api_server_use_ssl)

        port_trans_pool_list = []
        if self._args.snat_list:
            port = None
            protocol = None
            for proto_port in self._args.snat_list:
                port_count = ''
                port_range_obj = None
                protocol = proto_port.split(':')[0]
                port = proto_port.split(':')[1]
                if '-' in port:
                    port_range_obj = PortType(start_port=int(
                        port.split('-')[0]),
                                              end_port=int(port.split('-')[1]))
                else:
                    port_count = port

                port_trans_pool_obj = PortTranslationPool(
                    protocol=protocol,
                    port_range=port_range_obj,
                    port_count=port_count)
                port_trans_pool_list.append(port_trans_pool_obj)

        port_trans_pools_obj = PortTranslationPools(port_trans_pool_list)

        try:
            current_config = self._vnc_lib.global_vrouter_config_read(fq_name=[
                'default-global-system-config', 'default-global-vrouter-config'
            ])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    conf_obj = GlobalVrouterConfig(
                        flow_export_rate=self._args.flow_export_rate)
                    conf_obj.set_port_translation_pools(port_trans_pools_obj)
                    result = self._vnc_lib.global_vrouter_config_create(
                        conf_obj)
                    print('Created.UUID is %s' % (result))
                return
            except RefsExistError:
                print("Already created!")

        existing_snat_pools = current_config.get_port_translation_pools()
        if not existing_snat_pools:
            existing_snat_pools = PortTranslationPools([])
        if port_trans_pool_list:
            for snat_pool in port_trans_pool_list:
                if not self.check_dup_snat_pool(snat_pool,
                                                existing_snat_pools):
                    existing_snat_pools.add_port_translation_pool(snat_pool)

        if self._args.oper != "add":
            conf_obj = GlobalVrouterConfig()
        else:
            conf_obj = GlobalVrouterConfig(
                flow_export_rate=self._args.flow_export_rate)
            conf_obj.set_port_translation_pools(existing_snat_pools)

        result = self._vnc_lib.global_vrouter_config_update(conf_obj)
        print('Updated.%s' % (result))

    # end __init__

    def check_dup_snat_pool(self, snat_pool, existing_snat_pools):
        for pool_obj in existing_snat_pools.get_port_translation_pool():
            if snat_pool.get_port_count() and pool_obj.get_port_count():
                if snat_pool.get_port_count() == pool_obj.get_port_count() and \
                    snat_pool.get_protocol() == pool_obj.get_protocol():
                    return True
            elif snat_pool.get_port_range() and pool_obj.get_port_range():
                if snat_pool.get_protocol() == pool_obj.get_protocol() and \
                    snat_pool.get_port_range().start_port == pool_obj.get_port_range().start_port and \
                    snat_pool.get_port_range().end_port == pool_obj.get_port_range().end_port:
                    return True
        return False

    def _parse_args(self, args_str):
        '''
        Eg. python provision_global_vrouter_config.py
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --flow_export_rate 10
                                        --oper <add | delete>
                                        --snat_list tcp:6000-7000 udp:500
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c",
                                 "--conf_file",
                                 help="Specify config file",
                                 metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'oper': 'add',
            'snat_list': None
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = configparser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                            help="Use SSL to connect with API server")
        parser.add_argument("--flow_export_rate",
                            type=int,
                            required=True,
                            help="Flow export rate to the collector")
        parser.add_argument(
            "--oper",
            default='add',
            choices=['add', 'delete'],
            help="Provision operation to be done(add or delete)")
        parser.add_argument("--admin_user", help="Name of keystone admin user")
        parser.add_argument("--admin_password",
                            help="Password of keystone admin user")
        parser.add_argument("--admin_tenant_name",
                            help="Tenant name for keystone admin user")
        parser.add_argument(
            "--snat_list",
            help="Protocol port range or port count list for distributed snat",
            nargs='+',
            type=str)
        group = parser.add_mutually_exclusive_group()
        group.add_argument("--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                           default=False,
                           help="Connect to local api-server on admin port",
                           action="store_true")
        self._args = parser.parse_args(remaining_argv)
class GlobalVrouterConfigProvisioner(object):

    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user, self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port, '/',
            api_server_use_ssl=self._args.api_server_use_ssl)
        try:
            current_config=self._vnc_lib.global_vrouter_config_read(
                                fq_name=['default-global-system-config',
                                         'default-global-vrouter-config'])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    conf_obj=GlobalVrouterConfig(flow_export_rate=self._args.flow_export_rate)
                    result=self._vnc_lib.global_vrouter_config_create(conf_obj)
                    print 'Created.UUID is %s'%(result)
                return
            except RefsExistError:
                print "Already created!"

        if self._args.oper != "add":
            conf_obj=GlobalVrouterConfig()
        else :  
            conf_obj=GlobalVrouterConfig(flow_export_rate=self._args.flow_export_rate)
        result=self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s'%(result)

    # end __init__
    
    def _parse_args(self, args_str):
        '''
        Eg. python provision_global_vrouter_config.py 
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --flow_export_rate 10 
                                        --oper <add | delete>
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c", "--conf_file",
                                 help="Specify config file", metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'oper': 'add',
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                        help="Use SSL to connect with API server")
        parser.add_argument(
            "--flow_export_rate", type=int, required=True,
            help="Flow export rate to the collector")
        parser.add_argument(
            "--oper", default='add', choices=['add', 'delete'],
            help="Provision operation to be done(add or delete)")
	parser.add_argument(
            "--admin_user", help="Name of keystone admin user")
        parser.add_argument(
            "--admin_password", help="Password of keystone admin user")
        parser.add_argument(
            "--admin_tenant_name", help="Tenant name for keystone admin user")
        group = parser.add_mutually_exclusive_group()
        group.add_argument(
            "--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                            default=False,
                            help = "Connect to local api-server on admin port",
                            action="store_true")

        self._args = parser.parse_args(remaining_argv)
class GlobalVrouterConfigProvisioner(object):

    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user, self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port, '/',
            api_server_use_ssl=self._args.api_server_use_ssl)

        port_trans_pool_list = []
        if self._args.snat_list:
            port=None
            protocol=None
            for proto_port in self._args.snat_list:
                port_count=''
                port_range_obj=None
                protocol = proto_port.split(':')[0]
                port = proto_port.split(':')[1]
                if '-' in port:
                    port_range_obj = PortType(start_port=int(port.split('-')[0]),
                                              end_port=int(port.split('-')[1]))
                else:
                    port_count = port

                port_trans_pool_obj = PortTranslationPool(protocol = protocol,
                                                          port_range = port_range_obj,
                                                          port_count = port_count)
                port_trans_pool_list.append(port_trans_pool_obj)

        port_trans_pools_obj = PortTranslationPools(port_trans_pool_list)

        try:
            current_config=self._vnc_lib.global_vrouter_config_read(
                                fq_name=['default-global-system-config',
                                         'default-global-vrouter-config'])
        except Exception as e:
            try:
                if self._args.oper == "add":
                    conf_obj=GlobalVrouterConfig(flow_export_rate=self._args.flow_export_rate)
                    conf_obj.set_port_translation_pools(port_trans_pools_obj)
                    result=self._vnc_lib.global_vrouter_config_create(conf_obj)
                    print 'Created.UUID is %s'%(result)
                return
            except RefsExistError:
                print "Already created!"

        existing_snat_pools = current_config.get_port_translation_pools()
        if not existing_snat_pools:
             existing_snat_pools = PortTranslationPools([])
        if port_trans_pool_list:
            for snat_pool in port_trans_pool_list:
                if not self.check_dup_snat_pool(snat_pool, existing_snat_pools):
                    existing_snat_pools.add_port_translation_pool(snat_pool)

        if self._args.oper != "add":
            conf_obj=GlobalVrouterConfig()
        else:
            conf_obj=GlobalVrouterConfig(flow_export_rate=self._args.flow_export_rate)
            conf_obj.set_port_translation_pools(existing_snat_pools)

        result=self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s'%(result)
    # end __init__

    def check_dup_snat_pool(self, snat_pool, existing_snat_pools):
        for pool_obj in existing_snat_pools.get_port_translation_pool():
            if snat_pool.get_port_count() and pool_obj.get_port_count():
                if snat_pool.get_port_count() == pool_obj.get_port_count() and \
                    snat_pool.get_protocol() == pool_obj.get_protocol():
                    return True
            elif snat_pool.get_port_range() and pool_obj.get_port_range():
                if snat_pool.get_protocol() == pool_obj.get_protocol() and \
                    snat_pool.get_port_range().start_port == pool_obj.get_port_range().start_port and \
                    snat_pool.get_port_range().end_port == pool_obj.get_port_range().end_port:
                    return True
        return False

    def _parse_args(self, args_str):
        '''
        Eg. python provision_global_vrouter_config.py
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --flow_export_rate 10
                                        --oper <add | delete>
                                        --snat_list tcp:6000-7000 udp:500
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c", "--conf_file",
                                 help="Specify config file", metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'oper': 'add',
            'snat_list': None
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                        help="Use SSL to connect with API server")
        parser.add_argument(
            "--flow_export_rate", type=int, required=True,
            help="Flow export rate to the collector")
        parser.add_argument(
            "--oper", default='add', choices=['add', 'delete'],
            help="Provision operation to be done(add or delete)")
        parser.add_argument(
            "--admin_user", help="Name of keystone admin user")
        parser.add_argument(
            "--admin_password", help="Password of keystone admin user")
        parser.add_argument(
            "--admin_tenant_name", help="Tenant name for keystone admin user")
        parser.add_argument(
            "--snat_list", help="Protocol port range or port count list for distributed snat",
            nargs='+', type=str)
        group = parser.add_mutually_exclusive_group()
        group.add_argument(
            "--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                            default=False,
                            help = "Connect to local api-server on admin port",
                            action="store_true")
        self._args = parser.parse_args(remaining_argv)
class MetadataProvisioner(object):

    def __init__(self, args_str=None):
        self._args = None
        if not args_str:
            args_str = ' '.join(sys.argv[1:])
        self._parse_args(args_str)

        self._vnc_lib = VncApiAdmin(
            self._args.use_admin_api,
            self._args.admin_user, self._args.admin_password,
            self._args.admin_tenant_name,
            self._args.api_server_ip,
            self._args.api_server_port, '/',
            api_server_use_ssl=self._args.api_server_use_ssl)
        
        linklocal_obj=LinklocalServiceEntryType(
                 linklocal_service_name=self._args.linklocal_service_name,
                 linklocal_service_ip=self._args.linklocal_service_ip,
                 linklocal_service_port=self._args.linklocal_service_port,
                 ip_fabric_DNS_service_name=self._args.ipfabric_dns_service_name,
                 ip_fabric_service_port=self._args.ipfabric_service_port)
        if self._args.ipfabric_service_ip:
            linklocal_obj.ip_fabric_service_ip=[self._args.ipfabric_service_ip]

        try:
            if self._args.oper == "add":
                linklocal_services_obj = LinklocalServicesTypes([linklocal_obj])
                conf_obj = GlobalVrouterConfig(linklocal_services=linklocal_services_obj)
                result = self._vnc_lib.global_vrouter_config_create(conf_obj)
                print 'Created.UUID is %s'%(result)
                return
        except RefsExistError:
            print "Already created! Updating the object."
            sleep(5)

        current_config = self._vnc_lib.global_vrouter_config_read(
                fq_name=['default-global-system-config', 'default-global-vrouter-config'])
        current_linklocal=current_config.get_linklocal_services()
        if current_linklocal is None:
            obj = {'linklocal_service_entry': []}
        else:
            obj = current_linklocal.__dict__
        new_linklocal=[]
        for key, value in obj.iteritems():
            found=False
            for vl in value:
                entry = vl.__dict__
                if ('linklocal_service_name' in entry and
                    entry['linklocal_service_name'] == self._args.linklocal_service_name):
                    if self._args.oper == "add":
                        new_linklocal.append(linklocal_obj)
                    found=True
                else:
                    new_linklocal.append(vl)
            if not found and self._args.oper == "add":
                new_linklocal.append(linklocal_obj)
            obj[key] = new_linklocal
        
        conf_obj=GlobalVrouterConfig(linklocal_services=obj)
        result=self._vnc_lib.global_vrouter_config_update(conf_obj)
        print 'Updated.%s'%(result)

    # end __init__
    
    def _parse_args(self, args_str):
        '''
        Eg. python provision_metadata.py 
                                        --api_server_ip 127.0.0.1
                                        --api_server_port 8082
                                        --api_server_use_ssl False
                                        --linklocal_service_name name
                                        --linklocal_service_ip 1.2.3.4
                                        --linklocal_service_port 1234
                                        --ipfabric_dns_service_name fabric_server_name
                                        --ipfabric_service_ip 10.1.1.1
                                        --ipfabric_service_port 5775
                                        --oper <add | delete>
        '''

        # Source any specified config/ini file
        # Turn off help, so we print all options in response to -h
        conf_parser = argparse.ArgumentParser(add_help=False)

        conf_parser.add_argument("-c", "--conf_file",
                                 help="Specify config file", metavar="FILE")
        args, remaining_argv = conf_parser.parse_known_args(args_str.split())

        defaults = {
            'api_server_ip': '127.0.0.1',
            'api_server_port': '8082',
            'api_server_use_ssl': False,
            'linklocal_service_name': '',
            'linklocal_service_ip': '',
            'linklocal_service_port': 0,
            'ipfabric_dns_service_name': '',
            'ipfabric_service_ip': [],
            'ipfabric_service_port': 0,
            'oper': 'add',
        }
        ksopts = {
            'admin_user': '******',
            'admin_password': '******',
            'admin_tenant_name': 'admin'
        }

        if args.conf_file:
            config = ConfigParser.SafeConfigParser()
            config.read([args.conf_file])
            defaults.update(dict(config.items("DEFAULTS")))
            if 'KEYSTONE' in config.sections():
                ksopts.update(dict(config.items("KEYSTONE")))

        # Override with CLI options
        # Don't surpress add_help here so it will handle -h
        parser = argparse.ArgumentParser(
            # Inherit options from config_parser
            parents=[conf_parser],
            # print script description with -h/--help
            description=__doc__,
            # Don't mess with format of description
            formatter_class=argparse.RawDescriptionHelpFormatter,
        )
        defaults.update(ksopts)
        parser.set_defaults(**defaults)

        parser.add_argument("--api_server_port", help="Port of api server")
        parser.add_argument("--api_server_use_ssl",
                        help="Use SSL to connect with API server")
        parser.add_argument(
            "--linklocal_service_name", help="Service Name")
        parser.add_argument(
            "--linklocal_service_ip", help="Link Local Service IP")
        parser.add_argument(
            "--linklocal_service_port", type=int, help="Link Local Service Port")
        parser.add_argument(
            "--ipfabric_dns_service_name", help="IP Fabric DNS Service Name")
        parser.add_argument(
            "--ipfabric_service_ip", help="IP Fabric Service IP")
        parser.add_argument(
            "--ipfabric_service_port", type=int, help="IP Fabric Service Port")
        parser.add_argument(
            "--oper", default='add', help="Provision operation to be done(add or delete)")
        parser.add_argument(
            "--admin_tenant_name", help="Tenant to create the Link Local Service")
        parser.add_argument(
            "--admin_user", help="Name of keystone admin user")
        parser.add_argument(
            "--admin_password", help="Password of keystone admin user")
        group = parser.add_mutually_exclusive_group()
        group.add_argument(
            "--api_server_ip", help="IP address of api server")
        group.add_argument("--use_admin_api",
                            default=False,
                            help = "Connect to local api-server on admin port",
                            action="store_true")

        self._args = parser.parse_args(remaining_argv)
        if not self._args.linklocal_service_name:
            parser.error('linklocal_service_name is required')