Skip to content

Commit ce8437d

Browse files
authored
feat: split extras by features (#144)
1 parent 1b1e7ff commit ce8437d

File tree

5 files changed

+28
-12
lines changed

5 files changed

+28
-12
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ Idea came from puppet's hiera.
4343

4444
```sh
4545
pip install himl
46+
# or, optionally install with all extras dependencies: vault and s3 interpolation support
47+
pip install himl[all]
48+
# or, specify which extras dependencies you need
49+
pip install himl[vault,s3]
4650
```
4751

4852
### Using `docker` image

himl/config_generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,9 @@ def exclude_keys(self, keys):
295295
logger.info("Excluded key %s not found or already removed", key)
296296

297297
def add_dynamic_data(self):
298-
remote_state_retriever = S3TerraformRemoteStateRetriever()
299298
if "remote_states" in self.generated_data:
299+
from .remote_state import S3TerraformRemoteStateRetriever
300+
remote_state_retriever = S3TerraformRemoteStateRetriever()
300301
state_files = self.generated_data["remote_states"]
301302
remote_states = remote_state_retriever.get_dynamic_data(state_files)
302303
self.merge_value(self.generated_data, remote_states, self.type_strategies, self.fallback_strategies,

himl/remote_state.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010

1111
import json
1212

13-
import boto3
14-
13+
try:
14+
import boto3
15+
except ImportError as e:
16+
raise Exception('Error while trying to read remote state, package "boto3" is required and cannot be imported: %s' % e)
1517

1618
class S3TerraformRemoteStateRetriever:
1719
@staticmethod

himl/secret_resolvers.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010

1111
import logging
1212
import os
13-
from .simplessm import SimpleSSM
14-
from .simples3 import SimpleS3
15-
from .simplevault import SimpleVault
1613

1714

1815
class SecretResolver:
@@ -33,7 +30,7 @@ def __init__(self, default_aws_profile=None):
3330
self.default_aws_profile = default_aws_profile
3431

3532
def supports(self, secret_type):
36-
return secret_type == "ssm"
33+
return "boto3" in sys.modules && secret_type == "ssm"
3734

3835
def resolve(self, secret_type, secret_params):
3936
aws_profile = secret_params.get("aws_profile", self.default_aws_profile)
@@ -43,6 +40,7 @@ def resolve(self, secret_type, secret_params):
4340

4441
path = self.get_param_or_exception("path", secret_params)
4542
region_name = secret_params.get("region_name", "us-east-1")
43+
from .simplessm import SimpleSSM
4644
ssm = SimpleSSM(aws_profile, region_name)
4745
return ssm.get(path)
4846

@@ -52,7 +50,7 @@ def __init__(self, default_aws_profile=None):
5250
self.default_aws_profile = default_aws_profile
5351

5452
def supports(self, secret_type):
55-
return secret_type == "s3"
53+
return "boto3" in sys.modules && secret_type == "s3"
5654

5755
def resolve(self, secret_type, secret_params):
5856
aws_profile = secret_params.get("aws_profile", self.default_aws_profile)
@@ -65,15 +63,17 @@ def resolve(self, secret_type, secret_params):
6563
region_name = secret_params.get("region_name", "us-east-1")
6664
base64Encode = secret_params.get("base64encode", False)
6765
base64Encode = base64Encode == 'true'
66+
from .simples3 import SimpleS3
6867
s3 = SimpleS3(aws_profile, region_name)
6968
return s3.get(bucket, path, base64Encode)
7069

7170

7271
class VaultSecretResolver(SecretResolver):
7372
def supports(self, secret_type):
74-
return secret_type == "vault"
73+
return "hvac" in sys.modules && secret_type == "vault"
7574

7675
def resolve(self, secret_type, secret_params):
76+
from .simplevault import SimpleVault
7777
vault = SimpleVault
7878

7979
# Generate a token for a policy
@@ -106,4 +106,4 @@ def resolve(self, secret_type, secret_params):
106106
if resolver.supports(secret_type):
107107
return resolver.resolve(secret_type, secret_params)
108108

109-
raise Exception("Could not resolve secret type '{}' with params {}".format(secret_type, secret_params))
109+
raise Exception("Could not resolve secret type '{}' with params {}. Check if you installed the required 3rd party modules.".format(secret_type, secret_params))

setup.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,18 @@
1515
'backports.functools_lru_cache==1.6.6',
1616
'pathlib2==2.3.7.post1',
1717
'pyyaml==6.0.1',
18-
'boto3==1.34.6',
19-
'hvac==1.2.1'
2018
]
2119

20+
_extras_require = {
21+
's3': [
22+
'boto3==1.34.6',
23+
],
24+
'vault': [
25+
'hvac==1.2.1',
26+
],
27+
}
28+
_extras_require['all'] = [dep for deps in _extras_require.values() for dep in deps]
29+
2230
setup(
2331
name='himl',
2432
version="0.15.1",
@@ -54,6 +62,7 @@
5462
packages=['himl'],
5563
include_package_data=True,
5664
install_requires=_install_requires,
65+
extras_require=_extras_require,
5766
entry_points={
5867
'console_scripts': [
5968
'himl = himl.main:run',

0 commit comments

Comments
 (0)