X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Fcreate_keypairs.py;h=cc32da31a39586e18513848569be729a72df59c7;hb=1342eb17df248ec75cc57e9c380a7753fc432194;hp=cf5a93dbddb75f8dcd3dbee99192160dc507bf26;hpb=e21c32da7fc25afa0f284dfa0dc8fb0e05fc4711;p=snaps.git diff --git a/snaps/openstack/create_keypairs.py b/snaps/openstack/create_keypairs.py index cf5a93d..cc32da3 100644 --- a/snaps/openstack/create_keypairs.py +++ b/snaps/openstack/create_keypairs.py @@ -15,7 +15,10 @@ import logging import os +from neutronclient.common.utils import str2bool from novaclient.exceptions import NotFound + +from snaps import file_utils from snaps.openstack.utils import nova_utils __author__ = 'spisarski' @@ -63,18 +66,31 @@ class OpenStackKeypair: self.__keypair = nova_utils.upload_keypair_file( self.__nova, self.keypair_settings.name, self.keypair_settings.public_filepath) - self.__delete_keys_on_clean = False + + if self.keypair_settings.delete_on_clean is not None: + delete_on_clean = self.keypair_settings.delete_on_clean + self.__delete_keys_on_clean = delete_on_clean + else: + self.__delete_keys_on_clean = False else: logger.info("Creating new keypair") - # TODO - Make this value configurable - keys = nova_utils.create_keys(1024) + keys = nova_utils.create_keys(self.keypair_settings.key_size) self.__keypair = nova_utils.upload_keypair( self.__nova, self.keypair_settings.name, nova_utils.public_key_openssh(keys)) - nova_utils.save_keys_to_files( + file_utils.save_keys_to_files( keys, self.keypair_settings.public_filepath, self.keypair_settings.private_filepath) - self.__delete_keys_on_clean = True + + if self.keypair_settings.delete_on_clean is not None: + delete_on_clean = self.keypair_settings.delete_on_clean + self.__delete_keys_on_clean = delete_on_clean + else: + self.__delete_keys_on_clean = True + elif self.__keypair and not os.path.isfile( + self.keypair_settings.private_filepath): + logger.warn("The public key already exist in OpenStack \ + but the private key file is not found ..") return self.__keypair @@ -90,10 +106,14 @@ class OpenStackKeypair: self.__keypair = None if self.__delete_keys_on_clean: - if self.keypair_settings.public_filepath: + if (self.keypair_settings.public_filepath and + file_utils.file_exists( + self.keypair_settings.public_filepath)): os.chmod(self.keypair_settings.public_filepath, 0o777) os.remove(self.keypair_settings.public_filepath) - if self.keypair_settings.private_filepath: + if (self.keypair_settings.private_filepath and + file_utils.file_exists( + self.keypair_settings.private_filepath)): os.chmod(self.keypair_settings.private_filepath, 0o777) os.remove(self.keypair_settings.private_filepath) @@ -118,12 +138,34 @@ class KeypairSettings: public key file is or will be stored :param private_filepath: The path where the generated private key file will be stored + :param key_size: The number of bytes for the key size when it needs to + be generated (Must be >=512 default 1024) + :param delete_on_clean: when True, the key files will be deleted when + OpenStackKeypair#clean() is called :return: """ self.name = kwargs.get('name') self.public_filepath = kwargs.get('public_filepath') self.private_filepath = kwargs.get('private_filepath') + self.key_size = int(kwargs.get('key_size', 1024)) + + if kwargs.get('delete_on_clean') is not None: + if isinstance(kwargs.get('delete_on_clean'), bool): + self.delete_on_clean = kwargs.get('delete_on_clean') + else: + self.delete_on_clean = str2bool(kwargs.get('delete_on_clean')) + else: + self.delete_on_clean = None if not self.name: - raise Exception('Name is a required attribute') + raise KeypairSettingsError('Name is a required attribute') + + if self.key_size < 512: + raise KeypairSettingsError('key_size must be >=512') + + +class KeypairSettingsError(Exception): + """ + Exception to be thrown when keypair settings are incorrect + """