Skip to content

Commit 723a92d

Browse files
committed
Release v0.4.0
1 parent 9c9ef08 commit 723a92d

File tree

16 files changed

+85
-45
lines changed

16 files changed

+85
-45
lines changed

CHANGELOG.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.4.0] - 2021-06-11
11+
12+
### Added
13+
14+
- Now possible to execute services in stages (#227)
15+
- Service policies (#236)
16+
- Supply private key to ansible using `stackl_private_key` (#248)
17+
18+
### Changed
19+
20+
- Ansible outputs now make use of callback plugin (#242)
21+
- New way of supplying command args for all the handlers
22+
- Terraform backend can now be a jinja template (#265)
23+
- Vault secrets also can be used as env variables with envconsul
24+
25+
### Fixed
26+
27+
- Generic invocation now gets chosen by default
28+
1029
## [0.3.3] - 2021-02-18
1130

1231
### Fixed
@@ -93,7 +112,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
93112
- Add reporting policies
94113
- Add codeql-analysis
95114

96-
[unreleased]: https://github.com/stacklio/stackl/compare/v0.3.3...HEAD
115+
[unreleased]: https://github.com/stacklio/stackl/compare/v0.4.0...HEAD
116+
[0.4.0]: https://github.com/stacklio/stackl/compare/v0.3.3...v0.4.0
97117
[0.3.3]: https://github.com/stacklio/stackl/compare/v0.3.2...v0.3.3
98118
[0.3.2]: https://github.com/stacklio/stackl/compare/v0.3.1...v0.3.2
99119
[0.3.1]: https://github.com/stacklio/stackl/compare/v0.3.0...v0.3.1

stackl/agent/agent/kubernetes/handlers/ansible_handler.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,16 @@
1414
PLAYBOOK_INCLUDE_ROLE = """
1515
- hosts: "{{ pattern }}"
1616
serial: "{{ serial }}"
17-
gather_facts: no
17+
connection: "{{ connection }}"
18+
gather_facts: "{{ stackl_gather_facts }}"
19+
pre_tasks:
20+
- wait_for:
21+
port: "{{ wait_for_port | int }}"
22+
timeout: 60
23+
when: wait_for_port is defined
1824
tasks:
1925
- include_role:
2026
name: "{{ ansible_role }}"
21-
- hosts: localhost
22-
connection: local
23-
gather_facts: no
24-
tasks:
25-
- set_fact:
26-
output_dict: "{{ hostvars }}"
27-
- copy:
28-
content: "{{ output_dict | to_nice_json }}"
29-
dest: "{{ outputs_path | default('/tmp/outputs.json') }}"
3027
"""
3128

3229

@@ -122,12 +119,24 @@ def create_command_args(self) -> List[str]:
122119
else:
123120
pattern = self._service + "_" + str(self.index)
124121

122+
if self._invoc.ansible_role:
123+
ansible_role = self._invoc.ansible_role
124+
else:
125+
ansible_role = self._functional_requirement
126+
125127
ansible_commands = [
126-
'ansible', pattern, '-m', 'include_role', '-v', '-i',
127-
'/opt/ansible/playbooks/inventory/stackl.yml', '-a',
128-
f'name={self._functional_requirement}'
128+
'ansible-playbook', '/opt/ansible/playbooks/stackl/playbook-role.yml', '-i',
129+
'/opt/ansible/playbooks/inventory/stackl.yml', '-e', f'pattern={pattern}', '-e', f'ansible_role={ansible_role}',
130+
'-e', f'serial={self._invoc.serial}', '-e', f'stackl_gather_facts={self._invoc.gather_facts}'
129131
]
130132

133+
if self._invoc.wait_for_port:
134+
ansible_commands.extend(['-e', f'wait_for_port={self._invoc.wait_for_port}'])
135+
136+
if self._invoc.connection:
137+
ansible_commands.extend(['-e', f'connection={self._invoc.connection}'])
138+
139+
ansible_commands.extend(['-e', f'state=present'])
131140
return ansible_commands
132141

133142
@property

stackl/agent/agent/kubernetes/handlers/packer_handler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,12 @@ def create_command_args(self) -> List[str]:
7474
if self._secret_handler.secret_variables_file:
7575
packer_commands += f' -var-file {self._secret_handler.secret_variables_file}'
7676

77-
packer_commands = self._secret_handler.customize_commands(packer_commands)
7877
if self._output:
7978
packer_commands = self._output.customize_commands(
8079
packer_commands)
8180

81+
packer_commands = self._secret_handler.customize_commands(packer_commands)
82+
8283
packer_commands += ' /opt/packer/src/packer.json'
8384

8485
command_args.append(packer_commands)

stackl/agent/agent/kubernetes/handlers/terraform_handler.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,14 @@ def create_command_args(self) -> List[str]:
101101
if self._secret_handler.secret_variables_file:
102102
terraform_commands += f' -var-file {self._secret_handler.secret_variables_file}'
103103

104-
terraform_commands = self._secret_handler.customize_commands(
105-
terraform_commands)
106-
107104
if self._output:
108105
terraform_commands = self._output.customize_commands(
109106
terraform_commands)
107+
108+
terraform_commands = self._secret_handler.customize_commands(
109+
terraform_commands)
110+
111+
110112

111113
command_args.append(terraform_commands)
112114
return command_args

stackl/agent/agent/main.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class Invocation:
3535
tool: str
3636
hosts: List
3737
playbook_path: str = None
38+
ansible_role: str = None
39+
gather_facts: bool = True
40+
connection: str = "remote"
41+
wait_for_port: int = None
3842
serial: int = 10
3943

4044

stackl/agent/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "agent"
3-
version = "0.3.4dev"
3+
version = "0.4.0"
44
description = ""
55
authors = ["Frederic <[email protected]>"]
66

stackl/cli/setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from setuptools import setup, find_packages
22

3-
__version__ = "0.3.4dev"
3+
__version__ = "0.4.0"
44

55
setup(
66
name='stackl-cli',
77
version=__version__,
88
py_modules=['stackl', 'commands', 'context'],
99
packages=find_packages(),
1010
install_requires=[
11-
f'stackl-client==0.3.4dev', 'pyYAML==5.4.1', 'Click==7.0',
11+
f'stackl-client==0.4.0', 'pyYAML==5.4.1', 'Click==7.0',
1212
'mergedeep==1.3.0', 'tabulate==0.8.6', 'glom==19.10.0'
1313
],
1414
entry_points='''

stackl/core/core/agent_broker/agent_task_broker.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515

1616
async def create_service(action, redis, stack_instance, to_be_deleted,
17-
force_delete, service_name, service):
17+
force_delete, service_name, service, index):
1818
opa_broker_factory = OPABrokerFactory()
1919
opa_broker = opa_broker_factory.get_opa_broker()
2020
success = True
@@ -43,6 +43,10 @@ async def create_service(action, redis, stack_instance, to_be_deleted,
4343
if action == "delete":
4444
functional_requirements = reversed(functional_requirements)
4545
for fr in functional_requirements:
46+
stack_instance = document_manager.get_stack_instance(stack_instance.name)
47+
service = stack_instance.services[service_name][index]
48+
logger.debug(
49+
f"Debug for service'{service}'")
4650
fr_doc = document_manager.get_functional_requirement(fr)
4751
fr_jobs = []
4852
infrastructure_target = service.infrastructure_target
@@ -79,6 +83,13 @@ async def create_service(action, redis, stack_instance, to_be_deleted,
7983
cloud_provider].playbook_path
8084
if fr_doc.invocation[cloud_provider].serial:
8185
invoc['serial'] = fr_doc.invocation[cloud_provider].serial
86+
if fr_doc.invocation[cloud_provider].ansible_role:
87+
invoc['ansible_role'] = fr_doc.invocation[cloud_provider].ansible_role
88+
if fr_doc.invocation[cloud_provider].connection:
89+
invoc['connection'] = fr_doc.invocation[cloud_provider].connection
90+
if fr_doc.invocation[cloud_provider].wait_for_port:
91+
invoc['wait_for_port'] = fr_doc.invocation[cloud_provider].wait_for_port
92+
invoc['gather_facts'] = fr_doc.invocation[cloud_provider].gather_facts
8293
invoc['service'] = service_name
8394
invoc["hosts"] = service.hosts
8495
logger.debug("Appending job")
@@ -135,15 +146,14 @@ async def create_job_per_service(services,
135146
force_delete=False):
136147
success = True
137148
stage_jobs = []
138-
document_mananger = get_document_manager()
139149
# do stages
140150
if stack_instance.stages:
141151
for stage in stack_instance.stages:
142152
for service_name in stage.services:
143-
for service in stack_instance.services[service_name]:
153+
for idx, service in enumerate(stack_instance.services[service_name]):
144154
success = create_service(action, redis, stack_instance,
145155
to_be_deleted, force_delete,
146-
service_name, service)
156+
service_name, service, idx)
147157
stage_jobs.append(asyncio.create_task(success))
148158

149159
await asyncio.gather(*stage_jobs)
@@ -152,10 +162,10 @@ async def create_job_per_service(services,
152162
# not using stages
153163
else:
154164
for service_name, service_list in services.items():
155-
for service in service_list:
165+
for idx, service in enumerate(service_list):
156166
success = await create_service(action, redis, stack_instance,
157167
to_be_deleted, force_delete,
158-
service_name, service)
168+
service_name, service, idx)
159169

160170
return success
161171

stackl/core/core/handler/stack_handler.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -371,14 +371,17 @@ def add_outputs(self, outputs_update):
371371
**service_definition.outputs,
372372
**outputs_update.outputs
373373
}
374+
if "stackl_hosts" in service_definition.outputs:
375+
service_definition.hosts = service_definition.outputs[
376+
"stackl_hosts"]
377+
break
378+
for _, service_list in stack_instance.services.items():
379+
for service_definition in service_list:
374380
service_definition.provisioning_parameters = {
375381
**service_definition.provisioning_parameters,
376382
**stack_instance.instance_outputs,
377383
**service_definition.outputs
378384
}
379-
if "stackl_hosts" in service_definition.outputs:
380-
service_definition.hosts = service_definition.outputs[
381-
"stackl_hosts"]
382385

383386
return stack_instance
384387

@@ -644,14 +647,12 @@ def _update_infr_capabilities(
644647
else:
645648
infr_target_cloud_provider = "generic"
646649

647-
infr_target_packages = environment.packages + location.packages + zone.packages
648650
infr_target_key = ".".join(
649651
[environment.name, location.name, zone.name])
650652
infr_targets_capabilities[
651653
infr_target_key] = StackInfrastructureTarget(
652654
provisioning_parameters=infr_target_capability,
653655
tags=infr_target_tags,
654-
packages=infr_target_packages,
655656
resources=infr_target_resources,
656657
secrets=infr_target_secrets,
657658
policies=infr_target_policies,

stackl/core/core/models/configs/functional_requirement_model.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Module containing functional requirement classes
33
"""
4-
from typing import Dict, Optional
4+
from typing import Any, Dict, Optional, Union
55

66
from pydantic import BaseModel # pylint: disable=E0611 #error in pylint
77

@@ -15,7 +15,11 @@ class Invocation(BaseModel):
1515
image: str
1616
before_command: Optional[str] = ""
1717
playbook_path: str = ""
18+
ansible_role: str = ""
19+
gather_facts: bool = True
1820
serial: int = 10
21+
connection: str = "ssh"
22+
wait_for_port: Any = None
1923

2024

2125
class FunctionalRequirement(BaseDocument):

0 commit comments

Comments
 (0)