Stephen Finucane 30a64579b6 compute: Migrate 'server create' to SDK
The final step. Future changes will clean up the remnants of the
novaclient usage. This is a rather large patch, owing to the number of
things that novaclient was handling for us which SDK does not, but the
combination of unit and functional tests mean we should be handling
all of these differences.

Change-Id: I623e8c772235438a3d1590e1bbd832748d6e62ea
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
2024-07-09 18:17:22 +01:00

2286 lines
69 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
from random import choice
from random import randint
from unittest import mock
import uuid
from openstack.network.v2 import _proxy
from openstack.network.v2 import address_group as _address_group
from openstack.network.v2 import address_scope as _address_scope
from openstack.network.v2 import agent as network_agent
from openstack.network.v2 import auto_allocated_topology as allocated_topology
from openstack.network.v2 import availability_zone as _availability_zone
from openstack.network.v2 import extension as _extension
from openstack.network.v2 import flavor as _flavor
from openstack.network.v2 import local_ip as _local_ip
from openstack.network.v2 import local_ip_association as _local_ip_association
from openstack.network.v2 import ndp_proxy as _ndp_proxy
from openstack.network.v2 import network as _network
from openstack.network.v2 import network_ip_availability as _ip_availability
from openstack.network.v2 import network_segment_range as _segment_range
from openstack.network.v2 import port as _port
from openstack.network.v2 import rbac_policy as network_rbac
from openstack.network.v2 import security_group as _security_group
from openstack.network.v2 import segment as _segment
from openstack.network.v2 import service_profile as _service_profile
from openstack.network.v2 import trunk as _trunk
from openstackclient.tests.unit import fakes
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
from openstackclient.tests.unit import utils
QUOTA = {
"subnet": 10,
"network": 10,
"floatingip": 50,
"subnetpool": -1,
"security_group_rule": 100,
"security_group": 10,
"router": 10,
"rbac_policy": -1,
"port": 50,
"vip": 10,
"member": 10,
"healthmonitor": 10,
"l7policy": 5,
}
RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth-limit'
RULE_TYPE_DSCP_MARKING = 'dscp-marking'
RULE_TYPE_MINIMUM_BANDWIDTH = 'minimum-bandwidth'
RULE_TYPE_MINIMUM_PACKET_RATE = 'minimum-packet-rate'
VALID_QOS_RULES = [
RULE_TYPE_BANDWIDTH_LIMIT,
RULE_TYPE_DSCP_MARKING,
RULE_TYPE_MINIMUM_BANDWIDTH,
RULE_TYPE_MINIMUM_PACKET_RATE,
]
VALID_DSCP_MARKS = [
0,
8,
10,
12,
14,
16,
18,
20,
22,
24,
26,
28,
30,
32,
34,
36,
38,
40,
46,
48,
56,
]
class FakeClientMixin:
def setUp(self):
super().setUp()
self.app.client_manager.network = mock.Mock(spec=_proxy.Proxy)
self.network_client = self.app.client_manager.network
class TestNetworkV2(
identity_fakes.FakeClientMixin,
FakeClientMixin,
utils.TestCommand,
): ...
def create_one_extension(attrs=None):
"""Create a fake extension.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An Extension object with name, namespace, etc.
"""
attrs = attrs or {}
# Set default attributes.
extension_info = {
'name': 'name-' + uuid.uuid4().hex,
'description': 'description-' + uuid.uuid4().hex,
'alias': 'Dystopian',
'links': [],
'updated_at': '2013-07-09T12:00:0-00:00',
}
# Overwrite default attributes.
extension_info.update(attrs)
extension = _extension.Extension(**extension_info)
return extension
class FakeNetworkQosPolicy:
"""Fake one or more QoS policies."""
@staticmethod
def create_one_qos_policy(attrs=None):
"""Create a fake QoS policy.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
qos_id = attrs.get('id') or 'qos-policy-id-' + uuid.uuid4().hex
rule_attrs = {'qos_policy_id': qos_id}
rules = [FakeNetworkQosRule.create_one_qos_rule(rule_attrs)]
# Set default attributes.
qos_policy_attrs = {
'name': 'qos-policy-name-' + uuid.uuid4().hex,
'id': qos_id,
'is_default': False,
'project_id': 'project-id-' + uuid.uuid4().hex,
'shared': False,
'description': 'qos-policy-description-' + uuid.uuid4().hex,
'rules': rules,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
qos_policy_attrs.update(attrs)
qos_policy = fakes.FakeResource(
info=copy.deepcopy(qos_policy_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
qos_policy.is_shared = qos_policy_attrs['shared']
return qos_policy
@staticmethod
def create_qos_policies(attrs=None, count=2):
"""Create multiple fake QoS policies.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of QoS policies to fake
:return:
A list of FakeResource objects faking the QoS policies
"""
qos_policies = []
for i in range(0, count):
qos_policies.append(
FakeNetworkQosPolicy.create_one_qos_policy(attrs)
)
return qos_policies
@staticmethod
def get_qos_policies(qos_policies=None, count=2):
"""Get an iterable MagicMock object with a list of faked QoS policies.
If qos policies list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List qos_policies:
A list of FakeResource objects faking qos policies
:param int count:
The number of QoS policies to fake
:return:
An iterable Mock object with side_effect set to a list of faked
QoS policies
"""
if qos_policies is None:
qos_policies = FakeNetworkQosPolicy.create_qos_policies(count)
return mock.Mock(side_effect=qos_policies)
class FakeNetworkSecGroup:
"""Fake one security group."""
@staticmethod
def create_one_security_group(attrs=None):
"""Create a fake security group.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
sg_id = attrs.get('id') or 'security-group-id-' + uuid.uuid4().hex
# Set default attributes.
security_group_attrs = {
'name': 'security-group-name-' + uuid.uuid4().hex,
'id': sg_id,
'project_id': 'project-id-' + uuid.uuid4().hex,
'description': 'security-group-description-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
security_group = fakes.FakeResource(
info=copy.deepcopy(security_group_attrs), loaded=True
)
return security_group
class FakeNetworkQosRule:
"""Fake one or more Network QoS rules."""
@staticmethod
def create_one_qos_rule(attrs=None):
"""Create a fake Network QoS rule.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
type = attrs.get('type') or choice(VALID_QOS_RULES)
qos_rule_attrs = {
'id': 'qos-rule-id-' + uuid.uuid4().hex,
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'type': type,
'location': 'MUNCHMUNCHMUNCH',
}
if type == RULE_TYPE_BANDWIDTH_LIMIT:
qos_rule_attrs['max_kbps'] = randint(1, 10000)
qos_rule_attrs['max_burst_kbits'] = randint(1, 10000)
qos_rule_attrs['direction'] = 'egress'
elif type == RULE_TYPE_DSCP_MARKING:
qos_rule_attrs['dscp_mark'] = choice(VALID_DSCP_MARKS)
elif type == RULE_TYPE_MINIMUM_BANDWIDTH:
qos_rule_attrs['min_kbps'] = randint(1, 10000)
qos_rule_attrs['direction'] = 'egress'
elif type == RULE_TYPE_MINIMUM_PACKET_RATE:
qos_rule_attrs['min_kpps'] = randint(1, 10000)
qos_rule_attrs['direction'] = 'egress'
# Overwrite default attributes.
qos_rule_attrs.update(attrs)
qos_rule = fakes.FakeResource(
info=copy.deepcopy(qos_rule_attrs), loaded=True
)
return qos_rule
@staticmethod
def create_qos_rules(attrs=None, count=2):
"""Create multiple fake Network QoS rules.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of Network QoS rule to fake
:return:
A list of FakeResource objects faking the Network QoS rules
"""
qos_rules = []
for i in range(0, count):
qos_rules.append(FakeNetworkQosRule.create_one_qos_rule(attrs))
return qos_rules
@staticmethod
def get_qos_rules(qos_rules=None, count=2):
"""Get a list of faked Network QoS rules.
If Network QoS rules list is provided, then initialize the Mock
object with the list. Otherwise create one.
:param List qos_rules:
A list of FakeResource objects faking Network QoS rules
:param int count:
The number of QoS minimum bandwidth rules to fake
:return:
An iterable Mock object with side_effect set to a list of faked
qos minimum bandwidth rules
"""
if qos_rules is None:
qos_rules = FakeNetworkQosRule.create_qos_rules(count)
return mock.Mock(side_effect=qos_rules)
class FakeNetworkQosRuleType:
"""Fake one or more Network QoS rule types."""
@staticmethod
def create_one_qos_rule_type(attrs=None):
"""Create a fake Network QoS rule type.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
qos_rule_type_attrs = {
'type': 'rule-type-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
qos_rule_type_attrs.update(attrs)
return fakes.FakeResource(
info=copy.deepcopy(qos_rule_type_attrs), loaded=True
)
@staticmethod
def create_qos_rule_types(attrs=None, count=2):
"""Create multiple fake Network QoS rule types.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of QoS rule types to fake
:return:
A list of FakeResource objects faking the QoS rule types
"""
qos_rule_types = []
for i in range(0, count):
qos_rule_types.append(
FakeNetworkQosRuleType.create_one_qos_rule_type(attrs)
)
return qos_rule_types
class FakeRouter:
"""Fake one or more routers."""
@staticmethod
def create_one_router(attrs=None):
"""Create a fake router.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object, with id, name, admin_state_up,
status, project_id
"""
attrs = attrs or {}
# Set default attributes.
router_attrs = {
'id': 'router-id-' + uuid.uuid4().hex,
'name': 'router-name-' + uuid.uuid4().hex,
'status': 'ACTIVE',
'admin_state_up': True,
'description': 'router-description-' + uuid.uuid4().hex,
'distributed': False,
'ha': False,
'project_id': 'project-id-' + uuid.uuid4().hex,
'routes': [],
'external_gateway_info': {},
'availability_zone_hints': [],
'availability_zones': [],
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
router_attrs.update(attrs)
router = fakes.FakeResource(
info=copy.deepcopy(router_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
router.is_admin_state_up = router_attrs['admin_state_up']
router.is_distributed = router_attrs['distributed']
router.is_ha = router_attrs['ha']
return router
@staticmethod
def create_routers(attrs=None, count=2):
"""Create multiple fake routers.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of routers to fake
:return:
A list of FakeResource objects faking the routers
"""
routers = []
for i in range(0, count):
routers.append(FakeRouter.create_one_router(attrs))
return routers
@staticmethod
def get_routers(routers=None, count=2):
"""Get an iterable Mock object with a list of faked routers.
If routers list is provided, then initialize the Mock object with the
list. Otherwise create one.
:param List routers:
A list of FakeResource objects faking routers
:param int count:
The number of routers to fake
:return:
An iterable Mock object with side_effect set to a list of faked
routers
"""
if routers is None:
routers = FakeRouter.create_routers(count)
return mock.Mock(side_effect=routers)
class FakeSecurityGroup:
"""Fake one or more security groups."""
@staticmethod
def create_one_security_group(attrs=None):
"""Create a fake security group.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object, with id, name, etc.
"""
attrs = attrs or {}
# Set default attributes.
security_group_attrs = {
'id': 'security-group-id-' + uuid.uuid4().hex,
'name': 'security-group-name-' + uuid.uuid4().hex,
'description': 'security-group-description-' + uuid.uuid4().hex,
'stateful': True,
'project_id': 'project-id-' + uuid.uuid4().hex,
'security_group_rules': [],
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
security_group_attrs.update(attrs)
security_group = fakes.FakeResource(
info=copy.deepcopy(security_group_attrs), loaded=True
)
return security_group
@staticmethod
def create_security_groups(attrs=None, count=2):
"""Create multiple fake security groups.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of security groups to fake
:return:
A list of FakeResource objects faking the security groups
"""
security_groups = []
for i in range(0, count):
security_groups.append(
FakeSecurityGroup.create_one_security_group(attrs)
)
return security_groups
@staticmethod
def get_security_groups(security_groups=None, count=2):
"""Get an iterable Mock object with a list of faked security groups.
If security groups list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List security_groups:
A list of FakeResource objects faking security groups
:param int count:
The number of security groups to fake
:return:
An iterable Mock object with side_effect set to a list of faked
security groups
"""
if security_groups is None:
security_groups = FakeSecurityGroup.create_security_groups(count)
return mock.Mock(side_effect=security_groups)
class FakeSecurityGroupRule:
"""Fake one or more security group rules."""
@staticmethod
def create_one_security_group_rule(attrs=None):
"""Create a fake security group rule.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object, with id, etc.
"""
attrs = attrs or {}
# Set default attributes.
security_group_rule_attrs = {
'description': 'security-group-rule-description-'
+ uuid.uuid4().hex,
'direction': 'ingress',
'ether_type': 'IPv4',
'id': 'security-group-rule-id-' + uuid.uuid4().hex,
'port_range_max': None,
'port_range_min': None,
'protocol': None,
'remote_group_id': None,
'remote_address_group_id': None,
'remote_ip_prefix': '0.0.0.0/0',
'security_group_id': 'security-group-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
security_group_rule_attrs.update(attrs)
security_group_rule = fakes.FakeResource(
info=copy.deepcopy(security_group_rule_attrs), loaded=True
)
return security_group_rule
@staticmethod
def create_security_group_rules(attrs=None, count=2):
"""Create multiple fake security group rules.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of security group rules to fake
:return:
A list of FakeResource objects faking the security group rules
"""
security_group_rules = []
for i in range(0, count):
security_group_rules.append(
FakeSecurityGroupRule.create_one_security_group_rule(attrs)
)
return security_group_rules
@staticmethod
def get_security_group_rules(security_group_rules=None, count=2):
"""Get an iterable Mock with a list of faked security group rules.
If security group rules list is provided, then initialize the Mock
object with the list. Otherwise create one.
:param List security_group_rules:
A list of FakeResource objects faking security group rules
:param int count:
The number of security group rules to fake
:return:
An iterable Mock object with side_effect set to a list of faked
security group rules
"""
if security_group_rules is None:
security_group_rules = (
FakeSecurityGroupRule.create_security_group_rules(count)
)
return mock.Mock(side_effect=security_group_rules)
class FakeSubnet:
"""Fake one or more subnets."""
@staticmethod
def create_one_subnet(attrs=None):
"""Create a fake subnet.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object faking the subnet
"""
attrs = attrs or {}
# Set default attributes.
project_id = 'project-id-' + uuid.uuid4().hex
subnet_attrs = {
'id': 'subnet-id-' + uuid.uuid4().hex,
'name': 'subnet-name-' + uuid.uuid4().hex,
'network_id': 'network-id-' + uuid.uuid4().hex,
'cidr': '10.10.10.0/24',
'project_id': project_id,
'enable_dhcp': True,
'dns_nameservers': [],
'allocation_pools': [],
'host_routes': [],
'ip_version': 4,
'gateway_ip': '10.10.10.1',
'ipv6_address_mode': None,
'ipv6_ra_mode': None,
'segment_id': None,
'service_types': [],
'subnetpool_id': None,
'description': 'subnet-description-' + uuid.uuid4().hex,
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
subnet_attrs.update(attrs)
subnet = fakes.FakeResource(
info=copy.deepcopy(subnet_attrs), loaded=True
)
# Set attributes with special mappings in OpenStack SDK.
subnet.is_dhcp_enabled = subnet_attrs['enable_dhcp']
subnet.subnet_pool_id = subnet_attrs['subnetpool_id']
return subnet
@staticmethod
def create_subnets(attrs=None, count=2):
"""Create multiple fake subnets.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of subnets to fake
:return:
A list of FakeResource objects faking the subnets
"""
subnets = []
for i in range(0, count):
subnets.append(FakeSubnet.create_one_subnet(attrs))
return subnets
@staticmethod
def get_subnets(subnets=None, count=2):
"""Get an iterable Mock object with a list of faked subnets.
If subnets list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List subnets:
A list of FakeResource objects faking subnets
:param int count:
The number of subnets to fake
:return:
An iterable Mock object with side_effect set to a list of faked
subnets
"""
if subnets is None:
subnets = FakeSubnet.create_subnets(count)
return mock.Mock(side_effect=subnets)
class FakeFloatingIP:
"""Fake one or more floating ip."""
@staticmethod
def create_one_floating_ip(attrs=None):
"""Create a fake floating ip.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object, with id, ip, and so on
"""
attrs = attrs or {}
# Set default attributes.
floating_ip_attrs = {
'id': 'floating-ip-id-' + uuid.uuid4().hex,
'floating_ip_address': '1.0.9.0',
'fixed_ip_address': '2.0.9.0',
'dns_domain': None,
'dns_name': None,
'status': 'DOWN',
'floating_network_id': 'network-id-' + uuid.uuid4().hex,
'router_id': 'router-id-' + uuid.uuid4().hex,
'port_id': 'port-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'description': 'floating-ip-description-' + uuid.uuid4().hex,
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
floating_ip_attrs.update(attrs)
floating_ip = fakes.FakeResource(
info=copy.deepcopy(floating_ip_attrs), loaded=True
)
return floating_ip
@staticmethod
def create_floating_ips(attrs=None, count=2):
"""Create multiple fake floating ips.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of floating ips to fake
:return:
A list of FakeResource objects faking the floating ips
"""
floating_ips = []
for i in range(0, count):
floating_ips.append(FakeFloatingIP.create_one_floating_ip(attrs))
return floating_ips
@staticmethod
def get_floating_ips(floating_ips=None, count=2):
"""Get an iterable Mock object with a list of faked floating ips.
If floating_ips list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List floating_ips:
A list of FakeResource objects faking floating ips
:param int count:
The number of floating ips to fake
:return:
An iterable Mock object with side_effect set to a list of faked
floating ips
"""
if floating_ips is None:
floating_ips = FakeFloatingIP.create_floating_ips(count)
return mock.Mock(side_effect=floating_ips)
class FakeNetworkMeter:
"""Fake network meter"""
@staticmethod
def create_one_meter(attrs=None):
"""Create metering pool"""
attrs = attrs or {}
meter_attrs = {
'id': 'meter-id-' + uuid.uuid4().hex,
'name': 'meter-name-' + uuid.uuid4().hex,
'description': 'meter-description-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'shared': False,
'location': 'MUNCHMUNCHMUNCH',
}
meter_attrs.update(attrs)
meter = fakes.FakeResource(
info=copy.deepcopy(meter_attrs), loaded=True
)
return meter
@staticmethod
def create_meter(attrs=None, count=2):
"""Create multiple meters"""
meters = []
for i in range(0, count):
meters.append(FakeNetworkMeter.create_one_meter(attrs))
return meters
@staticmethod
def get_meter(meter=None, count=2):
"""Get a list of meters"""
if meter is None:
meter = FakeNetworkMeter.create_meter(count)
return mock.Mock(side_effect=meter)
class FakeNetworkMeterRule:
"""Fake metering rule"""
@staticmethod
def create_one_rule(attrs=None):
"""Create one meter rule"""
attrs = attrs or {}
meter_rule_attrs = {
'id': 'meter-label-rule-id-' + uuid.uuid4().hex,
'direction': 'ingress',
'excluded': False,
'metering_label_id': 'meter-label-id-' + uuid.uuid4().hex,
'remote_ip_prefix': '10.0.0.0/24',
'source_ip_prefix': '8.8.8.8/32',
'destination_ip_prefix': '10.0.0.0/24',
'project_id': 'project-id-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
meter_rule_attrs.update(attrs)
meter_rule = fakes.FakeResource(
info=copy.deepcopy(meter_rule_attrs), loaded=True
)
return meter_rule
@staticmethod
def create_meter_rule(attrs=None, count=2):
"""Create multiple meter rules"""
meter_rules = []
for i in range(0, count):
meter_rules.append(FakeNetworkMeterRule.create_one_rule(attrs))
return meter_rules
@staticmethod
def get_meter_rule(meter_rule=None, count=2):
"""Get a list of meter rules"""
if meter_rule is None:
meter_rule = FakeNetworkMeterRule.create_meter_rule(count)
return mock.Mock(side_effect=meter_rule)
class FakeSubnetPool:
"""Fake one or more subnet pools."""
@staticmethod
def create_one_subnet_pool(attrs=None):
"""Create a fake subnet pool.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object faking the subnet pool
"""
attrs = attrs or {}
# Set default attributes.
subnet_pool_attrs = {
'id': 'subnet-pool-id-' + uuid.uuid4().hex,
'name': 'subnet-pool-name-' + uuid.uuid4().hex,
'prefixes': ['10.0.0.0/24', '10.1.0.0/24'],
'default_prefixlen': '8',
'address_scope_id': 'address-scope-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'is_default': False,
'shared': False,
'max_prefixlen': '32',
'min_prefixlen': '8',
'default_quota': None,
'ip_version': '4',
'description': 'subnet-pool-description-' + uuid.uuid4().hex,
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
subnet_pool_attrs.update(attrs)
subnet_pool = fakes.FakeResource(
info=copy.deepcopy(subnet_pool_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
subnet_pool.default_prefix_length = subnet_pool_attrs[
'default_prefixlen'
]
subnet_pool.is_shared = subnet_pool_attrs['shared']
subnet_pool.maximum_prefix_length = subnet_pool_attrs['max_prefixlen']
subnet_pool.minimum_prefix_length = subnet_pool_attrs['min_prefixlen']
return subnet_pool
@staticmethod
def create_subnet_pools(attrs=None, count=2):
"""Create multiple fake subnet pools.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of subnet pools to fake
:return:
A list of FakeResource objects faking the subnet pools
"""
subnet_pools = []
for i in range(0, count):
subnet_pools.append(FakeSubnetPool.create_one_subnet_pool(attrs))
return subnet_pools
@staticmethod
def get_subnet_pools(subnet_pools=None, count=2):
"""Get an iterable Mock object with a list of faked subnet pools.
If subnet_pools list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List subnet_pools:
A list of FakeResource objects faking subnet pools
:param int count:
The number of subnet pools to fake
:return:
An iterable Mock object with side_effect set to a list of faked
subnet pools
"""
if subnet_pools is None:
subnet_pools = FakeSubnetPool.create_subnet_pools(count)
return mock.Mock(side_effect=subnet_pools)
class FakeNetworkServiceProvider:
"""Fake Network Service Providers"""
@staticmethod
def create_one_network_service_provider(attrs=None):
"""Create service provider"""
attrs = attrs or {}
service_provider = {
'name': 'provider-name-' + uuid.uuid4().hex,
'service_type': 'service-type-' + uuid.uuid4().hex,
'default': False,
'location': 'MUNCHMUNCHMUNCH',
}
service_provider.update(attrs)
provider = fakes.FakeResource(
info=copy.deepcopy(service_provider), loaded=True
)
provider.is_default = service_provider['default']
return provider
@staticmethod
def create_network_service_providers(attrs=None, count=2):
"""Create multiple service providers"""
service_providers = []
for i in range(0, count):
service_providers.append(
FakeNetworkServiceProvider.create_one_network_service_provider(
attrs
)
)
return service_providers
class FakeQuota:
"""Fake quota"""
@staticmethod
def create_one_net_quota(attrs=None):
"""Create one quota"""
attrs = attrs or {}
quota_attrs = {
'floating_ips': 20,
'networks': 25,
'ports': 11,
'rbac_policies': 15,
'routers': 40,
'security_groups': 10,
'security_group_rules': 100,
'subnets': 20,
'subnet_pools': 30,
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
@staticmethod
def create_one_default_net_quota(attrs=None):
"""Create one quota"""
attrs = attrs or {}
quota_attrs = {
'floatingip': 30,
'network': 20,
'port': 10,
'rbac_policy': 25,
'router': 30,
'security_group': 30,
'security_group_rule': 200,
'subnet': 10,
'subnetpool': 20,
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
@staticmethod
def create_one_net_detailed_quota(attrs=None):
"""Create one quota"""
attrs = attrs or {}
quota_attrs = {
'floating_ips': {'used': 0, 'reserved': 0, 'limit': 20},
'networks': {'used': 0, 'reserved': 0, 'limit': 25},
'ports': {'used': 0, 'reserved': 0, 'limit': 11},
'rbac_policies': {'used': 0, 'reserved': 0, 'limit': 15},
'routers': {'used': 0, 'reserved': 0, 'limit': 40},
'security_groups': {'used': 0, 'reserved': 0, 'limit': 10},
'security_group_rules': {'used': 0, 'reserved': 0, 'limit': 100},
'subnets': {'used': 0, 'reserved': 0, 'limit': 20},
'subnet_pools': {'used': 0, 'reserved': 0, 'limit': 30},
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
class FakeFloatingIPPortForwarding:
"""Fake one or more Port forwarding"""
@staticmethod
def create_one_port_forwarding(attrs=None, use_range=False):
"""Create a fake Port Forwarding.
:param Dictionary attrs:
A dictionary with all attributes
:param Boolean use_range:
A boolean which defines if we will use ranges or not
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
floatingip_id = (
attrs.get('floatingip_id') or 'floating-ip-id-' + uuid.uuid4().hex
)
# Set default attributes.
port_forwarding_attrs = {
'id': uuid.uuid4().hex,
'floatingip_id': floatingip_id,
'internal_port_id': 'internal-port-id-' + uuid.uuid4().hex,
'internal_ip_address': '192.168.1.2',
'protocol': 'tcp',
'description': 'some description',
'location': 'MUNCHMUNCHMUNCH',
}
if use_range:
port_range = randint(0, 100)
internal_start = randint(1, 65535 - port_range)
internal_end = internal_start + port_range
internal_range = ':'.join(map(str, [internal_start, internal_end]))
external_start = randint(1, 65535 - port_range)
external_end = external_start + port_range
external_range = ':'.join(map(str, [external_start, external_end]))
port_forwarding_attrs['internal_port_range'] = internal_range
port_forwarding_attrs['external_port_range'] = external_range
port_forwarding_attrs['internal_port'] = None
port_forwarding_attrs['external_port'] = None
else:
port_forwarding_attrs['internal_port'] = randint(1, 65535)
port_forwarding_attrs['external_port'] = randint(1, 65535)
port_forwarding_attrs['internal_port_range'] = ''
port_forwarding_attrs['external_port_range'] = ''
# Overwrite default attributes.
port_forwarding_attrs.update(attrs)
port_forwarding = fakes.FakeResource(
info=copy.deepcopy(port_forwarding_attrs), loaded=True
)
return port_forwarding
@staticmethod
def create_port_forwardings(attrs=None, count=2, use_range=False):
"""Create multiple fake Port Forwarding.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of Port Forwarding rule to fake
:param Boolean use_range:
A boolean which defines if we will use ranges or not
:return:
A list of FakeResource objects faking the Port Forwardings
"""
port_forwardings = []
for i in range(0, count):
port_forwardings.append(
FakeFloatingIPPortForwarding.create_one_port_forwarding(
attrs, use_range=use_range
)
)
return port_forwardings
@staticmethod
def get_port_forwardings(port_forwardings=None, count=2, use_range=False):
"""Get a list of faked Port Forwardings.
If port forwardings list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List port forwardings:
A list of FakeResource objects faking port forwardings
:param int count:
The number of Port Forwardings to fake
:param Boolean use_range:
A boolean which defines if we will use ranges or not
:return:
An iterable Mock object with side_effect set to a list of faked
Port Forwardings
"""
if port_forwardings is None:
port_forwardings = (
FakeFloatingIPPortForwarding.create_port_forwardings(
count, use_range=use_range
)
)
return mock.Mock(side_effect=port_forwardings)
class FakeL3ConntrackHelper:
"""Fake one or more L3 conntrack helper"""
@staticmethod
def create_one_l3_conntrack_helper(attrs=None):
"""Create a fake L3 conntrack helper.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with protocol, port, etc.
"""
attrs = attrs or {}
router_id = attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
# Set default attributes.
ct_attrs = {
'id': uuid.uuid4().hex,
'router_id': router_id,
'helper': 'tftp',
'protocol': 'tcp',
'port': randint(1, 65535),
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
ct_attrs.update(attrs)
ct = fakes.FakeResource(info=copy.deepcopy(ct_attrs), loaded=True)
return ct
@staticmethod
def create_l3_conntrack_helpers(attrs=None, count=2):
"""Create multiple fake L3 Conntrack helpers.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of L3 Conntrack helper rule to fake
:return:
A list of FakeResource objects faking the Conntrack helpers
"""
ct_helpers = []
for i in range(0, count):
ct_helpers.append(
FakeL3ConntrackHelper.create_one_l3_conntrack_helper(attrs)
)
return ct_helpers
@staticmethod
def get_l3_conntrack_helpers(ct_helpers=None, count=2):
"""Get a list of faked L3 Conntrack helpers.
If ct_helpers list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List ct_helpers:
A list of FakeResource objects faking conntrack helpers
:param int count:
The number of L3 conntrack helpers to fake
:return:
An iterable Mock object with side_effect set to a list of faked
L3 conntrack helpers
"""
if ct_helpers is None:
ct_helpers = FakeL3ConntrackHelper.create_l3_conntrack_helpers(
count
)
return mock.Mock(side_effect=ct_helpers)
def create_one_address_group(attrs=None):
"""Create a fake address group.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An AddressGroup object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
address_group_attrs = {
'name': 'address-group-name-' + uuid.uuid4().hex,
'description': 'address-group-description-' + uuid.uuid4().hex,
'id': 'address-group-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'addresses': ['10.0.0.1/32'],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
address_group_attrs.update(attrs)
address_group = _address_group.AddressGroup(**address_group_attrs)
return address_group
def create_address_groups(attrs=None, count=2):
"""Create multiple fake address groups.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of address groups to fake
:return:
A list of AddressGroup objects faking the address groups
"""
address_groups = []
for i in range(0, count):
address_groups.append(create_one_address_group(attrs))
return address_groups
def get_address_groups(address_groups=None, count=2):
"""Get an iterable Mock object with a list of faked address groups.
If address groups list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List address_groups:
A list of FakeResource objects faking address groups
:param int count:
The number of address groups to fake
:return:
An iterable Mock object with side_effect set to a list of faked
AddressGroup objects
"""
if address_groups is None:
address_groups = create_address_groups(count)
return mock.Mock(side_effect=address_groups)
def create_one_address_scope(attrs=None):
"""Create a fake address scope.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An AddressScope object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
address_scope_attrs = {
'name': 'address-scope-name-' + uuid.uuid4().hex,
'id': 'address-scope-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'shared': False,
'ip_version': 4,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
address_scope_attrs.update(attrs)
address_scope = _address_scope.AddressScope(**address_scope_attrs)
# Set attributes with special mapping in OpenStack SDK.
address_scope.is_shared = address_scope_attrs['shared']
return address_scope
def create_address_scopes(attrs=None, count=2):
"""Create multiple fake address scopes.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of address scopes to fake
:return:
A list of AddressScope objects faking the address scopes
"""
address_scopes = []
for i in range(0, count):
address_scopes.append(create_one_address_scope(attrs))
return address_scopes
def get_address_scopes(address_scopes=None, count=2):
"""Get an iterable Mock object with a list of faked address scopes.
If address scopes list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List address_scopes:
A list of FakeResource objects faking address scopes
:param int count:
The number of address scopes to fake
:return:
An iterable Mock object with side_effect set to a list of faked
AddressScope objects
"""
if address_scopes is None:
address_scopes = create_address_scopes(count)
return mock.Mock(side_effect=address_scopes)
def create_one_topology(attrs=None):
attrs = attrs or {}
auto_allocated_topology_attrs = {
'id': 'network-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
}
auto_allocated_topology_attrs.update(attrs)
auto_allocated_topology = allocated_topology.AutoAllocatedTopology(
**auto_allocated_topology_attrs
)
return auto_allocated_topology
def create_one_availability_zone(attrs=None):
"""Create a fake AZ.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An AvailabilityZone object with name, state, etc.
"""
attrs = attrs or {}
# Set default attributes.
availability_zone = {
'name': uuid.uuid4().hex,
'state': 'available',
'resource': 'network',
}
# Overwrite default attributes.
availability_zone.update(attrs)
availability_zone = _availability_zone.AvailabilityZone(
**availability_zone
)
return availability_zone
def create_availability_zones(attrs=None, count=2):
"""Create multiple fake AZs.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of AZs to fake
:return:
A list of AvailabilityZone objects faking the AZs
"""
availability_zones = []
for i in range(0, count):
availability_zone = create_one_availability_zone(attrs)
availability_zones.append(availability_zone)
return availability_zones
def create_one_ip_availability(attrs=None):
"""Create a fake list with ip availability stats of a network.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A NetworkIPAvailability object with network_name, network_id, etc.
"""
attrs = attrs or {}
# Set default attributes.
network_ip_attrs = {
'network_id': 'network-id-' + uuid.uuid4().hex,
'network_name': 'network-name-' + uuid.uuid4().hex,
'project_id': '',
'subnet_ip_availability': [],
'total_ips': 254,
'used_ips': 6,
'location': 'MUNCHMUNCHMUNCH',
}
network_ip_attrs.update(attrs)
network_ip_availability = _ip_availability.NetworkIPAvailability(
**network_ip_attrs
)
return network_ip_availability
def create_ip_availability(count=2):
"""Create fake list of ip availability stats of multiple networks.
:param int count:
The number of networks to fake
:return:
A list of NetworkIPAvailability objects faking
network ip availability stats
"""
network_ip_availabilities = []
for i in range(0, count):
network_ip_availability = create_one_ip_availability()
network_ip_availabilities.append(network_ip_availability)
return network_ip_availabilities
def create_one_network(attrs=None):
"""Create a fake network.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An Network object, with id, name, etc.
"""
attrs = attrs or {}
# Set default attributes.
network_attrs = {
'created_at': '2021-11-29T10:10:23.000000',
'id': 'network-id-' + uuid.uuid4().hex,
'name': 'network-name-' + uuid.uuid4().hex,
'status': 'ACTIVE',
'description': 'network-description-' + uuid.uuid4().hex,
'dns_domain': 'example.org.',
'mtu': '1350',
'project_id': 'project-id-' + uuid.uuid4().hex,
'admin_state_up': True,
'shared': False,
'subnets': ['a', 'b'],
'segments': 'network-segment-' + uuid.uuid4().hex,
'provider:network_type': 'vlan',
'provider:physical_network': 'physnet1',
'provider:segmentation_id': "400",
'router:external': True,
'availability_zones': [],
'availability_zone_hints': [],
'is_default': False,
'is_vlan_transparent': True,
'port_security_enabled': True,
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
'ipv4_address_scope': 'ipv4' + uuid.uuid4().hex,
'ipv6_address_scope': 'ipv6' + uuid.uuid4().hex,
'tags': [],
'location': 'MUNCHMUNCHMUNCH',
'updated_at': '2021-11-29T10:10:25.000000',
}
# Overwrite default attributes.
network_attrs.update(attrs)
network = _network.Network(**network_attrs)
return network
def create_networks(attrs=None, count=2):
"""Create multiple fake networks.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of networks to fake
:return:
A list of Network objects faking the networks
"""
networks = []
for i in range(0, count):
networks.append(create_one_network(attrs))
return networks
def get_networks(networks=None, count=2):
"""Get an iterable Mock object with a list of faked networks.
If networks list is provided, then initialize the Mock object with the
list. Otherwise create one.
:param List networks:
A list of Network objects faking networks
:param int count:
The number of networks to fake
:return:
An iterable Mock object with side_effect set to a list of faked
networks
"""
if networks is None:
networks = create_networks(count)
return mock.Mock(side_effect=networks)
def create_one_network_flavor(attrs=None):
"""Create a fake network flavor.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A Flavor object faking the network flavor
"""
attrs = attrs or {}
fake_uuid = uuid.uuid4().hex
network_flavor_attrs = {
'description': 'network-flavor-description-' + fake_uuid,
'is_enabled': True,
'id': 'network-flavor-id-' + fake_uuid,
'name': 'network-flavor-name-' + fake_uuid,
'service_type': 'vpn',
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
network_flavor_attrs.update(attrs)
network_flavor = _flavor.Flavor(**network_flavor_attrs)
return network_flavor
def create_flavor(attrs=None, count=2):
"""Create multiple fake network flavors.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of network flavors to fake
:return:
A list of Flavor objects faking the network falvors
"""
network_flavors = []
for i in range(0, count):
network_flavors.append(create_one_network_flavor(attrs))
return network_flavors
def get_flavor(network_flavors=None, count=2):
"""Get a list of flavors."""
if network_flavors is None:
network_flavors = create_flavor(count)
return mock.Mock(side_effect=network_flavors)
def create_one_network_segment(attrs=None):
"""Create a fake network segment.
:param Dictionary attrs:
A dictionary with all attributes
:return:
An Segment object faking the network segment
"""
attrs = attrs or {}
# Set default attributes.
fake_uuid = uuid.uuid4().hex
network_segment_attrs = {
'description': 'network-segment-description-' + fake_uuid,
'id': 'network-segment-id-' + fake_uuid,
'name': 'network-segment-name-' + fake_uuid,
'network_id': 'network-id-' + fake_uuid,
'network_type': 'vlan',
'physical_network': 'physical-network-name-' + fake_uuid,
'segmentation_id': 1024,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
network_segment_attrs.update(attrs)
network_segment = _segment.Segment(**network_segment_attrs)
return network_segment
def create_network_segments(attrs=None, count=2):
"""Create multiple fake network segments.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of network segments to fake
:return:
A list of Segment objects faking the network segments
"""
network_segments = []
for i in range(0, count):
network_segments.append(create_one_network_segment(attrs))
return network_segments
def create_one_network_segment_range(attrs=None):
"""Create a fake network segment range.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A NetworkSegmentRange object faking the network segment range
"""
attrs = attrs or {}
# Set default attributes.
fake_uuid = uuid.uuid4().hex
network_segment_range_attrs = {
'id': 'network-segment-range-id-' + fake_uuid,
'name': 'network-segment-name-' + fake_uuid,
'default': False,
'shared': False,
'project_id': 'project-id-' + fake_uuid,
'network_type': 'vlan',
'physical_network': 'physical-network-name-' + fake_uuid,
'minimum': 100,
'maximum': 106,
'used': {
104: '3312e4ba67864b2eb53f3f41432f8efc',
106: '3312e4ba67864b2eb53f3f41432f8efc',
},
'available': [100, 101, 102, 103, 105],
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
network_segment_range_attrs.update(attrs)
network_segment_range = _segment_range.NetworkSegmentRange(
**network_segment_range_attrs
)
return network_segment_range
def create_network_segment_ranges(attrs=None, count=2):
"""Create multiple fake network segment ranges.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of network segment ranges to fake
:return:
A list of NetworkSegmentRange objects faking
the network segment ranges
"""
network_segment_ranges = []
for i in range(0, count):
network_segment_ranges.append(create_one_network_segment_range(attrs))
return network_segment_ranges
def create_one_port(attrs=None):
"""Create a fake port.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A Port object, with id, name, etc.
"""
attrs = attrs or {}
# Set default attributes.
port_attrs = {
'is_admin_state_up': True,
'allowed_address_pairs': [{}],
'binding:host_id': 'binding-host-id-' + uuid.uuid4().hex,
'binding:profile': {},
'binding:vif_details': {},
'binding:vif_type': 'ovs',
'binding:vnic_type': 'normal',
'data_plane_status': None,
'description': 'description-' + uuid.uuid4().hex,
'device_id': 'device-id-' + uuid.uuid4().hex,
'device_owner': 'compute:nova',
'device_profile': 'cyborg_device_profile_1',
'dns_assignment': [{}],
'dns_domain': 'dns-domain-' + uuid.uuid4().hex,
'dns_name': 'dns-name-' + uuid.uuid4().hex,
'extra_dhcp_opts': [{}],
'fixed_ips': [
{
'ip_address': '10.0.0.3',
'subnet_id': 'subnet-id-' + uuid.uuid4().hex,
}
],
'hardware_offload_type': None,
'hints': {},
'id': 'port-id-' + uuid.uuid4().hex,
'mac_address': 'fa:16:3e:a9:4e:72',
'name': 'port-name-' + uuid.uuid4().hex,
'network_id': 'network-id-' + uuid.uuid4().hex,
'numa_affinity_policy': 'required',
'is_port_security_enabled': True,
'security_group_ids': [],
'status': 'ACTIVE',
'project_id': 'project-id-' + uuid.uuid4().hex,
'qos_network_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
'tags': [],
'propagate_uplink_status': False,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
port_attrs.update(attrs)
port = _port.Port(**port_attrs)
return port
def create_ports(attrs=None, count=2):
"""Create multiple fake ports.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of ports to fake
:return:
A list of Port objects faking the ports
"""
ports = []
for i in range(0, count):
ports.append(create_one_port(attrs))
return ports
def get_ports(ports=None, count=2):
"""Get an iterable Mock object with a list of faked ports.
If ports list is provided, then initialize the Mock object with the
list. Otherwise create one.
:param List ports:
A list of Port objects faking ports
:param int count:
The number of ports to fake
:return:
An iterable Mock object with side_effect set to a list of faked
ports
"""
if ports is None:
ports = create_ports(count)
return mock.Mock(side_effect=ports)
def create_one_network_agent(attrs=None):
"""Create a fake network agent
:param Dictionary attrs:
A dictionary with all attributes
:return:
An Agent object, with id, agent_type, and so on.
"""
attrs = attrs or {}
# Set default attributes
agent_attrs = {
'id': 'agent-id-' + uuid.uuid4().hex,
'agent_type': 'agent-type-' + uuid.uuid4().hex,
'host': 'host-' + uuid.uuid4().hex,
'availability_zone': 'zone-' + uuid.uuid4().hex,
'alive': True,
'admin_state_up': True,
'binary': 'binary-' + uuid.uuid4().hex,
'configurations': {'subnet': 2, 'networks': 1},
'location': 'MUNCHMUNCHMUNCH',
}
agent_attrs.update(attrs)
agent = network_agent.Agent(**agent_attrs)
return agent
def create_network_agents(attrs=None, count=2):
"""Create multiple fake network agents.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of network agents to fake
:return:
A list of Agent objects faking the network agents
"""
agents = []
for i in range(0, count):
agents.append(create_one_network_agent(attrs))
return agents
def get_network_agents(agents=None, count=2):
"""Get an iterable Mock object with a list of faked network agents.
If network agents list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List agents:
A list of Agent objects faking network agents
:param int count:
The number of network agents to fake
:return:
An iterable Mock object with side_effect set to a list of faked
network agents
"""
if agents is None:
agents = create_network_agents(count)
return mock.Mock(side_effect=agents)
def create_one_network_rbac(attrs=None):
"""Create a fake network rbac
:param Dictionary attrs:
A dictionary with all attributes
:return:
A RBACPolicy object, with id, action, target_tenant,
project_id, type
"""
attrs = attrs or {}
# Set default attributes
rbac_attrs = {
'id': 'rbac-id-' + uuid.uuid4().hex,
'object_type': 'network',
'object_id': 'object-id-' + uuid.uuid4().hex,
'action': 'access_as_shared',
'target_tenant': 'target-tenant-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
rbac_attrs.update(attrs)
rbac = network_rbac.RBACPolicy(**rbac_attrs)
return rbac
def create_network_rbacs(attrs=None, count=2):
"""Create multiple fake network rbac policies.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of rbac policies to fake
:return:
A list of RBACPolicy objects faking the rbac policies
"""
rbac_policies = []
for i in range(0, count):
rbac_policies.append(create_one_network_rbac(attrs))
return rbac_policies
def get_network_rbacs(rbac_policies=None, count=2):
"""Get an iterable Mock object with a list of faked rbac policies.
If rbac policies list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List rbac_policies:
A list of RBACPolicy objects faking rbac policies
:param int count:
The number of rbac policies to fake
:return:
An iterable Mock object with side_effect set to a list of faked
rbac policies
"""
if rbac_policies is None:
rbac_policies = create_network_rbacs(count)
return mock.Mock(side_effect=rbac_policies)
def create_one_security_group(attrs=None):
"""Create a security group."""
attrs = attrs or {}
security_group_attrs = {
'name': 'security-group-name-' + uuid.uuid4().hex,
'id': 'security-group-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'description': 'security-group-description-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
security_group_attrs.update(attrs)
security_group = _security_group.SecurityGroup(**security_group_attrs)
return security_group
def create_security_groups(attrs=None, count=2):
"""Create multiple fake security groups.
:param dict attrs: A dictionary with all attributes
:param int count: The number of security groups to fake
:return: A list of fake SecurityGroup objects
"""
security_groups = []
for i in range(0, count):
security_groups.append(create_one_security_group(attrs))
return security_groups
def create_one_service_profile(attrs=None):
"""Create service profile."""
attrs = attrs or {}
service_profile_attrs = {
'id': 'flavor-profile-id' + uuid.uuid4().hex,
'description': 'flavor-profile-description-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'driver': 'driver-' + uuid.uuid4().hex,
'metainfo': 'metainfo-' + uuid.uuid4().hex,
'enabled': True,
'location': 'MUNCHMUNCHMUNCH',
}
service_profile_attrs.update(attrs)
flavor_profile = _service_profile.ServiceProfile(**service_profile_attrs)
return flavor_profile
def create_service_profile(attrs=None, count=2):
"""Create multiple service profiles."""
service_profiles = []
for i in range(0, count):
service_profiles.append(create_one_service_profile(attrs))
return service_profiles
def get_service_profile(flavor_profile=None, count=2):
"""Get a list of flavor profiles."""
if flavor_profile is None:
flavor_profile = create_service_profile(count)
return mock.Mock(side_effect=flavor_profile)
def create_one_local_ip(attrs=None):
"""Create a fake local ip.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
local_ip_attrs = {
'created_at': '2021-11-29T10:10:23.000000',
'name': 'local-ip-name-' + uuid.uuid4().hex,
'description': 'local-ip-description-' + uuid.uuid4().hex,
'id': 'local-ip-id-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'local_port_id': 'local_port_id-' + uuid.uuid4().hex,
'network_id': 'network_id-' + uuid.uuid4().hex,
'local_ip_address': '10.0.0.1',
'ip_mode': 'translate',
'revision_number': 'local-ip-revision-number-' + uuid.uuid4().hex,
'updated_at': '2021-11-29T10:10:25.000000',
}
# Overwrite default attributes.
local_ip_attrs.update(attrs)
local_ip = _local_ip.LocalIP(**local_ip_attrs)
return local_ip
def create_local_ips(attrs=None, count=2):
"""Create multiple fake local ips.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of local ips to fake
:return:
A list of FakeResource objects faking the local ips
"""
local_ips = []
for i in range(0, count):
local_ips.append(create_one_local_ip(attrs))
return local_ips
def get_local_ips(local_ips=None, count=2):
"""Get an iterable Mock object with a list of faked local ips.
If local ip list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List local_ips:
A list of FakeResource objects faking local ips
:param int count:
The number of local ips to fake
:return:
An iterable Mock object with side_effect set to a list of faked
local ips
"""
if local_ips is None:
local_ips = create_local_ips(count)
return mock.Mock(side_effect=local_ips)
def create_one_local_ip_association(attrs=None):
"""Create a fake local ip association.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with local_ip_id, local_ip_address, etc.
"""
attrs = attrs or {}
# Set default attributes.
local_ip_association_attrs = {
'local_ip_id': 'local-ip-id-' + uuid.uuid4().hex,
'local_ip_address': '172.24.4.228',
'fixed_port_id': 'fixed-port-id-' + uuid.uuid4().hex,
'fixed_ip': '10.0.0.5',
'host': 'host-' + uuid.uuid4().hex,
}
# Overwrite default attributes.
local_ip_association_attrs.update(attrs)
local_ip_association = _local_ip_association.LocalIPAssociation(
**local_ip_association_attrs
)
return local_ip_association
def create_local_ip_associations(attrs=None, count=2):
"""Create multiple fake local ip associations.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of local ip associations to fake
:return:
A list of FakeResource objects faking the local ip associations
"""
local_ip_associations = []
for i in range(0, count):
local_ip_associations.append(create_one_local_ip_association(attrs))
return local_ip_associations
def get_local_ip_associations(local_ip_associations=None, count=2):
"""Get a list of faked local ip associations
If local ip association list is provided, then initialize
the Mock object with the list. Otherwise create one.
:param List local_ip_associations:
A list of FakeResource objects faking local ip associations
:param int count:
The number of local ip associations to fake
:return:
An iterable Mock object with side_effect set to a list of faked
local ip associations
"""
if local_ip_associations is None:
local_ip_associations = create_local_ip_associations(count)
return mock.Mock(side_effect=local_ip_associations)
def create_one_ndp_proxy(attrs=None):
"""Create a fake NDP proxy.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with router_id, port_id, etc.
"""
attrs = attrs or {}
router_id = attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
port_id = attrs.get('port_id') or 'port-id-' + uuid.uuid4().hex
# Set default attributes.
np_attrs = {
'id': uuid.uuid4().hex,
'name': 'ndp-proxy-name-' + uuid.uuid4().hex,
'router_id': router_id,
'port_id': port_id,
'ip_address': '2001::1:2',
'description': 'ndp-proxy-description-' + uuid.uuid4().hex,
'project_id': 'project-id-' + uuid.uuid4().hex,
'location': 'MUNCHMUNCHMUNCH',
}
# Overwrite default attributes.
np_attrs.update(attrs)
return _ndp_proxy.NDPProxy(**np_attrs)
def create_ndp_proxies(attrs=None, count=2):
"""Create multiple fake NDP proxies.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of NDP proxxy to fake
:return:
A list of FakeResource objects faking the NDP proxies
"""
ndp_proxies = []
for i in range(0, count):
ndp_proxies.append(create_one_ndp_proxy(attrs))
return ndp_proxies
def get_ndp_proxies(ndp_proxies=None, count=2):
"""Get a list of faked NDP proxies.
If ndp_proxy list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List ndp_proxies:
A list of FakeResource objects faking ndp proxy
:param int count:
The number of ndp proxy to fake
:return:
An iterable Mock object with side_effect set to a list of faked
ndp proxy
"""
if ndp_proxies is None:
ndp_proxies = create_ndp_proxies(count)
return mock.Mock(side_effect=ndp_proxies)
def create_one_trunk(attrs=None):
"""Create a fake trunk.
:param Dictionary attrs:
A dictionary with all attributes
:return:
A FakeResource object with name, id, etc.
"""
attrs = attrs or {}
# Set default attributes.
trunk_attrs = {
'id': 'trunk-id-' + uuid.uuid4().hex,
'name': 'trunk-name-' + uuid.uuid4().hex,
'description': '',
'port_id': 'port-' + uuid.uuid4().hex,
'admin_state_up': True,
'project_id': 'project-id-' + uuid.uuid4().hex,
'status': 'ACTIVE',
'sub_ports': [
{
'port_id': 'subport-' + uuid.uuid4().hex,
'segmentation_type': 'vlan',
'segmentation_id': 100,
}
],
}
# Overwrite default attributes.
trunk_attrs.update(attrs)
trunk = _trunk.Trunk(**trunk_attrs)
return trunk
def create_trunks(attrs=None, count=2):
"""Create multiple fake trunks.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of trunks to fake
:return:
A list of FakeResource objects faking the trunks
"""
trunks = []
for i in range(0, count):
trunks.append(create_one_trunk(attrs))
return trunks
def get_trunks(trunks=None, count=2):
"""Get an iterable Mock object with a list of faked trunks.
If trunk list is provided, then initialize the Mock object
with the list. Otherwise create one.
:param List trunks:
A list of FakeResource objects faking trunks
:param int count:
The number of trunks to fake
:return:
An iterable Mock object with side_effect set to a list of faked
trunks
"""
if trunks is None:
trunks = create_trunks(count)
return mock.Mock(side_effect=trunks)