diff options
author | spisarski <s.pisarski@cablelabs.com> | 2017-05-04 12:43:53 -0600 |
---|---|---|
committer | spisarski <s.pisarski@cablelabs.com> | 2017-05-08 09:31:16 -0600 |
commit | d1c4675e5c35257b84cd69969c6e67575faf19db (patch) | |
tree | 63ff3b41ff445b8c192ec33c0aefb913a112b613 /snaps/openstack/utils | |
parent | 40c96233ca4c27de1b3d8b53187c302ddd6208a2 (diff) |
Modified code to support both Python 2.7 and 3.x
* Tested on Python 2.7.10 and 3.4.4
* Updated installation documentation
JIRA: SNAPS-30
Change-Id: I94a37d218be8ea47bbbcfb560197737430fcb3ba
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
Diffstat (limited to 'snaps/openstack/utils')
-rw-r--r-- | snaps/openstack/utils/glance_utils.py | 4 | ||||
-rw-r--r-- | snaps/openstack/utils/neutron_utils.py | 16 | ||||
-rw-r--r-- | snaps/openstack/utils/nova_utils.py | 44 | ||||
-rw-r--r-- | snaps/openstack/utils/tests/keystone_utils_tests.py | 6 | ||||
-rw-r--r-- | snaps/openstack/utils/tests/neutron_utils_tests.py | 10 | ||||
-rw-r--r-- | snaps/openstack/utils/tests/nova_utils_tests.py | 38 |
6 files changed, 72 insertions, 46 deletions
diff --git a/snaps/openstack/utils/glance_utils.py b/snaps/openstack/utils/glance_utils.py index d859257..ca9c490 100644 --- a/snaps/openstack/utils/glance_utils.py +++ b/snaps/openstack/utils/glance_utils.py @@ -151,10 +151,8 @@ def __create_image_v2(glance, image_settings): kwargs['name'] = image_settings.name kwargs['disk_format'] = image_settings.format kwargs['container_format'] = 'bare' - if image_settings.extra_properties: - for key, value in image_settings.extra_properties.iteritems(): - kwargs[key] = value + kwargs.update(image_settings.extra_properties) created_image = glance.images.create(**kwargs) image_file = file_utils.get_file(image_filename) diff --git a/snaps/openstack/utils/neutron_utils.py b/snaps/openstack/utils/neutron_utils.py index 6c92d2e..a65a42f 100644 --- a/snaps/openstack/utils/neutron_utils.py +++ b/snaps/openstack/utils/neutron_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs") +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") # and others. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,7 @@ import logging from neutronclient.common.exceptions import NotFound from neutronclient.neutron.client import Client -import keystone_utils +from snaps.openstack.utils import keystone_utils __author__ = 'spisarski' @@ -80,7 +80,7 @@ def get_network(neutron, network_name, project_id=None): net_filter['project_id'] = project_id networks = neutron.list_networks(**net_filter) - for network, netInsts in networks.iteritems(): + for network, netInsts in networks.items(): for inst in netInsts: if inst.get('name') == network_name: if project_id and inst.get('project_id') == project_id: @@ -98,7 +98,7 @@ def get_network_by_id(neutron, network_id): :return: """ networks = neutron.list_networks(**{'id': network_id}) - for network, netInsts in networks.iteritems(): + for network, netInsts in networks.items(): for inst in netInsts: if inst.get('id') == network_id: return {'network': inst} @@ -144,7 +144,7 @@ def get_subnet_by_name(neutron, subnet_name): :return: """ subnets = neutron.list_subnets(**{'name': subnet_name}) - for subnet, subnetInst in subnets.iteritems(): + for subnet, subnetInst in subnets.items(): for inst in subnetInst: if inst.get('name') == subnet_name: return {'subnet': inst} @@ -189,7 +189,7 @@ def get_router_by_name(neutron, router_name): :return: """ routers = neutron.list_routers(**{'name': router_name}) - for router, routerInst in routers.iteritems(): + for router, routerInst in routers.items(): for inst in routerInst: if inst.get('name') == router_name: return {'router': inst} @@ -228,10 +228,10 @@ def remove_interface_router(neutron, router, subnet=None, port=None): logger.info('Removing router interface from router named ' + router['router']['name']) neutron.remove_interface_router(router=router['router']['id'], body=__create_port_json_body(subnet, port)) except NotFound as e: - logger.warn('Could not remove router interface. NotFound - ' + e.message) + logger.warning('Could not remove router interface. NotFound - ' + str(e)) pass else: - logger.warn('Could not remove router interface, No router object') + logger.warning('Could not remove router interface, No router object') def __create_port_json_body(subnet=None, port=None): diff --git a/snaps/openstack/utils/nova_utils.py b/snaps/openstack/utils/nova_utils.py index e7428ed..419f451 100644 --- a/snaps/openstack/utils/nova_utils.py +++ b/snaps/openstack/utils/nova_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs") +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") # and others. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,9 +12,14 @@ # 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 cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import rsa +from cryptography.hazmat.backends import default_backend + import os import logging -import keystone_utils +from snaps.openstack.utils import keystone_utils from novaclient.client import Client from novaclient.exceptions import NotFound @@ -58,10 +63,29 @@ def get_latest_server_object(nova, server): return nova.servers.get(server) +def create_keys(key_size=2048): + """ + Generates public and private keys + :param key_size: the number of bytes for the key size + :return: the cryptography keys + """ + return rsa.generate_private_key(backend=default_backend(), public_exponent=65537, + key_size=key_size) + + +def public_key_openssh(keys): + """ + Returns the public key for OpenSSH + :param keys: the keys generated by create_keys() from cryptography + :return: the OpenSSH public key + """ + return keys.public_key().public_bytes(serialization.Encoding.OpenSSH, serialization.PublicFormat.OpenSSH) + + def save_keys_to_files(keys=None, pub_file_path=None, priv_file_path=None): """ Saves the generated RSA generated keys to the filesystem - :param keys: the keys to save + :param keys: the keys to save generated by cryptography :param pub_file_path: the path to the public keys :param priv_file_path: the path to the private keys :return: None @@ -72,7 +96,9 @@ def save_keys_to_files(keys=None, pub_file_path=None, priv_file_path=None): if not os.path.isdir(pub_dir): os.mkdir(pub_dir) public_handle = open(pub_file_path, 'wb') - public_handle.write(keys.publickey().exportKey('OpenSSH')) + public_bytes = keys.public_key().public_bytes( + serialization.Encoding.OpenSSH, serialization.PublicFormat.OpenSSH) + public_handle.write(public_bytes) public_handle.close() os.chmod(pub_file_path, 0o400) logger.info("Saved public key to - " + pub_file_path) @@ -81,7 +107,9 @@ def save_keys_to_files(keys=None, pub_file_path=None, priv_file_path=None): if not os.path.isdir(priv_dir): os.mkdir(priv_dir) private_handle = open(priv_file_path, 'wb') - private_handle.write(keys.exportKey()) + private_handle.write(keys.private_bytes(encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption())) private_handle.close() os.chmod(priv_file_path, 0o400) logger.info("Saved private key to - " + priv_file_path) @@ -95,7 +123,7 @@ def upload_keypair_file(nova, name, file_path): :param file_path: the path to the public key file :return: the keypair object """ - with open(os.path.expanduser(file_path)) as fpubkey: + with open(os.path.expanduser(file_path), 'rb') as fpubkey: logger.info('Saving keypair to - ' + file_path) return upload_keypair(nova, name, fpubkey.read()) @@ -109,7 +137,7 @@ def upload_keypair(nova, name, key): :return: the keypair object """ logger.info('Creating keypair with name - ' + name) - return nova.keypairs.create(name=name, public_key=key) + return nova.keypairs.create(name=name, public_key=key.decode('utf-8')) def keypair_exists(nova, keypair_obj): @@ -212,7 +240,7 @@ def get_nova_availability_zones(nova): zones = nova.availability_zones.list() for zone in zones: if zone.zoneName == 'nova': - for key, host in zone.hosts.iteritems(): + for key, host in zone.hosts.items(): out.append(zone.zoneName + ':' + key) return out diff --git a/snaps/openstack/utils/tests/keystone_utils_tests.py b/snaps/openstack/utils/tests/keystone_utils_tests.py index 76a43ef..c072fd3 100644 --- a/snaps/openstack/utils/tests/keystone_utils_tests.py +++ b/snaps/openstack/utils/tests/keystone_utils_tests.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs") +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") # and others. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -93,8 +93,8 @@ class KeystoneUtilsTests(OSComponentTestCase): """ project_settings = ProjectSettings(name=self.project_name) self.project = keystone_utils.create_project(self.keystone, project_settings) - self.assertEquals(self.project_name, self.project.name) + self.assertEqual(self.project_name, self.project.name) project = keystone_utils.get_project(keystone=self.keystone, project_name=project_settings.name) self.assertIsNotNone(project) - self.assertEquals(self.project_name, self.project.name) + self.assertEqual(self.project_name, self.project.name) diff --git a/snaps/openstack/utils/tests/neutron_utils_tests.py b/snaps/openstack/utils/tests/neutron_utils_tests.py index 5f95fc9..9a043e3 100644 --- a/snaps/openstack/utils/tests/neutron_utils_tests.py +++ b/snaps/openstack/utils/tests/neutron_utils_tests.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs") +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") # and others. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -109,14 +109,16 @@ class NeutronUtilsNetworkTests(OSComponentTestCase): Tests the neutron_utils.create_neutron_net() function with an empty network name """ with self.assertRaises(Exception): - self.network = neutron_utils.create_network(self.neutron, NetworkSettings(name='')) + self.network = neutron_utils.create_network(self.neutron, self.os_creds, + network_settings=NetworkSettings(name='')) def test_create_network_null_name(self): """ Tests the neutron_utils.create_neutron_net() function when the network name is None """ with self.assertRaises(Exception): - self.network = neutron_utils.create_network(self.neutron, NetworkSettings()) + self.network = neutron_utils.create_network(self.neutron, self.os_creds, + network_settings=NetworkSettings()) class NeutronUtilsSubnetTests(OSComponentTestCase): @@ -644,7 +646,7 @@ def validate_port(neutron, port_obj, this_port_name): :return: True/False """ ports = neutron.list_ports() - for port, port_insts in ports.iteritems(): + for port, port_insts in ports.items(): for inst in port_insts: if inst['id'] == port_obj['port']['id']: return inst['name'] == this_port_name diff --git a/snaps/openstack/utils/tests/nova_utils_tests.py b/snaps/openstack/utils/tests/nova_utils_tests.py index f6c9156..0a2b24b 100644 --- a/snaps/openstack/utils/tests/nova_utils_tests.py +++ b/snaps/openstack/utils/tests/nova_utils_tests.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs") +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") # and others. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,8 +16,6 @@ import logging import os import uuid -from Crypto.PublicKey import RSA - from snaps.openstack.utils import nova_utils from snaps.openstack.tests.os_source_file_test import OSComponentTestCase from snaps.openstack.create_flavor import FlavorSettings @@ -71,8 +69,8 @@ class NovaUtilsKeypairTests(OSComponentTestCase): self.pub_key_file_path = self.priv_key_file_path + '.pub' self.nova = nova_utils.nova_client(self.os_creds) - self.keys = RSA.generate(1024) - self.public_key = self.keys.publickey().exportKey('OpenSSH') + self.keys = nova_utils.create_keys() + self.public_key = nova_utils.public_key_openssh(self.keys) self.keypair_name = guid self.keypair = None self.floating_ip = None @@ -106,9 +104,9 @@ class NovaUtilsKeypairTests(OSComponentTestCase): """ self.keypair = nova_utils.upload_keypair(self.nova, self.keypair_name, self.public_key) result = nova_utils.keypair_exists(self.nova, self.keypair) - self.assertEquals(self.keypair, result) + self.assertEqual(self.keypair, result) keypair = nova_utils.get_keypair_by_name(self.nova, self.keypair_name) - self.assertEquals(self.keypair, keypair) + self.assertEqual(self.keypair, keypair) def test_create_delete_keypair(self): """ @@ -116,7 +114,7 @@ class NovaUtilsKeypairTests(OSComponentTestCase): """ self.keypair = nova_utils.upload_keypair(self.nova, self.keypair_name, self.public_key) result = nova_utils.keypair_exists(self.nova, self.keypair) - self.assertEquals(self.keypair, result) + self.assertEqual(self.keypair, result) nova_utils.delete_keypair(self.nova, self.keypair) result2 = nova_utils.keypair_exists(self.nova, self.keypair) self.assertIsNone(result2) @@ -129,7 +127,7 @@ class NovaUtilsKeypairTests(OSComponentTestCase): nova_utils.save_keys_to_files(self.keys, self.pub_key_file_path, self.priv_key_file_path) self.keypair = nova_utils.upload_keypair_file(self.nova, self.keypair_name, self.pub_key_file_path) pub_key = open(os.path.expanduser(self.pub_key_file_path)).read() - self.assertEquals(self.keypair.public_key, pub_key) + self.assertEqual(self.keypair.public_key, pub_key) def test_floating_ips(self): """ @@ -141,7 +139,7 @@ class NovaUtilsKeypairTests(OSComponentTestCase): self.floating_ip = nova_utils.create_floating_ip(self.nova, self.ext_net_name) returned = nova_utils.get_floating_ip(self.nova, self.floating_ip) - self.assertEquals(self.floating_ip, returned) + self.assertEqual(self.floating_ip, returned) class NovaUtilsFlavorTests(OSComponentTestCase): @@ -192,17 +190,17 @@ class NovaUtilsFlavorTests(OSComponentTestCase): Validates the flavor_settings against the OpenStack flavor object """ self.assertIsNotNone(self.flavor) - self.assertEquals(self.flavor_settings.name, self.flavor.name) - self.assertEquals(self.flavor_settings.flavor_id, self.flavor.id) - self.assertEquals(self.flavor_settings.ram, self.flavor.ram) - self.assertEquals(self.flavor_settings.disk, self.flavor.disk) - self.assertEquals(self.flavor_settings.vcpus, self.flavor.vcpus) - self.assertEquals(self.flavor_settings.ephemeral, self.flavor.ephemeral) + self.assertEqual(self.flavor_settings.name, self.flavor.name) + self.assertEqual(self.flavor_settings.flavor_id, self.flavor.id) + self.assertEqual(self.flavor_settings.ram, self.flavor.ram) + self.assertEqual(self.flavor_settings.disk, self.flavor.disk) + self.assertEqual(self.flavor_settings.vcpus, self.flavor.vcpus) + self.assertEqual(self.flavor_settings.ephemeral, self.flavor.ephemeral) if self.flavor_settings.swap == 0: - self.assertEquals('', self.flavor.swap) + self.assertEqual('', self.flavor.swap) else: - self.assertEquals(self.flavor_settings.swap, self.flavor.swap) + self.assertEqual(self.flavor_settings.swap, self.flavor.swap) - self.assertEquals(self.flavor_settings.rxtx_factor, self.flavor.rxtx_factor) - self.assertEquals(self.flavor_settings.is_public, self.flavor.is_public) + self.assertEqual(self.flavor_settings.rxtx_factor, self.flavor.rxtx_factor) + self.assertEqual(self.flavor_settings.is_public, self.flavor.is_public) |