def test_ordering_jdk_svr_tc(self):
        configuration = Configuration(
            self.model, [self.jdk_0, self.server_0, self.tomcat_0])

        self.build(configuration)

        self.verify_script()
Example #2
0
    def test_substitution_in_component_files(self):
        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="memory",
                                  value_type=str,
                                  values=["1GB", "2GB"],
                                  realization=[
                                      Substitution(
                                          targets=["server/Dockerfile",
                                                   "server/server.cfg"],
                                          pattern="mem=XXX",
                                          replacements=["mem=1", "mem=2"])
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "2GB")])
            ])

        self.realize(configuration)

        self.assert_file_contains("config_1/images/server_0/Dockerfile", "mem=2")
        self.assert_file_contains("config_1/images/server_0/server.cfg", "mem=2")
    def test_raises_error_when_no_match_if_found_in_target(self):
        """
        See Issue #40
        """
        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="memory",
                                  value_type=str,
                                  values=["1GB", "2GB"],
                                  realization=[
                                      Substitution(
                                          targets=["docker-compose.yml"],
                                          pattern="pattern that does not exist",
                                          replacements=["mem=1", "mem=2"])
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "2GB")])
            ])

        with self.assertRaises(Exception):
            self.realize(configuration)
Example #4
0
    def test_when_a_component_is_implemented_by_a_docker_file(self):
        model = Model(
            [
                Component("server",
                          provided_services=[Service("Awesome")],
                          required_features=[Feature("JDK")],
                          implementation=DockerFile("server/Dockerfile")),
                Component("jdk",
                          provided_features=[Feature("JDK")],
                          implementation=DockerFile("jdk/Dockerfile"))

            ],
            Goals(services=[Service("Awesome")])
        )

        server_0 = Instance("server_0", model.resolve("server"))
        jdk_0 = Instance("jdk_0", model.resolve("jdk"))

        server_0.feature_provider = jdk_0
        configuration = Configuration(model, [server_0, jdk_0])

        self.build(configuration)

        self.assert_generated(
            "config_0/images/build_images.sh",
             with_patterns=[
                 "docker build -t camp-server_0 ./server",
                 "docker build -t camp-jdk_0 ./jdk_0"
                 ])
Example #5
0
    def test_when_a_component_host_is_implemented_by_a_docker_image(self):
        model = Model(
            [
                Component("server",
                          provided_services=[Service("Awesome")],
                          required_features=[Feature("JDK")],
                          implementation=DockerFile("server/Dockerfile")),
                Component("jdk",
                          provided_features=[Feature("JDK")],
                          implementation=DockerImage("fchauvel/test:1.0.1")),
            ],
            Goals(services=[Service("Awesome")])
        )

        server_0 = Instance("server_0", model.resolve("server"))
        jdk_0 = Instance("jdk_0", model.resolve("jdk"))
        server_0.feature_provider = jdk_0

        configuration = Configuration( model, [ server_0,
                                                jdk_0 ])
        self.build(configuration)

        self.assert_generated(
            "config_0/images/server_0/Dockerfile",
            with_patterns=[
                "FROM fchauvel/test:1.0.1"
            ])
Example #6
0
    def load_configuration_from(model, stream):
        data = load_yaml(stream)

        instances = [ YAML._create_instance(model, key, item) \
                      for key, item in data[Keys.INSTANCES].items() ]

        result = Configuration(model, instances)

        for each in instances:
            YAML._connect_instance(result, each, data[Keys.INSTANCES][each.name])

        return result
Example #7
0
    def _extract_from(self, z3_solution):
        instances = []
        for _, item in z3_solution.items():
            if "definition" in item:
                component = self._model.resolve(item["definition"])
                instances.append(Instance(item["name"], component))

        result = Configuration(self._model, instances)

        for _, item in z3_solution.items():
            if "definition" in item:
                instance = result.resolve(item["name"])
                if "use_feature" in item and item["use_feature"]:
                    provider = result.resolve(item["use_feature"])
                    instance.feature_provider = provider

                if "partners" in item:
                    providers = [result.resolve(z3_solution[each]["endpoint"]) \
                                 for each in item["partners"]]
                    instance.service_providers = providers
                if "configuration" in item:
                    configuration = []
                    for each_value in item["configuration"]:
                        variable_name = z3_solution[each_value]["variable"]
                        variable = None
                        for any_variable in instance.definition.variables:
                            if variable_name.endswith(any_variable.name):
                                variable = any_variable
                                break
                        else:
                            raise KeyError(
                                "Component '%s' has no variable named '%s'" %
                                (instance.definition.name, variable_name))
                        value = variable.value_at(
                            z3_solution[each_value]["value"])
                        configuration.append((variable, value))
                    instance.configuration = configuration
        return result
Example #8
0
    def test_when_a_component_is_implemented_by_a_docker_file(self):
        model = Model([
            Component("server",
                      provided_services=[Service("Awesome")],
                      implementation=DockerFile("server/Dockerfile"))
        ], Goals(services=[Service("Awesome")]))

        instance = Instance("server_0", model.resolve("server"))
        configuration = Configuration(model, [instance])

        self.build(configuration)

        self.assert_generated("config_0/images/server_0/Dockerfile",
                              with_patterns=["FROM openjdk:8-jre"])
Example #9
0
    def test_when_a_component_is_implemented_by_a_docker_image(self):

        model = Model([
            Component("server",
                      provided_services=[Service("Awesome")],
                      implementation=DockerImage("fchauvel/test:1.0.0"))
        ], Goals(services=[Service("Awesome")]))

        instance = Instance("server_0", model.resolve("server"))
        configuration = Configuration(model, [instance])

        self.build(configuration)

        self.assert_no_image_generated(0)
    def test_succeeds_in_inner_component_files(self):
        """
        See Issue #48
        """
        self.create_template_file(
            component="server",
            resource="src/config/settings.ini",
            content="parameter=XYZ")

        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="memory",
                                  value_type=str,
                                  values=["1GB", "2GB"],
                                  realization=[
                                      Substitution(
                                          targets=["server/src/config/settings.ini"],
                                          pattern="parameter=XYZ",
                                          replacements=["parameter=1GB",
                                                        "parameter=2GB"])
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "2GB")])
            ])

        self.realize(configuration)

        self.assert_file_contains(
            "config_1/images/server_0/src/config/settings.ini",
            "parameter=2GB")
    def test_substitution_with_pattern_longer_than_replacement(self):
        """
        See Issue 57
        """
        self.create_template_file(component="server",
                                  resource="config.ini",
                                  content=("value: This is a very very long pattern\n"
                                           "Here is the end\n"))

        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="config",
                                  value_type=str,
                                  values=["v1"],
                                  realization=[
                                      Substitution(
                                          targets=["server/config.ini"],
                                          pattern="value: This is a very very long pattern",
                                          replacements=["value: v1"])
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "v1")])
            ])

        self.realize(configuration)

        self.assert_file_contains_exactly(
            "config_1/images/server_0/config.ini",
            ("value: v1\n"
             "Here is the end\n"))
    def test_select_a_specifc_resource(self):
        self.create_template_file(component="server",
                                  resource="apache_config.ini")
        self.create_template_file(component="server",
                                  resource="nginx_config.ini")

        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="provider",
                                  value_type=str,
                                  values=["apache", "nginx"],
                                  realization=[
                                      ResourceSelection(
                                          "server/config.ini",
                                          [
                                              "server/apache_config.ini",
                                              "server/nginx_config.ini"
                                          ]
                                      )
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "nginx")])
            ])

        self.realize(configuration)

        self.assert_exists("config_1/images/server_0/config.ini")
        self.assert_does_not_exist("config_1/images/server_0/apache_config.ini")
    def test_substitute_pattern_that_contains_regex_sensitive_character(self):
        """
        See Issue #56
        """
        self.create_template_file(content="\"resolve\": \"^1.1.6\"")
        model = Model(
            components=[
                Component(name="server",
                          provided_services=[Service("Awesome")],
                          variables=[
                              Variable(
                                  name="memory",
                                  value_type=str,
                                  values=["1GB", "2GB"],
                                  realization=[
                                      Substitution(
                                          targets=["server/server.cfg"],
                                          pattern="\"resolve\": \"^1.1.6\"",
                                          replacements=["\"resolve\": 1",
                                                        "\"resolve\": 2"])
                                  ])
                          ],
                          implementation=DockerFile("server/Dockerfile"))
            ],
            goals=Goals(services=[Service("Awesome")]))

        server = model.resolve("server")
        configuration = Configuration(
            model,
            instances = [
                Instance(name="server_0",
                         definition=server,
                         configuration=[(server.variables[0], "2GB")])
            ])

        self.realize(configuration)

        self.assert_file_contains(
            "config_1/images/server_0/server.cfg",
            "\"resolve\": 2")