1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*-
* ============LICENSE_START=======================================================
* ONAP POLICY-CLAMP
* ================================================================================
* Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights
* reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END============================================
* ===================================================================
*
*/
package org.onap.policy.clamp.loop.components.external;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import javax.persistence.Transient;
import org.apache.camel.Exchange;
import org.onap.policy.clamp.loop.Loop;
import org.onap.policy.clamp.policy.pdpgroup.PdpGroupPayload;
/**
* This class represents the policy state according to all policies involved in the control loop.
* It can compute it with all policy queries result.
* It contains also the method to generate the PDP payload used for the policies deployment.
*/
public class PolicyComponent extends ExternalComponent {
@Transient
private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyComponent.class);
public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR",
"There was an error during the sending to policy, the policy engine may be corrupted or inconsistent", 100);
public static final ExternalComponentState NOT_SENT = new ExternalComponentState("NOT_SENT",
"The policies defined have NOT yet been created on the policy engine", 90);
public static final ExternalComponentState SENT = new ExternalComponentState("SENT",
"The policies defined have been created but NOT deployed on the policy engine", 50);
public static final ExternalComponentState SENT_AND_DEPLOYED = new ExternalComponentState("SENT_AND_DEPLOYED",
"The policies defined have been created and deployed on the policy engine", 10);
public static final ExternalComponentState UNKNOWN = new ExternalComponentState("UNKNOWN",
"The current status is not clear. Need to refresh the status to get the current status.", 0);
/**
* Default constructor.
*/
public PolicyComponent() {
/*
* We assume it's good by default as we will receive the state for each policy
* on by one, each time we increase the level we can't decrease it anymore.
* That's why it starts with the lowest one SENT_AND_DEPLOYED.
*/
super(UNKNOWN);
}
@Override
public String getComponentName() {
return "POLICY";
}
/**
* Generates the Json that must be sent to policy to add all policies to Active
* PDP group.
*
* @param loop the loop object
* @param action POST (to add policy to group) or DELETE (to delete policy from group)
* @return The json, payload to send
*/
public static String createPoliciesPayloadPdpGroup(Loop loop, String action) {
PdpGroupPayload pdpGroupPayload = new PdpGroupPayload();
loop.getOperationalPolicies().stream().forEach(opPolicy -> pdpGroupPayload
.updatePdpGroupMap(opPolicy.getPdpGroup(), opPolicy.getPdpSubgroup(), opPolicy.getName(), "1.0.0",
action));
loop.getMicroServicePolicies().stream().forEach(msPolicy -> pdpGroupPayload
.updatePdpGroupMap(msPolicy.getPdpGroup(), msPolicy.getPdpSubgroup(), msPolicy.getName(), "1.0.0",
action));
return pdpGroupPayload.generatePdpGroupPayload();
}
private static ExternalComponentState findNewState(boolean found, boolean deployed) {
ExternalComponentState newState = NOT_SENT;
if (found && deployed) {
newState = SENT_AND_DEPLOYED;
} else {
if (found) {
newState = SENT;
} else {
if (deployed) {
newState = IN_ERROR;
}
}
}
return newState;
}
private static ExternalComponentState mergeStates(ExternalComponentState oldState,
ExternalComponentState newState) {
return (oldState.compareTo(newState) < 0) ? newState : oldState;
}
/**
* This is a method that expect the results of the queries getPolicy and
* getPolicyDeployed for a unique policy (op, config, etc ...). It
* re-computes the global policy state for each policy results given. Therefore
* this method is called multiple times from the camel route and must be reset
* for a new global policy state retrieval. The state to compute the global
* policy state is stored in this class.
*/
@Override
public ExternalComponentState computeState(Exchange camelExchange) {
this.setState(mergeStates(this.getState(),
findNewState((boolean) camelExchange.getIn().getExchange().getProperty("policyFound"),
(boolean) camelExchange.getIn().getExchange().getProperty("policyDeployed"))));
return this.getState();
}
}
|