77import java .nio .file .Path ;
88import java .util .*;
99import java .util .function .Predicate ;
10+ import java .util .stream .Collectors ;
1011
1112import org .jboss .logging .Logger ;
1213
14+ import io .fabric8 .kubernetes .api .model .GroupVersionKind ;
1315import io .fabric8 .kubernetes .api .model .ServiceAccount ;
1416import io .fabric8 .kubernetes .api .model .apps .Deployment ;
1517import io .fabric8 .kubernetes .api .model .rbac .*;
@@ -31,12 +33,10 @@ public class CsvManifestsBuilder extends ManifestsBuilder {
3133 private static final String ROLE_KIND = "Role" ;
3234 private static final String NO_SERVICE_ACCOUNT = "" ;
3335 private static final Logger LOGGER = Logger .getLogger (CsvManifestsBuilder .class .getName ());
34-
3536 private static final String IMAGE_PNG = "image/png" ;
36-
3737 private ClusterServiceVersionBuilder csvBuilder ;
38- private final SortedSet < String > ownedCRs = new TreeSet <>();
39- private final SortedSet < String > requiredCRs = new TreeSet <>();
38+ private final Set < CRDDescription > ownedCRs = new HashSet <>();
39+ private final Set < CRDDescription > requiredCRs = new HashSet <>();
4040 private final Path kubernetesResources ;
4141
4242 public CsvManifestsBuilder (CSVMetadataHolder metadata , List <ReconcilerAugmentedClassInfo > controllers ,
@@ -137,62 +137,81 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, List<ReconcilerAugmentedC
137137 }
138138
139139 // add owned and required CRD, also collect them
140- final var crdsBuilder = csvSpecBuilder . editOrNewCustomresourcedefinitions ();
140+ final var nativeApis = new ArrayList < GroupVersionKind > ();
141141 controllers .forEach (raci -> {
142142 // add owned CRD
143143 final var resourceInfo = raci .associatedResourceInfo ();
144144 if (resourceInfo .isCR ()) {
145145 final var asResource = resourceInfo .asResourceTargeting ();
146146 final var fullResourceName = asResource .fullResourceName ();
147- ownedCRs .add (fullResourceName );
148- crdsBuilder
149- .addNewOwned ()
147+ ownedCRs .add (new CRDDescriptionBuilder ()
150148 .withName (fullResourceName )
151149 .withVersion (asResource .version ())
152150 .withKind (asResource .kind ())
153- .endOwned ( );
151+ .build () );
154152 }
155153
156154 // add required CRD for each dependent that targets a CR
157155 final var dependents = raci .getDependentResourceInfos ();
158156 if (dependents != null && !dependents .isEmpty ()) {
159157 dependents .stream ()
160158 .map (ResourceAssociatedAugmentedClassInfo ::associatedResourceInfo )
161- .filter (ReconciledAugmentedClassInfo ::isCR )
162159 .map (ReconciledAugmentedClassInfo ::asResourceTargeting )
163160 .forEach (secondaryResource -> {
164- final var fullResourceName = secondaryResource .fullResourceName ();
165- requiredCRs .add (fullResourceName );
166- crdsBuilder .addNewRequired ()
167- .withName (fullResourceName )
168- .withVersion (secondaryResource .version ())
169- .withKind (secondaryResource .kind ())
170- .endRequired ();
161+ if (secondaryResource .isCR ()) {
162+ final var fullResourceName = secondaryResource .fullResourceName ();
163+ requiredCRs .add (new CRDDescriptionBuilder ()
164+ .withName (fullResourceName )
165+ .withVersion (secondaryResource .version ())
166+ .withKind (secondaryResource .kind ())
167+ .build ());
168+ } else {
169+ nativeApis .add (new GroupVersionKind (secondaryResource .group (), secondaryResource .kind (),
170+ secondaryResource .version ()));
171+ }
171172 });
172173 }
174+ });
173175
174- // add required CRDs from CSV metadata
175- if (metadata .requiredCRDs != null ) {
176- for (RequiredCRD requiredCRD : metadata .requiredCRDs ) {
177- requiredCRs .add (requiredCRD .name );
178- crdsBuilder .addNewRequired ()
179- .withKind (requiredCRD .kind )
180- .withName (requiredCRD .name )
181- .withVersion (requiredCRD .version )
182- .endRequired ();
183- }
176+ // add required CRDs from CSV metadata
177+ if (metadata .requiredCRDs != null ) {
178+ for (RequiredCRD requiredCRD : metadata .requiredCRDs ) {
179+ requiredCRs .add (new CRDDescriptionBuilder ()
180+ .withKind (requiredCRD .kind )
181+ .withName (requiredCRD .name )
182+ .withVersion (requiredCRD .version )
183+ .build ());
184184 }
185+ }
185186
186- });
187- crdsBuilder .endCustomresourcedefinitions ().endSpec ();
187+ // add sorted native APIs
188+ csvSpecBuilder .addAllToNativeAPIs (nativeApis .stream ()
189+ .sorted (Comparator .comparing (CsvManifestsBuilder ::asString ))
190+ .collect (Collectors .toList ()));
191+
192+ csvSpecBuilder .editOrNewCustomresourcedefinitions ()
193+ .addAllToOwned (ownedCRs )
194+ .addAllToRequired (requiredCRs )
195+ .endCustomresourcedefinitions ()
196+ .endSpec ();
197+ }
198+
199+ private static String asString (GroupVersionKind gvk ) {
200+ return gvk .getGroup () + " " + gvk .getKind () + gvk .getVersion ();
188201 }
189202
190203 public Set <String > getOwnedCRs () {
191- return Collections .unmodifiableSet (ownedCRs );
204+ return ownedCRs .stream ()
205+ .map (CRDDescription ::getName )
206+ .sorted ()
207+ .collect (Collectors .toCollection (LinkedHashSet ::new ));
192208 }
193209
194210 public Set <String > getRequiredCRs () {
195- return Collections .unmodifiableSet (requiredCRs );
211+ return requiredCRs .stream ()
212+ .map (CRDDescription ::getName )
213+ .sorted ()
214+ .collect (Collectors .toCollection (LinkedHashSet ::new ));
196215 }
197216
198217 @ Override
0 commit comments