X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Fcreate_keypairs.py;h=b037c3f59d90114cfc779465b969d758787785f9;hb=refs%2Fchanges%2F51%2F57851%2F1;hp=16374ad9db8169673dcffed4bf9465e080c673a7;hpb=63ee8af859678fdf7b82225d5bf40bddef90c0b3;p=snaps.git diff --git a/snaps/openstack/create_keypairs.py b/snaps/openstack/create_keypairs.py index 16374ad..b037c3f 100644 --- a/snaps/openstack/create_keypairs.py +++ b/snaps/openstack/create_keypairs.py @@ -15,10 +15,11 @@ import logging import os -from neutronclient.common.utils import str2bool 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' @@ -26,64 +27,74 @@ __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() + + 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) - logger.info('Creating keypair %s...' % self.keypair_settings.name) + 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) if self.keypair_settings.delete_on_clean is not None: - self.__delete_keys_on_clean = self.keypair_settings.delete_on_clean + 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) if self.keypair_settings.delete_on_clean is not None: - self.__delete_keys_on_clean = self.keypair_settings.delete_on_clean + 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( @@ -99,7 +110,7 @@ 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 @@ -108,13 +119,21 @@ class OpenStackKeypair: 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) + 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)): - os.chmod(self.keypair_settings.private_filepath, 0o777) - os.remove(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) + + super(self.__class__, self).clean() def get_keypair(self): """ @@ -124,41 +143,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 - :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') - - 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 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)