Passed
Push — master ( 16ccd1...8623b8 )
by Filip
02:49
created

getServicesIds(String)   A

Complexity

Conditions 1

Size

Total Lines 4
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
1
package com.hltech.judged.server.domain;
2
3
import com.google.common.base.Joiner;
4
import com.google.common.collect.HashMultimap;
5
import com.google.common.collect.ImmutableSet;
6
import com.google.common.collect.Maps;
7
import com.google.common.collect.Multimap;
8
import com.hltech.judged.server.domain.environment.Environment;
9
import com.hltech.judged.server.domain.environment.EnvironmentRepository;
10
import com.hltech.judged.server.domain.contracts.ServiceContracts;
11
import com.hltech.judged.server.domain.contracts.ServiceContractsRepository;
12
import com.hltech.judged.server.domain.environment.Space;
13
import com.hltech.judged.server.domain.validation.EnvironmentValidatorResult;
14
import com.hltech.judged.server.domain.validation.InterfaceContractValidator;
15
import com.hltech.judged.server.interfaces.rest.RequestValidationException;
16
import com.hltech.judged.server.interfaces.rest.ResourceNotFoundException;
17
import lombok.RequiredArgsConstructor;
18
import lombok.extern.slf4j.Slf4j;
19
20
import java.util.Collection;
21
import java.util.HashSet;
22
import java.util.List;
23
import java.util.Map;
24
import java.util.Optional;
25
import java.util.Set;
26
27
import static com.google.common.base.MoreObjects.firstNonNull;
28
import static com.hltech.judged.server.domain.environment.Environment.DEFAULT_NAMESPACE;
29
import static com.hltech.judged.server.domain.validation.EnvironmentValidatorResult.getValidatorResult;
30
import static java.util.stream.Collectors.toList;
31
32
@Slf4j
33
@RequiredArgsConstructor
34
public class JudgeDApplicationService {
35
36
    private final EnvironmentRepository environmentRepository;
37
    private final ServiceContractsRepository serviceContractsRepository;
38
    private final List<InterfaceContractValidator<?, ?>> validators;
39
40
    public void overwriteEnvironment(String environmentName, String agentSpace, Set<ServiceId> serviceIds) {
41
        String space = firstNonNull(agentSpace, DEFAULT_NAMESPACE);
42
43
        Environment environment = environmentRepository.find(environmentName)
44
            .orElse(new Environment(environmentName, new HashSet<>()));
45
46
        Set<String> supportedSpaces = ImmutableSet.<String>builder()
47
            .addAll(environment.getSpaceNames())
48
            .add(space)
49
            .build();
50
51
        Set<Space> spaces = new HashSet<>();
52
        for (String spaceName : supportedSpaces) {
53
            if (space.equals(spaceName)) {
54
                spaces.add(new Space(spaceName, serviceIds));
55
            } else {
56
                spaces.add(new Space(spaceName, environment.getServices(spaceName)));
57
            }
58
        }
59
60
        environmentRepository.persist(new Environment(environmentName, spaces));
61
    }
62
63
    public Collection<EnvironmentValidatorResult> validateServiceAgainstEnvironments(
64
        ServiceId serviceId,
65
        List<String> environments) {
66
67
        ServiceContracts validatedServiceContracts = this.serviceContractsRepository.findOne(serviceId)
68
            .orElseThrow(ResourceNotFoundException::new);
69
70
71
72
        return this.validators.stream()
73
            .map(validator ->
74
                validateServiceAgainstEnvironments(
75
                    validatedServiceContracts,
76
                    environments,
77
                    validator
78
                ))
79
            .collect(toList());
80
    }
81
82
    public Multimap<ServiceId, EnvironmentValidatorResult> validatedServicesAgainstEnvironment(
83
        List<ServiceId> serviceIds,
84
        String environment) {
85
86
        List<ServiceContracts> validatedServiceContracts = serviceIds.stream()
87
            .map(serviceContractsRepository::findOne)
88
            .map(o -> o.orElseThrow(RequestValidationException::new))
89
            .collect(toList());
90
91
        Multimap<ServiceId, EnvironmentValidatorResult> validationResults = HashMultimap.create();
92
        this.validators
93
            .forEach(validator ->
94
                validatedServicesAgainstEnvironment(
95
                    validatedServiceContracts,
96
                    environment,
97
                    validator
98
                )
99
                    .forEach(validationResults::put)
100
            );
101
102
        return validationResults;
103
    }
104
105
    private <C, E> EnvironmentValidatorResult validateServiceAgainstEnvironments(
106
        ServiceContracts contractsToValidate,
107
        List<String> environments,
108
        InterfaceContractValidator<C, E> validator
109
    ) {
110
        List<ServiceContracts> environmentContracts = environments.stream()
111
            .flatMap(envName -> getServicesIds(envName).stream())
112
            .map(this.serviceContractsRepository::findOne)
113
            .filter(Optional::isPresent)
114
            .map(Optional::get)
115
            .collect(toList());
116
117
        return getValidatorResult(contractsToValidate, environmentContracts, validator);
118
    }
119
120
    private <C, E> Map<ServiceId, EnvironmentValidatorResult> validatedServicesAgainstEnvironment(
121
        List<ServiceContracts> contractToValidate,
122
        String env,
123
        InterfaceContractValidator<C, E> validator
124
    ){
125
        // find contracts on given env
126
        List<ServiceContracts> environmentContracts = getServicesIds(env).stream()
127
            .map(service -> this.serviceContractsRepository.findOne(new ServiceId(service.getName(), service.getVersion())))
128
            .filter(Optional::isPresent)
129
            .map(Optional::get)
130
            .collect(toList());
131
132
        log.info("checking how " +
133
            "["+ Joiner.on(", ").join(contractToValidate.stream().map(sc -> sc.getId().toString()).collect(toList()))+"] will impact the env " +
134
            "["+ Joiner.on(", ").join(environmentContracts.stream().map(sc -> sc.getId().toString()).collect(toList()))+"]");
135
136
        // replace environment contracts with validated ones
137
        contractToValidate.forEach(validatedContract -> {
138
            environmentContracts.removeIf(serviceContracts -> serviceContracts.getName().equals(validatedContract.getId().getName()));
139
            environmentContracts.add(validatedContract);
140
        });
141
142
        log.info("after the deployment env will contain: ["+Joiner.on(", ").join(environmentContracts.stream().map(sc -> sc.getId().toString()).collect(toList()))+"]");
143
144
        Map<ServiceId, EnvironmentValidatorResult> hashMap = Maps.newHashMap();
145
        for (ServiceContracts sc : contractToValidate) {
146
            hashMap.put(sc.getId(), getValidatorResult(sc, environmentContracts, validator));
147
        }
148
        return hashMap;
149
    }
150
151
    private Set<ServiceId> getServicesIds(String environmentName) {
152
        return this.environmentRepository.find(environmentName)
153
            .map(Environment::getAllServices)
154
            .orElse(new HashSet<>());
155
    }
156
}
157