mirror of
https://opendev.org/openstack/python-openstackclient.git
synced 2026-01-17 07:20:45 +00:00
With passing "--detail" argument to "openstack quota list", details about current usage should be returned. It is currently supported by Nova and Neutron so details of resources from those projects can be returned. Change-Id: I48fda15b34283bb7c66ea18ed28262f48b9229fe Related-Bug: #1716043
1725 lines
55 KiB
Python
1725 lines
55 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 argparse
|
|
import copy
|
|
from random import choice
|
|
from random import randint
|
|
import uuid
|
|
|
|
import mock
|
|
|
|
from openstackclient.tests.unit import fakes
|
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3
|
|
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'
|
|
VALID_QOS_RULES = [RULE_TYPE_BANDWIDTH_LIMIT,
|
|
RULE_TYPE_DSCP_MARKING,
|
|
RULE_TYPE_MINIMUM_BANDWIDTH]
|
|
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 FakeNetworkV2Client(object):
|
|
|
|
def __init__(self, **kwargs):
|
|
self.session = mock.Mock()
|
|
self.extensions = mock.Mock()
|
|
self.extensions.resource_class = fakes.FakeResource(None, {})
|
|
|
|
|
|
class TestNetworkV2(utils.TestCommand):
|
|
|
|
def setUp(self):
|
|
super(TestNetworkV2, self).setUp()
|
|
|
|
self.namespace = argparse.Namespace()
|
|
|
|
self.app.client_manager.session = mock.Mock()
|
|
|
|
self.app.client_manager.network = FakeNetworkV2Client(
|
|
endpoint=fakes.AUTH_URL,
|
|
token=fakes.AUTH_TOKEN,
|
|
)
|
|
|
|
self.app.client_manager.sdk_connection = mock.Mock()
|
|
self.app.client_manager.sdk_connection.network = \
|
|
self.app.client_manager.network
|
|
|
|
self.app.client_manager.identity = (
|
|
identity_fakes_v3.FakeIdentityv3Client(
|
|
endpoint=fakes.AUTH_URL,
|
|
token=fakes.AUTH_TOKEN,
|
|
)
|
|
)
|
|
|
|
|
|
class FakeAddressScope(object):
|
|
"""Fake one or more address scopes."""
|
|
|
|
@staticmethod
|
|
def create_one_address_scope(attrs=None):
|
|
"""Create a fake address scope.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource 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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'shared': False,
|
|
'ip_version': 4,
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
address_scope_attrs.update(attrs)
|
|
|
|
address_scope = fakes.FakeResource(
|
|
info=copy.deepcopy(address_scope_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
address_scope.is_shared = address_scope_attrs['shared']
|
|
address_scope.project_id = address_scope_attrs['tenant_id']
|
|
|
|
return address_scope
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the address scopes
|
|
"""
|
|
address_scopes = []
|
|
for i in range(0, count):
|
|
address_scopes.append(
|
|
FakeAddressScope.create_one_address_scope(attrs))
|
|
|
|
return address_scopes
|
|
|
|
@staticmethod
|
|
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
|
|
address scopes
|
|
"""
|
|
if address_scopes is None:
|
|
address_scopes = FakeAddressScope.create_address_scopes(count)
|
|
return mock.Mock(side_effect=address_scopes)
|
|
|
|
|
|
class FakeAutoAllocatedTopology(object):
|
|
"""Fake Auto Allocated Topology"""
|
|
|
|
@staticmethod
|
|
def create_one_topology(attrs=None):
|
|
attrs = attrs or {}
|
|
|
|
auto_allocated_topology_attrs = {
|
|
'id': 'network-id-' + uuid.uuid4().hex,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
}
|
|
|
|
auto_allocated_topology_attrs.update(attrs)
|
|
|
|
auto_allocated_topology = fakes.FakeResource(
|
|
info=copy.deepcopy(auto_allocated_topology_attrs),
|
|
loaded=True)
|
|
|
|
auto_allocated_topology.project_id = auto_allocated_topology_attrs[
|
|
'tenant_id'
|
|
]
|
|
|
|
return auto_allocated_topology
|
|
|
|
|
|
class FakeAvailabilityZone(object):
|
|
"""Fake one or more network availability zones (AZs)."""
|
|
|
|
@staticmethod
|
|
def create_one_availability_zone(attrs=None):
|
|
"""Create a fake AZ.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource 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 = fakes.FakeResource(
|
|
info=copy.deepcopy(availability_zone),
|
|
loaded=True)
|
|
return availability_zone
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the AZs
|
|
"""
|
|
availability_zones = []
|
|
for i in range(0, count):
|
|
availability_zone = \
|
|
FakeAvailabilityZone.create_one_availability_zone(attrs)
|
|
availability_zones.append(availability_zone)
|
|
|
|
return availability_zones
|
|
|
|
|
|
class FakeIPAvailability(object):
|
|
"""Fake one or more network ip availabilities."""
|
|
|
|
@staticmethod
|
|
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 FakeResource 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,
|
|
'tenant_id': '',
|
|
'subnet_ip_availability': [],
|
|
'total_ips': 254,
|
|
'used_ips': 6,
|
|
}
|
|
network_ip_attrs.update(attrs)
|
|
|
|
network_ip_availability = fakes.FakeResource(
|
|
info=copy.deepcopy(network_ip_attrs),
|
|
loaded=True)
|
|
network_ip_availability.project_id = network_ip_attrs['tenant_id']
|
|
|
|
return network_ip_availability
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking network ip availability stats
|
|
"""
|
|
network_ip_availabilities = []
|
|
for i in range(0, count):
|
|
network_ip_availability = \
|
|
FakeIPAvailability.create_one_ip_availability()
|
|
network_ip_availabilities.append(network_ip_availability)
|
|
|
|
return network_ip_availabilities
|
|
|
|
|
|
class FakeExtension(object):
|
|
"""Fake one or more extension."""
|
|
|
|
@staticmethod
|
|
def create_one_extension(attrs=None):
|
|
"""Create a fake extension.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource object with name, namespace, etc.
|
|
"""
|
|
attrs = attrs or {}
|
|
|
|
# Set default attributes.
|
|
extension_info = {
|
|
'name': 'name-' + uuid.uuid4().hex,
|
|
'namespace': 'http://docs.openstack.org/network/',
|
|
'description': 'description-' + uuid.uuid4().hex,
|
|
'updated': '2013-07-09T12:00:0-00:00',
|
|
'alias': 'Dystopian',
|
|
'links': '[{"href":''"https://github.com/os/network", "type"}]',
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
extension_info.update(attrs)
|
|
|
|
extension = fakes.FakeResource(
|
|
info=copy.deepcopy(extension_info),
|
|
loaded=True)
|
|
return extension
|
|
|
|
|
|
class FakeNetwork(object):
|
|
"""Fake one or more networks."""
|
|
|
|
@staticmethod
|
|
def create_one_network(attrs=None):
|
|
"""Create a fake network.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource object, with id, name, etc.
|
|
"""
|
|
attrs = attrs or {}
|
|
|
|
# Set default attributes.
|
|
network_attrs = {
|
|
'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',
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'admin_state_up': True,
|
|
'shared': False,
|
|
'subnets': ['a', 'b'],
|
|
'provider:network_type': 'vlan',
|
|
'provider:physical_network': 'physnet1',
|
|
'provider:segmentation_id': "400",
|
|
'router:external': True,
|
|
'availability_zones': [],
|
|
'availability_zone_hints': [],
|
|
'is_default': False,
|
|
'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': [],
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
network_attrs.update(attrs)
|
|
|
|
network = fakes.FakeResource(info=copy.deepcopy(network_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
network.project_id = network_attrs['tenant_id']
|
|
network.is_router_external = network_attrs['router:external']
|
|
network.is_admin_state_up = network_attrs['admin_state_up']
|
|
network.is_port_security_enabled = \
|
|
network_attrs['port_security_enabled']
|
|
network.subnet_ids = network_attrs['subnets']
|
|
network.is_shared = network_attrs['shared']
|
|
network.is_tags = network_attrs['tags']
|
|
network.provider_network_type = \
|
|
network_attrs['provider:network_type']
|
|
network.provider_physical_network = \
|
|
network_attrs['provider:physical_network']
|
|
network.provider_segmentation_id = \
|
|
network_attrs['provider:segmentation_id']
|
|
network.ipv4_address_scope_id = \
|
|
network_attrs['ipv4_address_scope']
|
|
network.ipv6_address_scope_id = \
|
|
network_attrs['ipv6_address_scope']
|
|
|
|
return network
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the networks
|
|
"""
|
|
networks = []
|
|
for i in range(0, count):
|
|
networks.append(FakeNetwork.create_one_network(attrs))
|
|
|
|
return networks
|
|
|
|
@staticmethod
|
|
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 FakeResource 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 = FakeNetwork.create_networks(count)
|
|
return mock.Mock(side_effect=networks)
|
|
|
|
|
|
class FakeNetworkFlavor(object):
|
|
"""Fake Network Flavor."""
|
|
|
|
@staticmethod
|
|
def create_one_network_flavor(attrs=None):
|
|
"""Create a fake network flavor.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource object faking the network flavor
|
|
"""
|
|
attrs = attrs or {}
|
|
|
|
fake_uuid = uuid.uuid4().hex
|
|
network_flavor_attrs = {
|
|
'description': 'network-flavor-description-' + fake_uuid,
|
|
'enabled': True,
|
|
'id': 'network-flavor-id-' + fake_uuid,
|
|
'name': 'network-flavor-name-' + fake_uuid,
|
|
'service_type': 'vpn',
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
network_flavor_attrs.update(attrs)
|
|
|
|
network_flavor = fakes.FakeResource(
|
|
info=copy.deepcopy(network_flavor_attrs),
|
|
loaded=True
|
|
)
|
|
|
|
network_flavor.project_id = network_flavor_attrs['tenant_id']
|
|
network_flavor.is_enabled = network_flavor_attrs['enabled']
|
|
|
|
return network_flavor
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the network falvors
|
|
"""
|
|
network_flavors = []
|
|
for i in range(0, count):
|
|
network_flavors.append(
|
|
FakeNetworkFlavor.create_one_network_flavor(attrs)
|
|
)
|
|
return network_flavors
|
|
|
|
@staticmethod
|
|
def get_flavor(network_flavors=None, count=2):
|
|
"""Get a list of flavors."""
|
|
if network_flavors is None:
|
|
network_flavors = (FakeNetworkFlavor.create_flavor(count))
|
|
return mock.Mock(side_effect=network_flavors)
|
|
|
|
|
|
class FakeNetworkSegment(object):
|
|
"""Fake one or more network segments."""
|
|
|
|
@staticmethod
|
|
def create_one_network_segment(attrs=None):
|
|
"""Create a fake network segment.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource 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,
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
network_segment_attrs.update(attrs)
|
|
|
|
network_segment = fakes.FakeResource(
|
|
info=copy.deepcopy(network_segment_attrs),
|
|
loaded=True
|
|
)
|
|
|
|
return network_segment
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the network segments
|
|
"""
|
|
network_segments = []
|
|
for i in range(0, count):
|
|
network_segments.append(
|
|
FakeNetworkSegment.create_one_network_segment(attrs)
|
|
)
|
|
return network_segments
|
|
|
|
|
|
class FakePort(object):
|
|
"""Fake one or more ports."""
|
|
|
|
@staticmethod
|
|
def create_one_port(attrs=None):
|
|
"""Create a fake port.
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource object, with id, name, etc.
|
|
"""
|
|
attrs = attrs or {}
|
|
|
|
# Set default attributes.
|
|
port_attrs = {
|
|
'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',
|
|
'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}],
|
|
'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,
|
|
'port_security_enabled': True,
|
|
'security_group_ids': [],
|
|
'status': 'ACTIVE',
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
|
|
'tags': [],
|
|
'uplink_status_propagation': False,
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
port_attrs.update(attrs)
|
|
|
|
port = fakes.FakeResource(info=copy.deepcopy(port_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mappings in OpenStack SDK.
|
|
port.binding_host_id = port_attrs['binding:host_id']
|
|
port.binding_profile = port_attrs['binding:profile']
|
|
port.binding_vif_details = port_attrs['binding:vif_details']
|
|
port.binding_vif_type = port_attrs['binding:vif_type']
|
|
port.binding_vnic_type = port_attrs['binding:vnic_type']
|
|
port.is_admin_state_up = port_attrs['admin_state_up']
|
|
port.is_port_security_enabled = port_attrs['port_security_enabled']
|
|
port.project_id = port_attrs['tenant_id']
|
|
port.security_group_ids = port_attrs['security_group_ids']
|
|
port.qos_policy_id = port_attrs['qos_policy_id']
|
|
port.uplink_status_propagation = port_attrs[
|
|
'uplink_status_propagation']
|
|
|
|
return port
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the ports
|
|
"""
|
|
ports = []
|
|
for i in range(0, count):
|
|
ports.append(FakePort.create_one_port(attrs))
|
|
|
|
return ports
|
|
|
|
@staticmethod
|
|
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 FakeResource 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 = FakePort.create_ports(count)
|
|
return mock.Mock(side_effect=ports)
|
|
|
|
|
|
class FakeNetworkAgent(object):
|
|
"""Fake one or more network agents."""
|
|
|
|
@staticmethod
|
|
def create_one_network_agent(attrs=None):
|
|
"""Create a fake network agent
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource 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},
|
|
}
|
|
agent_attrs.update(attrs)
|
|
agent = fakes.FakeResource(info=copy.deepcopy(agent_attrs),
|
|
loaded=True)
|
|
agent.is_admin_state_up = agent_attrs['admin_state_up']
|
|
agent.is_alive = agent_attrs['alive']
|
|
return agent
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the network agents
|
|
"""
|
|
agents = []
|
|
for i in range(0, count):
|
|
agents.append(FakeNetworkAgent.create_one_network_agent(attrs))
|
|
|
|
return agents
|
|
|
|
@staticmethod
|
|
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 FakeResource 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 = FakeNetworkAgent.create_network_agents(count)
|
|
return mock.Mock(side_effect=agents)
|
|
|
|
|
|
class FakeNetworkRBAC(object):
|
|
"""Fake one or more network rbac policies."""
|
|
|
|
@staticmethod
|
|
def create_one_network_rbac(attrs=None):
|
|
"""Create a fake network rbac
|
|
|
|
:param Dictionary attrs:
|
|
A dictionary with all attributes
|
|
:return:
|
|
A FakeResource object, with id, action, target_tenant,
|
|
tenant_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,
|
|
'tenant_id': 'tenant-id-' + uuid.uuid4().hex,
|
|
}
|
|
rbac_attrs.update(attrs)
|
|
rbac = fakes.FakeResource(info=copy.deepcopy(rbac_attrs),
|
|
loaded=True)
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
rbac.project_id = rbac_attrs['tenant_id']
|
|
rbac.target_project_id = rbac_attrs['target_tenant']
|
|
return rbac
|
|
|
|
@staticmethod
|
|
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 FakeResource objects faking the rbac policies
|
|
"""
|
|
rbac_policies = []
|
|
for i in range(0, count):
|
|
rbac_policies.append(FakeNetworkRBAC.
|
|
create_one_network_rbac(attrs))
|
|
|
|
return rbac_policies
|
|
|
|
@staticmethod
|
|
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 FakeResource 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 = FakeNetworkRBAC.create_network_rbacs(count)
|
|
return mock.Mock(side_effect=rbac_policies)
|
|
|
|
|
|
class FakeNetworkFlavorProfile(object):
|
|
"""Fake network flavor profile."""
|
|
|
|
@staticmethod
|
|
def create_one_service_profile(attrs=None):
|
|
"""Create flavor profile."""
|
|
attrs = attrs or {}
|
|
|
|
flavor_profile_attrs = {
|
|
'id': 'flavor-profile-id' + uuid.uuid4().hex,
|
|
'description': 'flavor-profile-description-' + uuid.uuid4().hex,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'driver': 'driver-' + uuid.uuid4().hex,
|
|
'metainfo': 'metainfo-' + uuid.uuid4().hex,
|
|
'enabled': True
|
|
}
|
|
|
|
flavor_profile_attrs.update(attrs)
|
|
|
|
flavor_profile = fakes.FakeResource(
|
|
info=copy.deepcopy(flavor_profile_attrs),
|
|
loaded=True)
|
|
|
|
flavor_profile.project_id = flavor_profile_attrs['tenant_id']
|
|
flavor_profile.is_enabled = flavor_profile_attrs['enabled']
|
|
|
|
return flavor_profile
|
|
|
|
@staticmethod
|
|
def create_service_profile(attrs=None, count=2):
|
|
"""Create multiple flavor profiles."""
|
|
|
|
flavor_profiles = []
|
|
for i in range(0, count):
|
|
flavor_profiles.append(FakeNetworkFlavorProfile.
|
|
create_one_service_profile(attrs))
|
|
return flavor_profiles
|
|
|
|
@staticmethod
|
|
def get_service_profile(flavor_profile=None, count=2):
|
|
"""Get a list of flavor profiles."""
|
|
if flavor_profile is None:
|
|
flavor_profile = (FakeNetworkFlavorProfile.
|
|
create_service_profile(count))
|
|
return mock.Mock(side_effect=flavor_profile)
|
|
|
|
|
|
class FakeNetworkQosPolicy(object):
|
|
"""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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'shared': False,
|
|
'description': 'qos-policy-description-' + uuid.uuid4().hex,
|
|
'rules': rules,
|
|
}
|
|
|
|
# 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']
|
|
qos_policy.project_id = qos_policy_attrs['tenant_id']
|
|
|
|
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 FakeNetworkQosRule(object):
|
|
"""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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'type': type,
|
|
}
|
|
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'
|
|
|
|
# Overwrite default attributes.
|
|
qos_rule_attrs.update(attrs)
|
|
|
|
qos_rule = fakes.FakeResource(info=copy.deepcopy(qos_rule_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
qos_rule.project_id = qos_rule['tenant_id']
|
|
|
|
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(object):
|
|
"""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,
|
|
}
|
|
|
|
# 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(object):
|
|
"""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, tenant_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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'routes': [],
|
|
'external_gateway_info': {},
|
|
'availability_zone_hints': [],
|
|
'availability_zones': [],
|
|
'tags': [],
|
|
}
|
|
|
|
# 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.project_id = router_attrs['tenant_id']
|
|
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(object):
|
|
"""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,
|
|
'project_id': 'project-id-' + uuid.uuid4().hex,
|
|
'security_group_rules': [],
|
|
'tags': []
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
security_group_attrs.update(attrs)
|
|
|
|
security_group = fakes.FakeResource(
|
|
info=copy.deepcopy(security_group_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
security_group.project_id = security_group_attrs['project_id']
|
|
|
|
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(object):
|
|
"""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': 'tcp',
|
|
'remote_group_id': None,
|
|
'remote_ip_prefix': '0.0.0.0/0',
|
|
'security_group_id': 'security-group-id-' + uuid.uuid4().hex,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
security_group_rule_attrs.update(attrs)
|
|
|
|
security_group_rule = fakes.FakeResource(
|
|
info=copy.deepcopy(security_group_rule_attrs),
|
|
loaded=True)
|
|
|
|
# Set attributes with special mapping in OpenStack SDK.
|
|
security_group_rule.project_id = security_group_rule_attrs['tenant_id']
|
|
|
|
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 object 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(object):
|
|
"""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',
|
|
'tenant_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': [],
|
|
}
|
|
|
|
# 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']
|
|
subnet.project_id = subnet_attrs['tenant_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(object):
|
|
"""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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'description': 'floating-ip-description-' + uuid.uuid4().hex,
|
|
'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
|
|
'tags': [],
|
|
}
|
|
|
|
# Overwrite default attributes.
|
|
floating_ip_attrs.update(attrs)
|
|
|
|
floating_ip = fakes.FakeResource(
|
|
info=copy.deepcopy(floating_ip_attrs),
|
|
loaded=True
|
|
)
|
|
|
|
# Set attributes with special mappings in OpenStack SDK.
|
|
floating_ip.project_id = floating_ip_attrs['tenant_id']
|
|
|
|
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(object):
|
|
"""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,
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
'shared': False
|
|
}
|
|
|
|
meter_attrs.update(attrs)
|
|
|
|
meter = fakes.FakeResource(
|
|
info=copy.deepcopy(meter_attrs),
|
|
loaded=True)
|
|
|
|
meter.project_id = meter_attrs['tenant_id']
|
|
|
|
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(object):
|
|
"""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',
|
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
|
}
|
|
|
|
meter_rule_attrs.update(attrs)
|
|
|
|
meter_rule = fakes.FakeResource(
|
|
info=copy.deepcopy(meter_rule_attrs),
|
|
loaded=True)
|
|
|
|
meter_rule.project_id = meter_rule_attrs['tenant_id']
|
|
|
|
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(object):
|
|
"""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,
|
|
'tenant_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': [],
|
|
}
|
|
|
|
# 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']
|
|
subnet_pool.project_id = subnet_pool_attrs['tenant_id']
|
|
|
|
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(object):
|
|
"""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,
|
|
}
|
|
|
|
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(object):
|
|
"""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
|