def setUp(self): super(TestAPI, self).setUp() self.compute_api = api.API(self.context) self.container = objects.Container(self.context, **utils.get_test_container()) self.network = objects.Network(self.context, **utils.get_test_network())
def test_create(self): with mock.patch.object(self.dbapi, 'create_network', autospec=True) as mock_create_network: mock_create_network.return_value = self.fake_network network = objects.Network(self.context, **self.fake_network) network.create(self.context) mock_create_network.assert_called_once_with( self.context, self.fake_network) self.assertEqual(self.context, network._context)
def post(self, **network_dict): """Create a new network. :param network_dict: a network within the request body. """ context = pecan.request.context policy.enforce(context, "network:create", action="network:create") network_dict['project_id'] = context.project_id network_dict['user_id'] = context.user_id new_network = objects.Network(context, **network_dict) new_network.create(context) pecan.request.compute_api.network_create(context, new_network) return view.format_network(pecan.request.host_url, new_network)
def create_network(self, name, neutron_net_id): """Create a docker network with Kuryr driver. The docker network to be created will be based on the specified neutron net. It is assumed that the neutron net will have one or two subnets. If there are two subnets, it must be a ipv4 subnet and a ipv6 subnet and containers created from this network will have both ipv4 and ipv6 addresses. What this method does is finding the subnets under the specified neutron net, retrieving the cidr, gateway of each subnet, and compile the list of parameters for docker.create_network. """ # find a v4 and/or v6 subnet of the network shared = \ self.neutron_api.get_neutron_network(neutron_net_id)[ 'shared'] subnets = self.neutron_api.list_subnets(network_id=neutron_net_id) subnets = subnets.get('subnets', []) v4_subnet = self._get_subnet(subnets, ip_version=4) v6_subnet = self._get_subnet(subnets, ip_version=6) if not v4_subnet and not v6_subnet: raise exception.ZunException( _("The Neutron network %s has no subnet") % neutron_net_id) # IPAM driver specific options ipam_options = { "Driver": CONF.network.driver_name, "Options": { 'neutron.net.shared': str(shared) }, "Config": [] } # Driver specific options options = { 'neutron.net.uuid': neutron_net_id, 'neutron.net.shared': str(shared) } if v4_subnet: ipam_options['Options']['neutron.subnet.uuid'] = \ v4_subnet.get('id') ipam_options["Config"].append({ "Subnet": v4_subnet['cidr'], "Gateway": v4_subnet['gateway_ip'] }) options['neutron.subnet.uuid'] = v4_subnet.get('id') if v6_subnet: ipam_options['Options']['neutron.subnet.v6.uuid'] = \ v6_subnet.get('id') ipam_options["Config"].append({ "Subnet": v6_subnet['cidr'], "Gateway": v6_subnet['gateway_ip'] }) options['neutron.subnet.v6.uuid'] = v6_subnet.get('id') network_dict = {} network_dict['project_id'] = self.context.project_id network_dict['user_id'] = self.context.user_id network_dict['name'] = name network_dict['neutron_net_id'] = neutron_net_id network = objects.Network(self.context, **network_dict) # The DB model has unique constraint on 'neutron_net_id' field # which will guarantee only one request can create the network in here # (and call docker.create_network later) if there are concurrent # requests on creating networks for the same neutron net. network.create(self.context) LOG.debug( "Calling docker.create_network to create network %s, " "ipam_options %s, options %s", name, ipam_options, options) try: docker_network = self.docker.create_network( name=name, driver=CONF.network.driver_name, enable_ipv6=True if v6_subnet else False, options=options, ipam=ipam_options) except Exception: with excutils.save_and_reraise_exception(): network.destroy() network.network_id = docker_network['Id'] network.save() return network
def create_network(self, name, neutron_net_id): """Create a docker network with Kuryr driver. The docker network to be created will be based on the specified neutron net. It is assumed that the neutron net will have one or two subnets. If there are two subnets, it must be a ipv4 subnet and a ipv6 subnet and containers created from this network will have both ipv4 and ipv6 addresses. What this method does is finding the subnets under the specified neutron net, retrieving the cidr, gateway of each subnet, and compile the list of parameters for docker.create_network. """ # find a v4 and/or v6 subnet of the network shared = \ self.neutron_api.get_neutron_network(neutron_net_id)[ 'shared'] subnets = self.neutron_api.list_subnets(network_id=neutron_net_id) subnets = subnets.get('subnets', []) v4_subnet = self._get_subnet(subnets, ip_version=4) v6_subnet = self._get_subnet(subnets, ip_version=6) if not v4_subnet and not v6_subnet: raise exception.ZunException( _("The Neutron network %s has no subnet") % neutron_net_id) # IPAM driver specific options ipam_options = { "Driver": CONF.network.driver_name, "Options": { 'neutron.net.shared': str(shared) }, "Config": [] } # Driver specific options options = { 'neutron.net.uuid': neutron_net_id, 'neutron.net.shared': str(shared) } if v4_subnet: ipam_options['Options']['neutron.subnet.uuid'] = \ v4_subnet.get('id') ipam_options["Config"].append({ "Subnet": v4_subnet['cidr'], "Gateway": v4_subnet['gateway_ip'] }) options['neutron.subnet.uuid'] = v4_subnet.get('id') if v6_subnet: ipam_options['Options']['neutron.subnet.v6.uuid'] = \ v6_subnet.get('id') ipam_options["Config"].append({ "Subnet": v6_subnet['cidr'], "Gateway": v6_subnet['gateway_ip'] }) options['neutron.subnet.v6.uuid'] = v6_subnet.get('id') network_dict = {} network_dict['project_id'] = self.context.project_id network_dict['user_id'] = self.context.user_id network_dict['name'] = name network_dict['neutron_net_id'] = neutron_net_id network = objects.Network(self.context, **network_dict) for attempt in (1, 2, 3): LOG.debug("Attempt (%s) to create network: %s", attempt, network) created_network = self._create_network_attempt( network, options, ipam_options) if created_network: return created_network time.sleep(1) raise exception.ZunException( _("Cannot create docker network after several attempts %s"))