Skip to content

Commit 3025f60

Browse files
author
Frąckiewicz Radosław
committed
Merge branch 'release/v0.6.1'
2 parents 61c9c0b + 11a9be7 commit 3025f60

File tree

9 files changed

+162
-10
lines changed

9 files changed

+162
-10
lines changed

Diff for: README.rst

+4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
Puppeter - an automatic puppet installer
22
========================================
33

4+
**Work In Progress!**
5+
46
.. image:: https://travis-ci.org/coi-gov-pl/puppeter.svg?branch=develop
57
:target: https://travis-ci.org/coi-gov-pl/puppeter
68
.. image:: https://coveralls.io/repos/github/coi-gov-pl/puppeter/badge.svg?branch=feature%2Finstall-puppet-agent
79
:target: https://coveralls.io/github/coi-gov-pl/puppeter?branch=feature%2Finstall-puppet-agent
10+
.. image:: https://img.shields.io/pypi/v/puppeter.svg
11+
:target: https://pypi.python.org/pypi/puppeter
812

913

1014
A commandline tool to ease the installation of typical puppetserver - agent installation. It uses a interactive mode and batch mode as well. Batch mode utilizes a answer files for full automatic operation.

Diff for: puppeter/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Type
55

66
# The version of the app
7-
__version__ = '0.6.0'
7+
__version__ = '0.6.1'
88
__program__ = 'puppeter'
99

1010

Diff for: puppeter/domain/gateway/csr.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
from puppeter.domain.model.configurer import Configurer
77
from puppeter.domain.model.csr import CsrAttributesConfiguration
8+
from puppeter.domain.model.installer import Mode
89

910

1011
class CsrAttributesSetterGateway(with_metaclass(ABCMeta)):
1112
@abstractmethod
12-
def save_csr_attributes(self, csr_attrs):
13-
# type: (CsrAttributesConfiguration) -> Sequence[Configurer]
13+
def save_csr_attributes(self, csr_attrs, mode):
14+
# type: (CsrAttributesConfiguration, Mode) -> Sequence[Configurer]
1415
pass

Diff for: puppeter/persistence/gateway/csr.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,30 @@
55
from puppeter.domain.gateway.csr import CsrAttributesSetterGateway
66
from puppeter.domain.model.configurer import Configurer, ScriptFormat
77
from puppeter.domain.model.csr import CsrAttributesConfiguration
8+
from puppeter.domain.model.installer import Mode
89
from puppeter.domain.model.ordered import Order
910

1011

1112
@Order(250)
1213
class CsrAttributesConfigurer(Configurer):
13-
def __init__(self, csr_attrs):
14+
def __init__(self, csr_attrs, mode):
1415
self.__csr_attr = csr_attrs # type: CsrAttributesConfiguration
16+
self.__mode = mode # type: Mode
1517

1618
def produce_commands(self):
1719
mapping = dict(
1820
content=self.__as_yaml()
1921
)
22+
if self.__mode == Mode.Agent:
23+
template = 'csr_agent.pp'
24+
elif self.__mode == Mode.Server:
25+
template = 'csr_server.pp'
26+
else:
27+
raise Exception('Invalid mode given: {mode}'.format(mode=self.__mode))
28+
2029
return self._collector().collect_from_template(
2130
description='Configuring puppet node certificate CSR attributes',
22-
template='csr.pp',
31+
template=template,
2332
mapping=mapping,
2433
format=ScriptFormat.PUPPET
2534
).lines()
@@ -32,8 +41,8 @@ def __as_yaml(self):
3241

3342

3443
class CsrAttributesSetterGatewayImpl(CsrAttributesSetterGateway):
35-
def save_csr_attributes(self, csr_attrs):
36-
# type: (CsrAttributesConfiguration) -> Sequence[Configurer]
44+
def save_csr_attributes(self, csr_attrs, mode):
45+
# type: (CsrAttributesConfiguration, Mode) -> Sequence[Configurer]
3746
return [
38-
CsrAttributesConfigurer(csr_attrs)
47+
CsrAttributesConfigurer(csr_attrs, mode)
3948
]

Diff for: puppeter/persistence/gateway/csr_agent.pp

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
file { "${settings::confdir}/csr_attributes.yaml":
2+
ensure => 'file',
3+
mode => '0640',
4+
content => '@{content}',
5+
}

Diff for: puppeter/persistence/gateway/csr.pp renamed to puppeter/persistence/gateway/csr_server.pp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
ensure => 'file',
33
mode => '0640',
44
group => 'puppet',
5-
content => '@{content}'
5+
content => '@{content}',
66
}

Diff for: puppeter/presentation/answersprocessor.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,8 @@ def __setup_csr(answers):
9292
# type: (Answers) -> Sequence[Configurer]
9393
if answers.csrattrs_configuration() is not None:
9494
csrsetter = container.get(CsrAttributesSetterGateway)
95-
return csrsetter.save_csr_attributes(answers.csrattrs_configuration())
95+
return csrsetter.save_csr_attributes(
96+
answers.csrattrs_configuration(),
97+
answers.installer().mode()
98+
)
9699
return []

Diff for: tests/persistence/gateway/test_csr.py

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from puppeter.domain.model.csr import CsrAttributesConfiguration
2+
from puppeter.domain.model.installer import Mode
3+
from puppeter.persistence.gateway.csr import CsrAttributesConfigurer, CsrAttributesSetterGatewayImpl
4+
from puppeter import container
5+
6+
7+
def test_csr_on_server():
8+
# given
9+
config = CsrAttributesConfiguration()
10+
config.read_raw_options(dict(
11+
pp_role='appserver'
12+
))
13+
configurer = CsrAttributesConfigurer(config, Mode.Server)
14+
container.initialize()
15+
# when
16+
commands = configurer.produce_commands()
17+
18+
# then
19+
assert ' pp_role: appserver' in commands
20+
assert ' group => \'puppet\',' in commands
21+
22+
23+
def test_csr_on_agent():
24+
# given
25+
config = CsrAttributesConfiguration()
26+
config.read_raw_options(dict(
27+
pp_role='agent'
28+
))
29+
configurer = CsrAttributesConfigurer(config, Mode.Agent)
30+
container.initialize()
31+
32+
# when
33+
commands = configurer.produce_commands()
34+
35+
# then
36+
assert ' pp_role: agent' in commands
37+
38+
39+
def test_csr_gateway():
40+
# given
41+
gateway = CsrAttributesSetterGatewayImpl()
42+
config = CsrAttributesConfiguration()
43+
config.read_raw_options(dict(
44+
pp_datacenter='dc1'
45+
))
46+
mode = Mode.Server
47+
48+
# when
49+
configurers = gateway.save_csr_attributes(config, mode)
50+
51+
# then
52+
assert len(configurers) == 1
53+
op = getattr(configurers[0], "produce_commands", None)
54+
assert op is not None
55+
assert callable(op)

Diff for: tests/persistence/gateway/test_fgdn.py

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import pytest
2+
3+
from puppeter.domain.model.osfacts import Docker, OsFamily
4+
from puppeter.persistence.gateway.fqdn import FqdnSetterGatewayImpl
5+
6+
from puppeter.domain.model.fqdn import FqdnConfiguration
7+
from tests.domain.mock_facter import MockFacter
8+
from puppeter import container
9+
10+
11+
def test_fqdn_on_redhat():
12+
# given
13+
gateway = FqdnSetterGatewayImpl()
14+
config = FqdnConfiguration(fqdn='appserver.acme.internal')
15+
MockFacter.set_fact(Docker, Docker.NO)
16+
MockFacter.set_fact(OsFamily, OsFamily.RedHat)
17+
container.initialize()
18+
19+
# when
20+
configurers = gateway.process_fully_qualified_domain_name(config)
21+
22+
# then
23+
assert len(configurers) == 1
24+
25+
# when
26+
configurer = configurers[0]
27+
commands = configurer.produce_commands()
28+
29+
# then
30+
assert u" puppet resource host 'appserver.acme.internal' " \
31+
"ensure=present host_aliases='appserver' ip=127.0.0.1 " \
32+
"comment='FQDN'" in commands
33+
assert " hostname 'appserver'" in commands
34+
assert " changes => 'set HOSTNAME appserver'" in commands
35+
36+
37+
def test_fqdn_on_debian():
38+
# given
39+
gateway = FqdnSetterGatewayImpl()
40+
config = FqdnConfiguration(fqdn='appserver.acme.internal')
41+
MockFacter.set_fact(Docker, Docker.NO)
42+
MockFacter.set_fact(OsFamily, OsFamily.Debian)
43+
container.initialize()
44+
45+
# when
46+
configurers = gateway.process_fully_qualified_domain_name(config)
47+
48+
# then
49+
assert len(configurers) == 1
50+
51+
# when
52+
configurer = configurers[0]
53+
commands = configurer.produce_commands()
54+
55+
# then
56+
assert u" puppet resource host 'appserver.acme.internal' " \
57+
"ensure=present host_aliases='appserver' ip=127.0.0.1 " \
58+
"comment='FQDN'" in commands
59+
assert " hostname 'appserver'" in commands
60+
assert u" content => 'appserver'" in commands
61+
62+
63+
def test_fqdn_on_docker():
64+
# given
65+
gateway = FqdnSetterGatewayImpl()
66+
config = FqdnConfiguration(fqdn='appserver.acme.internal')
67+
MockFacter.set_fact(Docker, Docker.YES)
68+
container.initialize()
69+
70+
# when
71+
with pytest.raises(NotImplementedError) as excinfo:
72+
gateway.process_fully_qualified_domain_name(config)
73+
74+
# then
75+
assert "Can't set FQDN when running inside Docker!" in str(excinfo.value)

0 commit comments

Comments
 (0)