molecule-hetznercloud/molecule_hetznercloud/driver.py
Sorin Sbarnea 74540ee975
All checks were successful
continuous-integration/drone/tag Build is passing
Remove deprecated molecule cache (#35)
This makes the driver version with future versions of molecule,
which will no longer have the cache in them. Same kind of change
was already merged in two other drivers podman and docker.

Related: https://github.com/ansible-community/molecule/pull/3180
2021-09-02 12:49:08 +01:00

107 lines
3.0 KiB
Python

import os
from ansible_compat.ports import cache
from molecule import logger, util
from molecule.api import Driver
from molecule.util import sysexit_with_message
log = logger.get_logger(__name__)
class HetznerCloud(Driver):
def __init__(self, config=None):
super(HetznerCloud, self).__init__(config)
self._name = "hetznercloud"
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
@property
def login_cmd_template(self):
connection_options = " ".join(self.ssh_connection_options)
return (
"ssh {{address}} "
"-l {{user}} "
"-p {{port}} "
"-i {{identity_file}} "
"{}"
).format(connection_options)
@property
def default_safe_files(self):
return [self.instance_config]
@property
def default_ssh_connection_options(self):
return self._get_ssh_connection_options()
def login_options(self, instance_name):
d = {"instance": instance_name}
return util.merge_dicts(d, self._get_instance_config(instance_name))
def ansible_connection_options(self, instance_name):
try:
d = self._get_instance_config(instance_name)
return {
"ansible_user": d["user"],
"ansible_host": d["address"],
"ansible_port": d["port"],
"ansible_private_key_file": d["identity_file"],
"connection": "ssh",
"ansible_ssh_common_args": " ".join(self.ssh_connection_options),
}
except StopIteration:
return {}
except IOError:
return {}
def template_dir(self):
return os.path.join(
os.path.dirname(__file__),
"cookiecutter/scenario/driver/{}".format(self.name),
)
def _get_instance_config(self, instance_name):
instance_config_dict = util.safe_load_file(self._config.driver.instance_config)
return next(
item for item in instance_config_dict if item["instance"] == instance_name
)
@cache
def sanity_checks(self):
"""Hetzner Cloud driver sanity checks."""
log.info("Sanity checks: '{}'".format(self._name))
try:
import hcloud # noqa
except ImportError:
msg = (
"Missing Hetzner Cloud driver dependency. Please "
"install the 'molecule-hetznercloud' package or "
"refer to your INSTALL.rst driver documentation file"
)
sysexit_with_message(msg)
if "HCLOUD_TOKEN" not in os.environ:
msg = (
"Missing Hetzner Cloud API token. Please expose "
"the HCLOUD_TOKEN environment variable with your "
"account API token value"
)
sysexit_with_message(msg)
def reset(self):
"""Destroy all resources managed by this plugin."""
# TODO(decentral1se): implement if ever needed
pass