Example #1
0
 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
Example #2
0
 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}",
             )
Example #3
0
 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}"
         )
Example #4
0
 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())
Example #5
0
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),
Example #6
0
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),