12
12
import java .util .Collection ;
13
13
import java .util .Collections ;
14
14
import java .util .HashSet ;
15
+ import java .util .List ;
15
16
import java .util .Map ;
16
17
import java .util .Optional ;
17
18
import java .util .Properties ;
@@ -208,11 +209,12 @@ private static void begin() {
208
209
209
210
Step strategy = Step .chain (
210
211
new InitializeNamespacesSecurityStep (targetNamespaces ),
211
- new NamespaceRulesReviewStep (),
212
- CrdHelper .createDomainCrdStep (version ,
213
- new StartNamespacesStep (targetNamespaces , false )));
212
+ new NamespaceRulesReviewStep ());
214
213
if (!isDedicated ()) {
215
- strategy = Step .chain (strategy , readExistingNamespaces ());
214
+ strategy = Step .chain (strategy , readExistingNamespaces (targetNamespaces ));
215
+ } else {
216
+ strategy = Step .chain (strategy , CrdHelper .createDomainCrdStep (version ,
217
+ new StartNamespacesStep (targetNamespaces , false )));
216
218
}
217
219
runSteps (
218
220
strategy ,
@@ -360,8 +362,8 @@ private static Step readExistingPods(String ns) {
360
362
.listPodAsync (ns , new PodListStep (ns ));
361
363
}
362
364
363
- private static Step readExistingNamespaces () {
364
- return new CallBuilder ().listNamespaceAsync (new NamespaceListStep ());
365
+ private static Step readExistingNamespaces (Collection < String > targetNamespaces ) {
366
+ return new CallBuilder ().listNamespaceAsync (new NamespaceListStep (targetNamespaces ));
365
367
}
366
368
367
369
private static ConfigMapAfterStep createConfigMapStep (String ns ) {
@@ -865,6 +867,12 @@ private String getInitialResourceVersion(V1PodList result) {
865
867
}
866
868
867
869
private static class NamespaceListStep extends ResponseStep <V1NamespaceList > {
870
+ private final Collection <String > targetNamespaces ;
871
+
872
+ NamespaceListStep (Collection <String > targetNamespaces ) {
873
+ this .targetNamespaces = targetNamespaces ;
874
+ }
875
+
868
876
@ Override
869
877
public NextAction onFailure (Packet packet , CallResponse <V1NamespaceList > callResponse ) {
870
878
return callResponse .getStatusCode () == CallBuilder .NOT_FOUND
@@ -875,23 +883,69 @@ public NextAction onFailure(Packet packet, CallResponse<V1NamespaceList> callRes
875
883
@ Override
876
884
protected NextAction onFailureNoRetry (Packet packet , CallResponse <V1NamespaceList > callResponse ) {
877
885
return isNotAuthorizedOrForbidden (callResponse )
878
- ? doNext (packet ) : super .onFailureNoRetry (packet , callResponse );
886
+ ? doNext (createDomainCrdAndStartNamespaces (targetNamespaces ), packet ) :
887
+ super .onFailureNoRetry (packet , callResponse );
879
888
}
880
889
881
890
@ Override
882
891
public NextAction onSuccess (Packet packet , CallResponse <V1NamespaceList > callResponse ) {
883
892
V1NamespaceList result = callResponse .getResult ();
884
893
// don't bother processing pre-existing events
894
+ String intialResourceVersion = getInitialResourceVersion (result );
895
+ List <String > nsList = getExistingNamespaces (result );
885
896
886
- if (namespaceWatcher == null ) {
887
- namespaceWatcher = createNamespaceWatcher (getInitialResourceVersion (result ));
897
+ Set <String > namespacesToStart = new TreeSet <>(targetNamespaces );
898
+ for (String ns : targetNamespaces ) {
899
+ if (!nsList .contains (ns )) {
900
+ LOGGER .warning (MessageKeys .NAMESPACE_IS_MISSING , ns );
901
+ namespacesToStart .remove (ns );
902
+ }
888
903
}
889
- return doNext (packet );
904
+ Step strategy = null ;
905
+ if (!namespacesToStart .isEmpty ()) {
906
+ strategy = Step .chain (createDomainCrdAndStartNamespaces (namespacesToStart ),
907
+ new CreateNamespaceWatcherStep (intialResourceVersion ));
908
+ } else {
909
+ strategy = CrdHelper .createDomainCrdStep (version ,
910
+ new CreateNamespaceWatcherStep (intialResourceVersion ));
911
+ }
912
+ return doNext (strategy , packet );
913
+ }
914
+
915
+ private Step createDomainCrdAndStartNamespaces (Collection <String > namespacesToStart ) {
916
+ return CrdHelper .createDomainCrdStep (version ,
917
+ new StartNamespacesStep (namespacesToStart , false ));
890
918
}
891
919
892
920
private String getInitialResourceVersion (V1NamespaceList result ) {
893
921
return result != null ? result .getMetadata ().getResourceVersion () : "" ;
894
922
}
923
+
924
+ private List <String > getExistingNamespaces (V1NamespaceList result ) {
925
+ List <String > namespaces = new ArrayList <>();
926
+ if (result != null ) {
927
+ for (V1Namespace ns :result .getItems ()) {
928
+ namespaces .add (ns .getMetadata ().getName ());
929
+ }
930
+ }
931
+ return namespaces ;
932
+ }
933
+ }
934
+
935
+ private static class CreateNamespaceWatcherStep extends Step {
936
+ private final String initialResourceVersion ;
937
+
938
+ CreateNamespaceWatcherStep (String initialResourceVersion ) {
939
+ this .initialResourceVersion = initialResourceVersion ;
940
+ }
941
+
942
+ @ Override
943
+ public NextAction apply (Packet packet ) {
944
+ if (namespaceWatcher == null ) {
945
+ namespaceWatcher = createNamespaceWatcher (initialResourceVersion );
946
+ }
947
+ return doNext (packet );
948
+ }
895
949
}
896
950
897
951
private static class NullCompletionCallback implements CompletionCallback {
0 commit comments