Esempio n. 1
0
    def _update_container_yml(self, role_obj):
        snippet = self._get_container_yml_snippet(role_obj)
        if not snippet:
            return None
        container_yml_path = os.path.join(ANSIBLE_CONTAINER_PATH,
                                          'container.yml')
        try:
            container_yml = ruamel.yaml.round_trip_load(
                open(container_yml_path))
        except Exception as exc:
            raise exceptions.AnsibleContainerGalaxyFatalException(
                'Failed to load container.yml: %s' % str(exc))

        if not container_yml['services']:
            container_yml['services'] = {}
        services = container_yml['services']
        # The snippet should be a dictionary with one key
        new_service_key = snippet.keys()[0]
        if new_service_key in services:
            raise exceptions.AnsibleContainerGalaxyRoleException(
                'Role defines service %s, but container.yml already has a service with this name'
                % new_service_key)

        # Add role name to the service's list of roles
        services[new_service_key] = snippet[new_service_key]
        if not services[new_service_key].get('roles'):
            services[new_service_key]['roles'] = []
        if role_obj.name not in services[new_service_key]['roles']:
            services[new_service_key]['roles'].append(role_obj.name)

        try:
            ruamel.yaml.round_trip_dump(container_yml,
                                        stream=open(container_yml_path, 'w'))
        except Exception as exc:
            raise exceptions.AnsibleContainerGalaxyFatalException(
                'Error updating container.yml - %s' % str(exc))
        return new_service_key
Esempio n. 2
0
 def install(self, roles):
     roles_to_install = list(roles)
     with MakeTempDir() as temp_dir:
         self._galaxy = Galaxy(
             AttrDict(api_server=C.GALAXY_SERVER,
                      ignore_certs=C.GALAXY_IGNORE_CERTS,
                      ignore_errors=False,
                      no_deps=False,
                      roles_path=[temp_dir],
                      token=None))  # FIXME: support tokens
         roles_processed = []
         role_failure = False
         with InCaseOfFail(temp_dir):
             while roles_to_install:
                 try:
                     role_to_install = roles_to_install.pop()
                     role_obj, installed = self._role_to_temp_space(
                         role_to_install)
                     if installed:
                         deps = role_obj.metadata.get('dependencies', [])
                         for dep in deps:
                             if dep not in roles_to_install + roles_processed:
                                 roles_to_install.append(dep)
                         self._update_container_yml(role_obj)
                         self._update_requirements_yml(role_obj)
                     roles_processed.append(role_to_install)
                 except exceptions.AnsibleContainerGalaxyFatalException as exc:
                     logger.error(exc)
                     raise
                 except exceptions.AnsibleContainerGalaxyRoleException as exc:
                     logger.error(exc)
                     role_failure = True
                     continue
     if role_failure:
         raise exceptions.AnsibleContainerGalaxyRoleException(
             'One or more roles failed.')