Skip to content

Commit 1ca0766

Browse files
authored
Merge pull request #1038 from oracle/owls_73463
Recognize v2.0 external channel services
2 parents 0fb1033 + 0ab2c57 commit 1ca0766

File tree

9 files changed

+122
-37
lines changed

9 files changed

+122
-37
lines changed

operator/src/main/java/oracle/kubernetes/operator/helpers/AnnotationHelper.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import io.kubernetes.client.models.V1Pod;
99
import io.kubernetes.client.models.V1Service;
1010
import io.kubernetes.client.util.Yaml;
11+
import java.util.Map;
12+
import java.util.Optional;
1113
import java.util.function.Function;
1214
import org.apache.commons.codec.digest.DigestUtils;
1315

@@ -58,15 +60,31 @@ private static V1Service addHash(V1Service service) {
5860
return service;
5961
}
6062

63+
static String getHash(V1Pod pod) {
64+
return getAnnotation(pod.getMetadata(), AnnotationHelper::getSha256Annotation);
65+
}
66+
67+
static String getHash(V1Service service) {
68+
return getAnnotation(service.getMetadata(), AnnotationHelper::getSha256Annotation);
69+
}
70+
6171
static String getDebugString(V1Pod pod) {
62-
return pod.getMetadata().getAnnotations().get(HASHED_STRING);
72+
return getAnnotation(pod.getMetadata(), AnnotationHelper::getDebugHashAnnotation);
6373
}
6474

65-
static String getHash(V1Pod pod) {
66-
return pod.getMetadata().getAnnotations().get(SHA256_ANNOTATION);
75+
private static String getAnnotation(
76+
V1ObjectMeta metadata, Function<Map<String, String>, String> annotationGetter) {
77+
return Optional.ofNullable(metadata)
78+
.map(V1ObjectMeta::getAnnotations)
79+
.map(annotationGetter)
80+
.orElse("");
6781
}
6882

69-
static String getHash(V1Service service) {
70-
return service.getMetadata().getAnnotations().get(SHA256_ANNOTATION);
83+
private static String getDebugHashAnnotation(Map<String, String> annotations) {
84+
return annotations.get(HASHED_STRING);
85+
}
86+
87+
private static String getSha256Annotation(Map<String, String> annotations) {
88+
return annotations.get(SHA256_ANNOTATION);
7189
}
7290
}

operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ private V1ObjectMeta getMetadata(V1Service service) {
290290
return service == null ? null : service.getMetadata();
291291
}
292292

293-
V1Service getExternalService(String serverName) {
293+
public V1Service getExternalService(String serverName) {
294294
return getSko(serverName).getExternalService().get();
295295
}
296296

operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static String toJobIntrospectorName(String domainUID) {
3636
return toDNS1123LegalName(String.format(DOMAIN_INTROSPECTOR_JOB_PATTERN, domainUID));
3737
}
3838

39-
static String toExternalServiceName(String domainUID, String serverName) {
39+
public static String toExternalServiceName(String domainUID, String serverName) {
4040
return toDNS1123LegalName(String.format(EXTERNAL_SERVICE_PATTERN, domainUID, serverName));
4141
}
4242

operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesServiceType.java renamed to operator/src/main/java/oracle/kubernetes/operator/helpers/OperatorServiceType.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import io.kubernetes.client.models.V1Service;
88
import java.util.Optional;
99

10-
public enum KubernetesServiceType {
10+
/** Describes the service types supported by the operator. */
11+
public enum OperatorServiceType {
1112
SERVER {
1213
@Override
1314
void addToPresence(DomainPresenceInfo presenceInfo, V1Service service) {
@@ -21,7 +22,7 @@ void updateFromEvent(DomainPresenceInfo presenceInfo, V1Service event) {
2122

2223
@Override
2324
boolean matches(V1Service service) {
24-
return ServiceHelper.getServerName(service) != null;
25+
return ServiceHelper.getServerName(service) != null && !ServiceHelper.isNodePortType(service);
2526
}
2627

2728
@Override
@@ -35,6 +36,11 @@ V1Service[] getServices(DomainPresenceInfo presenceInfo) {
3536
}
3637
},
3738
EXTERNAL {
39+
@Override
40+
boolean matches(V1Service service) {
41+
return ServiceHelper.getServerName(service) != null && ServiceHelper.isNodePortType(service);
42+
}
43+
3844
@Override
3945
void addToPresence(DomainPresenceInfo presenceInfo, V1Service service) {
4046
presenceInfo.setExternalService(ServiceHelper.getServerName(service), service);
@@ -80,12 +86,12 @@ boolean matches(V1Service service) {
8086

8187
private static final String SERVICE_TYPE = "serviceType";
8288

83-
static KubernetesServiceType getType(V1Service service) {
84-
if (!KubernetesUtils.isOperatorCreated(service.getMetadata())) return EXTERNAL;
89+
static OperatorServiceType getType(V1Service service) {
90+
if (!KubernetesUtils.isOperatorCreated(service.getMetadata())) return UNKNOWN;
8591
String type = ServiceHelper.getLabelValue(service, SERVICE_TYPE);
86-
if (type != null) return KubernetesServiceType.valueOf(type);
92+
if (type != null) return OperatorServiceType.valueOf(type);
8793

88-
for (KubernetesServiceType serviceType : KubernetesServiceType.values())
94+
for (OperatorServiceType serviceType : OperatorServiceType.values())
8995
if (serviceType.matches(service)) return serviceType;
9096

9197
return UNKNOWN;

operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
import org.apache.commons.lang3.builder.EqualsBuilder;
5454

5555
public class ServiceHelper {
56+
public static final String CLUSTER_IP_TYPE = "ClusterIP";
57+
public static final String NODE_PORT_TYPE = "NodePort";
5658
private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
5759

5860
private ServiceHelper() {}
@@ -72,23 +74,23 @@ static V1Service createServerServiceModel(Packet packet) {
7274
}
7375

7476
public static void addToPresence(DomainPresenceInfo info, V1Service service) {
75-
KubernetesServiceType.getType(service).addToPresence(info, service);
77+
OperatorServiceType.getType(service).addToPresence(info, service);
7678
}
7779

7880
public static void updatePresenceFromEvent(DomainPresenceInfo info, V1Service service) {
79-
KubernetesServiceType.getType(service).updateFromEvent(info, service);
81+
OperatorServiceType.getType(service).updateFromEvent(info, service);
8082
}
8183

8284
public static V1Service[] getServerServices(DomainPresenceInfo info) {
83-
return KubernetesServiceType.SERVER.getServices(info);
85+
return OperatorServiceType.SERVER.getServices(info);
8486
}
8587

8688
public static boolean isServerService(V1Service service) {
87-
return KubernetesServiceType.getType(service) == KubernetesServiceType.SERVER;
89+
return OperatorServiceType.getType(service) == OperatorServiceType.SERVER;
8890
}
8991

9092
public static boolean deleteFromEvent(DomainPresenceInfo info, V1Service service) {
91-
return KubernetesServiceType.getType(service).deleteFromEvent(info, service);
93+
return OperatorServiceType.getType(service).deleteFromEvent(info, service);
9294
}
9395

9496
public static String getServiceDomainUID(V1Service service) {
@@ -114,6 +116,14 @@ public static String getClusterName(V1Service service) {
114116
return getLabelValue(service, LabelConstants.CLUSTERNAME_LABEL);
115117
}
116118

119+
static boolean isNodePortType(V1Service service) {
120+
return NODE_PORT_TYPE.equals(getSpecType(service));
121+
}
122+
123+
private static String getSpecType(V1Service service) {
124+
return Optional.ofNullable(service.getSpec()).map(V1ServiceSpec::getType).orElse("");
125+
}
126+
117127
private static class ForServerStep extends ServiceHelperStep {
118128
ForServerStep(Step next) {
119129
super(next);
@@ -149,7 +159,7 @@ private static class ServerServiceStepContext extends ServiceStepContext {
149159
final WlsServerConfig scan;
150160

151161
ServerServiceStepContext(Step conflictStep, Packet packet) {
152-
super(conflictStep, packet, KubernetesServiceType.SERVER);
162+
super(conflictStep, packet, OperatorServiceType.SERVER);
153163
serverName = (String) packet.get(ProcessingConstants.SERVER_NAME);
154164
clusterName = (String) packet.get(ProcessingConstants.CLUSTER_NAME);
155165
scan = (WlsServerConfig) packet.get(ProcessingConstants.SERVER_SCAN);
@@ -252,7 +262,7 @@ void addServicePortIfNeeded(String portName, Integer port) {
252262

253263
@Override
254264
protected String getSpecType() {
255-
return "ClusterIP";
265+
return CLUSTER_IP_TYPE;
256266
}
257267

258268
@Override
@@ -281,9 +291,9 @@ private abstract static class ServiceStepContext {
281291
protected List<V1ServicePort> ports;
282292
DomainPresenceInfo info;
283293
WlsDomainConfig domainTopology;
284-
private KubernetesServiceType serviceType;
294+
private OperatorServiceType serviceType;
285295

286-
ServiceStepContext(Step conflictStep, Packet packet, KubernetesServiceType serviceType) {
296+
ServiceStepContext(Step conflictStep, Packet packet, OperatorServiceType serviceType) {
287297
this.conflictStep = conflictStep;
288298
info = packet.getSPI(DomainPresenceInfo.class);
289299
domainTopology = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
@@ -591,7 +601,7 @@ private static class ClusterStepContext extends ServiceStepContext {
591601
private final WlsDomainConfig config;
592602

593603
ClusterStepContext(Step conflictStep, Packet packet) {
594-
super(conflictStep, packet, KubernetesServiceType.CLUSTER);
604+
super(conflictStep, packet, OperatorServiceType.CLUSTER);
595605
clusterName = (String) packet.get(ProcessingConstants.CLUSTER_NAME);
596606
config = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
597607
}
@@ -624,7 +634,7 @@ void addServicePortIfNeeded(String portName, Integer port) {
624634

625635
@Override
626636
protected String getSpecType() {
627-
return "ClusterIP";
637+
return CLUSTER_IP_TYPE;
628638
}
629639

630640
protected V1ObjectMeta createMetadata() {
@@ -719,7 +729,7 @@ private static class ExternalServiceStepContext extends ServiceStepContext {
719729
private final String adminServerName;
720730

721731
ExternalServiceStepContext(Step conflictStep, Packet packet) {
722-
super(conflictStep, packet, KubernetesServiceType.EXTERNAL);
732+
super(conflictStep, packet, OperatorServiceType.EXTERNAL);
723733
adminServerName = (String) packet.get(ProcessingConstants.SERVER_NAME);
724734
}
725735

@@ -741,7 +751,7 @@ protected String createServiceName() {
741751

742752
@Override
743753
protected String getSpecType() {
744-
return "NodePort";
754+
return NODE_PORT_TYPE;
745755
}
746756

747757
@Override

operator/src/test/java/oracle/kubernetes/operator/DomainPresenceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
import oracle.kubernetes.TestUtils;
3434
import oracle.kubernetes.operator.builders.StubWatchFactory;
3535
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
36-
import oracle.kubernetes.operator.helpers.KubernetesServiceType;
3736
import oracle.kubernetes.operator.helpers.KubernetesTestSupport;
3837
import oracle.kubernetes.operator.helpers.LegalNames;
38+
import oracle.kubernetes.operator.helpers.OperatorServiceType;
3939
import oracle.kubernetes.operator.work.ThreadFactorySingleton;
4040
import oracle.kubernetes.weblogic.domain.model.Domain;
4141
import oracle.kubernetes.weblogic.domain.model.DomainSpec;
@@ -142,7 +142,7 @@ private V1Service createServerService(String uid, String namespace, String serve
142142
createNamespacedMetadata(uid, namespace)
143143
.name(LegalNames.toServerServiceName(uid, serverName))
144144
.putLabelsItem(SERVERNAME_LABEL, serverName);
145-
return KubernetesServiceType.SERVER.withTypeLabel(new V1Service().metadata(metadata));
145+
return OperatorServiceType.SERVER.withTypeLabel(new V1Service().metadata(metadata));
146146
}
147147

148148
private V1ObjectMeta createServerMetadata(String uid, String namespace, String serverName) {

operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.kubernetes.client.models.V1Pod;
2323
import io.kubernetes.client.models.V1PodSpec;
2424
import io.kubernetes.client.models.V1Service;
25+
import io.kubernetes.client.models.V1ServicePort;
2526
import io.kubernetes.client.models.V1ServiceSpec;
2627
import java.util.ArrayList;
2728
import java.util.Arrays;
@@ -161,7 +162,40 @@ private V1Service createNonOperatorService() {
161162
.putLabelsItem(DOMAINUID_LABEL, DomainProcessorTestSetup.UID)
162163
.putLabelsItem(RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION)
163164
.putLabelsItem(SERVERNAME_LABEL, ADMIN_NAME))
164-
.spec(new V1ServiceSpec().type("ClusterIP"));
165+
.spec(new V1ServiceSpec().type(ServiceHelper.CLUSTER_IP_TYPE));
166+
}
167+
168+
@Test
169+
public void onUpgradeFromV20_updateExternalService() {
170+
domainConfigurator.configureAdminServer().configureAdminService().withChannel("name", 30701);
171+
testSupport.defineResources(createV20ExternalService());
172+
domainConfigurator.configureCluster(CLUSTER).withReplicas(MAX_SERVERS);
173+
174+
DomainPresenceInfo info = new DomainPresenceInfo(domain);
175+
processor.makeRightDomainPresence(info, true, false, false);
176+
177+
assertThat(info.getExternalService(ADMIN_NAME), notNullValue());
178+
}
179+
180+
// todo after external service created, if adminService deleted, delete service
181+
182+
// problem - ServiceType doesn't know what this is, so does not
183+
// add it to DomainPresenceInfo, so does not delete it!
184+
private V1Service createV20ExternalService() {
185+
return new V1Service()
186+
.metadata(
187+
new V1ObjectMeta()
188+
.name(LegalNames.toExternalServiceName(DomainProcessorTestSetup.UID, ADMIN_NAME))
189+
.namespace(DomainProcessorTestSetup.NS)
190+
.putLabelsItem(CREATEDBYOPERATOR_LABEL, "true")
191+
.putLabelsItem(DOMAINNAME_LABEL, DomainProcessorTestSetup.UID)
192+
.putLabelsItem(DOMAINUID_LABEL, DomainProcessorTestSetup.UID)
193+
.putLabelsItem(RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION)
194+
.putLabelsItem(SERVERNAME_LABEL, ADMIN_NAME))
195+
.spec(
196+
new V1ServiceSpec()
197+
.type(ServiceHelper.NODE_PORT_TYPE)
198+
.addPortsItem(new V1ServicePort().nodePort(30701)));
165199
}
166200

167201
private Stream<V1Service> getServerServices() {

operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ private String getServiceType(V1Service service) {
206206
public void whenCreated_modelKubernetesTypeIsCorrect() {
207207
V1Service model = testFacade.createServiceModel(testSupport.getPacket());
208208

209-
assertThat(KubernetesServiceType.getType(model), equalTo(testFacade.getType()));
209+
assertThat(OperatorServiceType.getType(model), equalTo(testFacade.getType()));
210210
}
211211

212212
@Test
@@ -458,7 +458,7 @@ abstract static class TestFacade {
458458
private Map<String, Integer> expectedNapPorts = new HashMap<>();
459459
private Map<String, Integer> expectedNodePorts = new HashMap<>();
460460

461-
abstract KubernetesServiceType getType();
461+
abstract OperatorServiceType getType();
462462

463463
abstract String getServiceCreateLogMessage();
464464

@@ -515,8 +515,8 @@ static class ClusterServiceTestFacade extends TestFacade {
515515
}
516516

517517
@Override
518-
KubernetesServiceType getType() {
519-
return KubernetesServiceType.CLUSTER;
518+
OperatorServiceType getType() {
519+
return OperatorServiceType.CLUSTER;
520520
}
521521

522522
@Override
@@ -593,8 +593,8 @@ String getExpectedSelectorValue() {
593593
abstract static class ServerTestFacade extends TestFacade {
594594

595595
@Override
596-
KubernetesServiceType getType() {
597-
return KubernetesServiceType.SERVER;
596+
OperatorServiceType getType() {
597+
return OperatorServiceType.SERVER;
598598
}
599599

600600
@Override
@@ -700,8 +700,8 @@ static class ExternalServiceTestFacade extends TestFacade {
700700
}
701701

702702
@Override
703-
KubernetesServiceType getType() {
704-
return KubernetesServiceType.EXTERNAL;
703+
OperatorServiceType getType() {
704+
return OperatorServiceType.EXTERNAL;
705705
}
706706

707707
@Override

operator/src/test/java/oracle/kubernetes/operator/helpers/ServicePresenceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.meterware.simplestub.StaticStubSupport;
2424
import io.kubernetes.client.models.V1ObjectMeta;
2525
import io.kubernetes.client.models.V1Service;
26+
import io.kubernetes.client.models.V1ServiceSpec;
2627
import io.kubernetes.client.util.Watch;
2728
import java.util.ArrayList;
2829
import java.util.HashMap;
@@ -501,6 +502,22 @@ public void onDeleteEventWithNewerExternalService_removeIt() {
501502
assertThat(info.getExternalService(SERVER), nullValue());
502503
}
503504

505+
@Test
506+
public void whenEventContainsServiceWithNodePortAndNoTypeLabel_addAsExternalService() {
507+
V1Service service =
508+
new V1Service()
509+
.metadata(
510+
createMetadata()
511+
.putLabelsItem(CREATEDBYOPERATOR_LABEL, "true")
512+
.putLabelsItem(SERVERNAME_LABEL, SERVER))
513+
.spec(new V1ServiceSpec().type(ServiceHelper.NODE_PORT_TYPE));
514+
Watch.Response<V1Service> event = WatchEvent.createAddedEvent(service).toWatchResponse();
515+
516+
processor.dispatchServiceWatch(event);
517+
518+
assertThat(info.getExternalService(SERVER), sameInstance(service));
519+
}
520+
504521
private V1Service createClusterService() {
505522
return withTimeAndVersion(ServiceHelper.createClusterServiceModel(packet));
506523
}

0 commit comments

Comments
 (0)