def __init__(self, **kwargs): # Get the specified AT instance logger.debug(f"AnsibleTower instantiated with {kwargs=}") instance_name = kwargs.pop("AnsibleTower", None) # Validate the AnsibleTower-specific settings self._validate_settings(instance_name) # get our instance settings self.url = settings.ANSIBLETOWER.base_url self.uname = settings.ANSIBLETOWER.get("username") self.pword = settings.ANSIBLETOWER.get("password") self.token = settings.ANSIBLETOWER.get("token") self._inventory = ( kwargs.get("tower_inventory") or settings.ANSIBLETOWER.inventory ) # Init the class itself self._construct_params = [] config = kwargs.get("config", awxkit.config) config.base_url = self.url root = kwargs.get("root") if root is None: root = awxkit.api.Api() # support mock stub for unit tests # Prefer token if its set, otherwise use username/password # auth paths for the API taken from: # https://github.com/ansible/awx/blob/ddb6c5d0cce60779be279b702a15a2fddfcd0724/awxkit/awxkit/cli/client.py#L85-L94 # unit test mock structure means the root API instance can't be loaded on the same line if self.token: helpers.emit(auth_type="token") logger.info("Using token authentication") config.token = self.token try: root.connection.login( username=None, password=None, token=self.token, auth_type="Bearer" ) except awxkit.exceptions.Unauthorized as err: raise exceptions.AuthenticationError(err.args[0]) versions = root.get().available_versions try: # lookup the user that authenticated with the token # If a username was specified in config, use that instead my_username = ( self.uname or versions.v2.get().me.get().results[0].username ) except (IndexError, AttributeError): # lookup failed for whatever reason raise exceptions.ProviderError( provider="AnsibleTower", message="Failed to lookup a username for the given token, please check credentials", ) else: # dynaconf validators should have checked that either token or password was provided helpers.emit(auth_type="password") logger.info("Using username and password authentication") config.credentials = { "default": {"username": self.uname, "password": self.pword} } config.use_sessions = True root.load_session().get() versions = root.available_versions my_username = self.uname self.v2 = versions.v2.get() self.username = my_username
def inventory(self): if not self._inventory: return elif isinstance(self._inventory, int): # inventory already resolved as id return self._inventory if (inventory_info := self.v2.inventory.get(search=self._inventory)) : if inventory_info.count > 1: raise exceptions.ProviderError( provider="AnsibleTower", message=f"Ambigious AnsibleTower inventory name {self._inventory}", ) elif inventory_info.count == 1: inv_struct = inventory_info.results.pop() return inv_struct.id else: raise exceptions.ProviderError( provider="AnsibleTower", message=f"Unknown AnsibleTower inventory {self._inventory}", )
def _ensure_image(self, name): """Check if an image exists on the provider, attempt a pull if not""" for image in self.runtime.images: if name in image.tags: return elif ("localhost/" in name) and (name[10:] in image.tags): return try: self.runtime.pull_image(name) except Exception as err: raise exceptions.ProviderError( "Container", f"Unable to find image: {name}\n{err}" )
def __init__(self, **kwargs): instance_name = kwargs.pop("Container", None) self._validate_settings(instance_name) if kwargs.get("bind") is not None: self._runtime_cls = kwargs.pop("bind") elif settings.container.runtime.lower() == "podman": self._runtime_cls = containers.PodmanBind elif settings.container.runtime.lower() == "docker": self._runtime_cls = containers.DockerBind else: raise exceptions.ProviderError( "Container", f"Broker has no bind for {settings.container.runtime} containers", ) self._runtime = None # this will be used later self._name_prefix = settings.container.get("name_prefix", getpass.getuser())
import json import yaml from urllib import parse as url_parser from functools import cached_property from dynaconf import Validator from broker import exceptions from broker.helpers import results_filter from broker.settings import settings from logzero import logger from datetime import datetime try: import awxkit except: raise exceptions.ProviderError( provider="AnsibleTower", message="Unable to import awxkit. Is it installed?") from broker.providers import Provider from broker import helpers class AnsibleTower(Provider): _validators = [ Validator("ANSIBLETOWER.release_workflow", default="remove-vm"), Validator("ANSIBLETOWER.extend_workflow", default="extend-vm"), Validator("ANSIBLETOWER.new_expire_time", default="+172800"), Validator("ANSIBLETOWER.workflow_timeout", is_type_of=int, default=3600),