Exemple #1
0
    def get_config_section(location, user_configurator, options=None):

        config = UserConfigurator.userConfiguratorToDictWithFormattedKeys(
            user_configurator, selected_section=location.id)

        options = options or {}
        options['verboseLevel'] = -1
        options['verbose_level'] = -1

        configHolder = ConfigHolder(options=(options or {}), config=config)
        configHolder.pdiskProtocol = 'https'

        return configHolder
Exemple #2
0
class StratusLabCluster(cluster_tools.ICluster):
    """
    Connector class for StratusLab Clouds - Has not been tested for years.
    """

    VM_TARGETSTATE = "Running"
    VM_NODES = "1"
    VM_SHUTDOWN = 90.0
    ERROR = 1

    VM_STATES = {
        'INIT': 'Starting',
        'BOOT': 'Starting',
        'PROLOG': 'Starting',
        'PENDING': 'Starting',
        'HOLD': 'Starting',
        'RUNNING': 'Running',
        'ACTIVE': 'Running',
        'STOPPED': 'Running',
        'SUSPENDED': 'Running',
        'DONE': 'Shutdown',
        'EPILOG': 'Shutdown',
        'FAILED': 'Error',
        'FAILURE': 'Error',
        'UNKNOWN': 'Error',
    }
    log = utilities.get_cloudscheduler_logger()
    config = ConfigParser.ConfigParser()
    config_file = os.path.expanduser('~/.stratuslab/stratuslab-user.cfg')
    config_section = 'default'
    config.read(config_file)

    #Read the stratuslab configuration file
    username, password, endpoint = None, None, None

    try:
        username = config.get(config_section, 'username')
    except ConfigParser.NoOptionError:
        log.error(
            "Stratuslab config file %s does not contain username. VM creation will fail",
            config_file)
    except ConfigParser.NoSectionError:
        log.error(
            "No section '%s' found Stratuslab config file '%s'. \
                  Do the file and section exist? VM creation will fail",
            config_section, config_file)
    try:
        password = config.get(config_section, 'password')
    except ConfigParser.NoOptionError:
        log.error(
            "Stratuslab config file %s does not contain password. VM creation will fail",
            config_file)
    except ConfigParser.NoSectionError:
        log.error(
            "No section '%s' found Stratuslab config file '%s'. \
                  Do the file and section exist? VM creation will fail",
            config_section, config_file)

    try:
        endpoint = config.get(config_section, 'endpoint')
    except ConfigParser.NoOptionError:
        log.error(
            "Stratuslab config file %s does not contain endpoint. VM creation will fail",
            config_file)
    except ConfigParser.NoSectionError:
        log.error(
            "No section '%s' found Stratuslab config file '%s'. \
                  Do the file and section exist? VM creation will fail",
            config_section, config_file)

    options = Runner.defaultRunOptions()
    options.update({
        'username': username,
        'password': password,
        'endpoint': endpoint,
        'marketplaceEndpoint': 'https://marketplace.stratuslab.eu',
        'mpi_machine_file': True,
        'cluster_admin': 'root',
        'master_vmid': None,
        'tolerate_failures': False,
        'clean_after_failure': False,
        'include_master': True,
        'shared_folder': '/home',
        'add_packages': None,
        'ssh_hostbased': True,
        'verboseLevel': 0
    })
    _v_configHolder = ConfigHolder(options)

    __idMap = {}
    __vmMap = {}

    def __init__(
        self,
        name="Dummy StratusLab Cluster",
        host="localhost",
        cloud_type="StratusLab",
        memory=None,
        max_vm_mem=-1,
        cpu_archs=None,
        networks=None,
        vm_slots=0,
        cpu_cores=0,
        storage=0,
        contextualization='',
        enabled=True,
        priority=0,
        keep_alive=0,
    ):

        # Call super class' init
        cluster_tools.ICluster.__init__(
            self,
            name=name,
            host=host,
            cloud_type=cloud_type,
            memory=memory,
            max_vm_mem=max_vm_mem,
            cpu_archs=cpu_archs,
            networks=networks,
            vm_slots=vm_slots,
            cpu_cores=cpu_cores,
            storage=storage,
            enabled=enabled,
            priority=priority,
            keep_alive=keep_alive,
        )
        try:
            contex = open(contextualization, 'r')
            strat = contex.read()
            StratusLabCluster._v_configHolder.set('extraContextData', 'EC2_USER_DATA=%s' \
                                                  %base64.standard_b64encode(strat))
        except IOError:
            self.log.error(
                "Contextualization file '%s' is not valid. \
                      Proceeding without contextualization...",
                str(contextualization))

        self.__runnerIds = {}

    def vm_create(self,
                  vm_name,
                  vm_type="CernVM",
                  vm_user="******",
                  vm_networkassoc="",
                  vm_image="",
                  vm_mem=1,
                  vm_cores=1,
                  vm_storage=30,
                  vm_keepalive=0,
                  myproxy_creds_name=None,
                  myproxy_server=None,
                  myproxy_server_port=None,
                  job_per_core=False,
                  vm_loc=''):

        self.log.debug(
            "Running new instance with Marketplace id %s in StratusLab",
            str(vm_loc))
        runner = None

        if vm_loc not in StratusLabCluster.__idMap:
            #vm_loc: URL of VM or key? Does not seem to matter in Runner (l.506)
            runner = Runner(vm_loc, StratusLabCluster._v_configHolder)
            StratusLabCluster.__idMap[vm_loc] = runner
        else:
            runner = StratusLabCluster.__idMap[vm_loc]

        try:
            ids = runner.runInstance()
            self.log.debug("Created instances: %s", str(ids))
            #for new_id in ids:
            new_id = ids[len(ids) - 1]
            #if job didnt't set a keep_alive use the clouds default
            if not vm_keepalive and self.keep_alive:
                vm_keepalive = self.keep_alive
            new_vm = cluster_tools.VM(name=vm_name,
                                      id=str(new_id),
                                      vmtype=vm_type,
                                      user=vm_user,
                                      network=vm_networkassoc,
                                      image=vm_image,
                                      memory=vm_mem,
                                      cpucores=vm_cores,
                                      storage=vm_storage,
                                      keep_alive=vm_keepalive,
                                      myproxy_creds_name=myproxy_creds_name,
                                      myproxy_server=myproxy_server,
                                      myproxy_server_port=myproxy_server_port,
                                      job_per_core=job_per_core)

            StratusLabCluster.__vmMap[str(new_id)] = vm_loc

            if vm_loc not in self.__runnerIds:
                self.__runnerIds[vm_loc] = [
                    str(new_id),
                ]
            else:
                self.__runnerIds[vm_loc].append(str(new_id))
            self.vms.append(new_vm)

            try:
                self.resource_checkout(new_vm)
            except:
                self.log.exception(
                    "Unexpected error checking out resources when creating a VM."
                    " Programming error?")
                return self.ERROR
            #endfor
            return 0

        except Exception, e:
            self.log.exception(
                "Exception running new instance in StratusLab: %s", str(e))
            return -1