X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Fcreate_keypairs.py;h=a181a7bf4454da1004cbd45b317052f77cab6f73;hb=345cc4e80de42729f62bd2c5cfe6a2e31273ac4d;hp=03ff7ec8c8032ee293606067403f39ae3f9394fd;hpb=7d5d0625b881361b946ea059916e203bd81a16fa;p=snaps.git diff --git a/snaps/openstack/create_keypairs.py b/snaps/openstack/create_keypairs.py index 03ff7ec..a181a7b 100644 --- a/snaps/openstack/create_keypairs.py +++ b/snaps/openstack/create_keypairs.py @@ -16,6 +16,10 @@ import logging import os from novaclient.exceptions import NotFound + +from snaps import file_utils +from snaps.config.keypair import KeypairConfig +from snaps.openstack.openstack_creator import OpenStackComputeObject from snaps.openstack.utils import nova_utils __author__ = 'spisarski' @@ -23,58 +27,76 @@ __author__ = 'spisarski' logger = logging.getLogger('OpenStackKeypair') -class OpenStackKeypair: +class OpenStackKeypair(OpenStackComputeObject): """ - Class responsible for creating a keypair in OpenStack + Class responsible for managing a keypair in OpenStack """ def __init__(self, os_creds, keypair_settings): """ Constructor - all parameters are required :param os_creds: The credentials to connect with OpenStack - :param keypair_settings: The settings used to create a keypair + :param keypair_settings: a KeypairConfig object """ - self.__nova = None - self.__os_creds = os_creds + super(self.__class__, self).__init__(os_creds) + self.keypair_settings = keypair_settings - self.__nova = nova_utils.nova_client(os_creds) self.__delete_keys_on_clean = True # Attributes instantiated on create() self.__keypair = None - def create(self, cleanup=False): + def initialize(self): """ - Responsible for creating the keypair object. - :param cleanup: Denotes whether or not this is being called for cleanup - or not + Loads the existing OpenStack Keypair + :return: The Keypair domain object or None """ - self.__nova = nova_utils.nova_client(self.__os_creds) + super(self.__class__, self).initialize() - logger.info('Creating keypair %s...' % self.keypair_settings.name) + try: + self.__keypair = nova_utils.get_keypair_by_name( + self._nova, self.keypair_settings.name) + return self.__keypair + except Exception as e: + logger.warn('Cannot load existing keypair - %s', e) + + def create(self): + """ + Responsible for creating the keypair object. + :return: The Keypair domain object or None + """ + self.initialize() - self.__keypair = nova_utils.get_keypair_by_name( - self.__nova, self.keypair_settings.name) + if not self.__keypair: + logger.info('Creating keypair %s...' % self.keypair_settings.name) - if not self.__keypair and not cleanup: if self.keypair_settings.public_filepath and os.path.isfile( self.keypair_settings.public_filepath): logger.info("Uploading existing keypair") self.__keypair = nova_utils.upload_keypair_file( - self.__nova, self.keypair_settings.name, + 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, + 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 \ @@ -88,18 +110,28 @@ class OpenStackKeypair: """ if self.__keypair: try: - nova_utils.delete_keypair(self.__nova, self.__keypair) + nova_utils.delete_keypair(self._nova, self.__keypair) except NotFound: pass self.__keypair = None if self.__delete_keys_on_clean: - if 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: - os.chmod(self.keypair_settings.private_filepath, 0o777) - os.remove(self.keypair_settings.private_filepath) + if (self.keypair_settings.public_filepath and + file_utils.file_exists( + self.keypair_settings.public_filepath)): + expanded_path = os.path.expanduser( + self.keypair_settings.public_filepath) + os.chmod(expanded_path, 0o755) + os.remove(expanded_path) + logger.info('Deleted public key file [%s]', expanded_path) + if (self.keypair_settings.private_filepath and + file_utils.file_exists( + self.keypair_settings.private_filepath)): + expanded_path = os.path.expanduser( + self.keypair_settings.private_filepath) + os.chmod(expanded_path, 0o755) + os.remove(expanded_path) + logger.info('Deleted private key file [%s]', expanded_path) def get_keypair(self): """ @@ -109,31 +141,13 @@ class OpenStackKeypair: return self.__keypair -class KeypairSettings: +class KeypairSettings(KeypairConfig): """ Class representing a keypair configuration """ def __init__(self, **kwargs): - """ - Constructor - all parameters are optional - :param name: The keypair name. - :param public_filepath: The path to/from the filesystem where the - public key file is or will be stored - :param private_filepath: The path where the generated private key file - will be stored - :return: - """ - - self.name = kwargs.get('name') - self.public_filepath = kwargs.get('public_filepath') - self.private_filepath = kwargs.get('private_filepath') - - if not self.name: - raise KeypairSettingsError('Name is a required attribute') - - -class KeypairSettingsError(Exception): - """ - Exception to be thrown when keypair settings are incorrect - """ + from warnings import warn + warn('Use snaps.config.keypair.KeypairConfig instead', + DeprecationWarning) + super(self.__class__, self).__init__(**kwargs)