From 183667e511e49de258e539b1da65c270f69b7a7a Mon Sep 17 00:00:00 2001 From: Rahul Nair Date: Mon, 12 Sep 2016 15:48:51 -0500 Subject: [PATCH] An extenstion to retrieve network data from an openstack cloud If the required data is not available, a new resource is created. Change-Id: I1307234c54f735a79687469daee78b4baa44ce91 --- requirements.txt | 1 + syntribos/extensions/neutron/__init__.py | 0 syntribos/extensions/neutron/client.py | 171 +++++++++++++++++++++ syntribos/extensions/random_data/client.py | 37 +++++ 4 files changed, 209 insertions(+) create mode 100644 syntribos/extensions/neutron/__init__.py create mode 100644 syntribos/extensions/neutron/client.py diff --git a/requirements.txt b/requirements.txt index 2739e331..7fb48fb2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ requests>=2.10.0 # Apache-2.0 oslo.config>=3.14.0 # Apache-2.0 oslo.utils>=3.16.0 # Apache-2.0 python-glanceclient>=2.3.0,!=2.4.0 # Apache-2.0 +python-neutronclient>=5.1.0 # Apache-2.0 diff --git a/syntribos/extensions/neutron/__init__.py b/syntribos/extensions/neutron/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/syntribos/extensions/neutron/client.py b/syntribos/extensions/neutron/client.py new file mode 100644 index 00000000..cbb29f18 --- /dev/null +++ b/syntribos/extensions/neutron/client.py @@ -0,0 +1,171 @@ +# Copyright 2016 Intel +# 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. +from keystoneauth1 import identity +from keystoneauth1 import session +from neutronclient.v2_0 import client +from oslo_config import cfg + +from syntribos.utils.memoize import memoize + +CONF = cfg.CONF + + +def create_connection(auth_url=None, + project_name=None, + project_domain_name="default", + user_domain_name="default", + project_domain_id="default", + user_domain_id="default", + username=None, + password=None): + """Method creates a neutron client and returns it.""" + + if auth_url.endswith("/v3/"): + auth_url = auth_url[:-1] + elif auth_url.endswith("/v3"): + pass + else: + auth_url = "{}/v3".format(auth_url) + auth = identity.Password(auth_url=auth_url, + project_name=project_name, + project_domain_name=project_domain_name, + user_domain_name=user_domain_name, + project_domain_id=project_domain_id, + user_domain_id=user_domain_id, + username=username, + password=password) + return client.Client(session=session.Session(auth=auth)) + + +neutron_client = create_connection( + auth_url=CONF.user.endpoint, + project_name=CONF.user.project_name, + project_domain_id=CONF.user.domain_id, + user_domain_id=CONF.user.domain_id, + project_domain_name=CONF.user.domain_id, + user_domain_name=CONF.user.domain_id, + username=CONF.user.username, + password=CONF.user.password) + + +def create_network(conn): + data = {"name": "sample_network", + "admin_state_up": True} + return conn.create_network({"network": data}) + + +def list_network_ids(conn): + return [network["id"] for network in conn.list_networks()["networks"]] + + +def create_subnet(conn, network_id): + data = {"name": "sample_subnet", + "network_id": network_id, + "ip_version": 4, + "cidr": "11.0.3.0/24"} + return conn.create_subnet({"subnet": data}) + + +def list_subnet_ids(conn): + subnet_ids = [subnet["id"] for subnet in conn.list_subnets()["subnets"]] + return subnet_ids + + +def create_port(conn, network_id): + data = {"network_id": network_id, + "name": "sample_port", + "admin_state_up": True} + return conn.create_port({"port": data}) + + +def list_port_ids(conn): + port_ids = [port["id"] for port in conn.list_ports()["ports"]] + return port_ids + + +def create_security_group(conn): + data = {"name": "new_servers", + "description": "security group for servers"} + return conn.create_security_group({"security_group": data}) + + +def list_security_group_ids(conn): + sec_gp_ids = [sg["id"] for sg in conn.list_security_groups( + )["security_groups"]] + return sec_gp_ids + + +def create_router(conn, network_id, subnet_id): + # The network_id should be of an external network + data = { + "name": "router1", + "external_gateway_info": { + "network_id": network_id, + "enable_snat": True, + "external_fixed_ips": [ + { + "ip_address": "172.24.4.6", + "subnet_id": subnet_id + } + ] + }, + "admin_state_up": True + } + return conn.create_router({"router": data}) + + +def list_router_ids(conn): + router_ids = [router["id"] for router in conn.list_routers()["routers"]] + return router_ids + + +@memoize +def get_port_id(): + port_ids = list_port_ids(neutron_client) + if not port_ids: + network_id = get_network_id() + port_ids.append(create_port(neutron_client, network_id)["id"]) + return port_ids[-1] + + +@memoize +def get_network_id(): + network_ids = list_network_ids(neutron_client) + if len(network_ids) < 3: + network_ids.append(create_network(neutron_client)["id"]) + return network_ids[-1] + + +@memoize +def get_subnet_id(): + subnet_ids = list_subnet_ids(neutron_client) + if not subnet_ids: + network_id = get_network_id() + subnet_ids.append(create_subnet(neutron_client, network_id)["id"]) + return subnet_ids[-1] + + +@memoize +def get_sg_group_id(): + sg_ids = list_security_group_ids(neutron_client) + if not sg_ids: + sg_ids.append(create_security_group(neutron_client)["id"]) + return sg_ids[-1] + + +@memoize +def get_router_id(): + router_ids = list_router_ids(neutron_client) + if not router_ids: + router_ids.append(create_router(neutron_client)["id"]) + return router_ids[-1] diff --git a/syntribos/extensions/random_data/client.py b/syntribos/extensions/random_data/client.py index 7e6088b9..9618778c 100644 --- a/syntribos/extensions/random_data/client.py +++ b/syntribos/extensions/random_data/client.py @@ -11,6 +11,7 @@ # 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 random import uuid @@ -22,3 +23,39 @@ def get_uuid(): while True: random_data = str(uuid.uuid4()) yield random_data + + +def fake_port(): + return random.int(0, 65535) + + +def fake_ip(): + return "{}:{}:{}:{}".format(random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255)) + + +def fake_mac(): + return "{:x}:{:x}:{:x}:{:x}:{:x}:{:x}".format(random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255)) + + +def random_port(): + while True: + yield fake_port() + + +def random_ip(): + while True: + yield fake_ip() + + +def random_mac(): + while True: + yield fake_mac()