Skip to content

Commit d33574a

Browse files
committed
feat: automatically add provider name and URL based on user and git repo
Signed-off-by: Chris Laprun <[email protected]>
1 parent e265bd4 commit d33574a

File tree

3 files changed

+56
-8
lines changed

3 files changed

+56
-8
lines changed

bundle-generator/deployment/src/main/java/io/quarkiverse/operatorsdk/bundle/deployment/BundleProcessor.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
4242
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
4343
import io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem;
44+
import io.quarkus.deployment.pkg.builditem.JarBuildItem;
4445
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
46+
import io.quarkus.kubernetes.deployment.KubernetesCommonHelper;
4547
import io.quarkus.kubernetes.deployment.KubernetesConfig;
4648
import io.quarkus.kubernetes.deployment.ResourceNameUtil;
4749

@@ -69,7 +71,8 @@ public boolean getAsBoolean() {
6971
CSVMetadataBuildItem gatherCSVMetadata(KubernetesConfig kubernetesConfig,
7072
ApplicationInfoBuildItem appConfiguration,
7173
BundleGenerationConfiguration bundleConfiguration,
72-
CombinedIndexBuildItem combinedIndexBuildItem) {
74+
CombinedIndexBuildItem combinedIndexBuildItem,
75+
JarBuildItem jarBuildItem) {
7376
final var index = combinedIndexBuildItem.getIndex();
7477
final var defaultName = bundleConfiguration.packageName
7578
.orElse(ResourceNameUtil.getResourceName(kubernetesConfig, appConfiguration));
@@ -82,7 +85,8 @@ CSVMetadataBuildItem gatherCSVMetadata(KubernetesConfig kubernetesConfig,
8285

8386
final var defaultReplaces = bundleConfiguration.replaces.orElse(null);
8487

85-
final var sharedMetadataHolders = getSharedMetadataHolders(defaultName, defaultVersion, defaultReplaces, index);
88+
final var vcsUrl = getDefaultProviderURLFromSCMInfo(appConfiguration, jarBuildItem);
89+
final var sharedMetadataHolders = getSharedMetadataHolders(defaultName, defaultVersion, defaultReplaces, index, vcsUrl);
8690
final var csvGroups = new HashMap<CSVMetadataHolder, List<ReconcilerAugmentedClassInfo>>();
8791

8892
ClassUtils.getKnownReconcilers(index, log)
@@ -114,7 +118,7 @@ CSVMetadataBuildItem gatherCSVMetadata(KubernetesConfig kubernetesConfig,
114118
}
115119
}
116120
csvMetadata = createMetadataHolder(csvMetadataAnnotation,
117-
new CSVMetadataHolder(csvMetadataName, defaultVersion, defaultReplaces, origin));
121+
new CSVMetadataHolder(csvMetadataName, defaultVersion, defaultReplaces, vcsUrl, origin));
118122
}
119123
log.infov("Assigning ''{0}'' reconciler to {1}",
120124
reconcilerInfo.nameOrFailIfUnset(),
@@ -127,6 +131,33 @@ CSVMetadataBuildItem gatherCSVMetadata(KubernetesConfig kubernetesConfig,
127131
return new CSVMetadataBuildItem(csvGroups);
128132
}
129133

134+
private static String getDefaultProviderURLFromSCMInfo(ApplicationInfoBuildItem appConfiguration,
135+
JarBuildItem jarBuildItem) {
136+
final var maybeProject = KubernetesCommonHelper.createProject(appConfiguration, Optional.empty(),
137+
jarBuildItem.getPath());
138+
return maybeProject.map(project -> {
139+
final var scmInfo = project.getScmInfo();
140+
if (scmInfo != null) {
141+
var origin = scmInfo.getRemote().get("origin");
142+
if (origin != null) {
143+
int atSign = origin.indexOf('@');
144+
if (atSign > 0) {
145+
origin = origin.substring(atSign + 1);
146+
origin = origin.replaceFirst(":", "/");
147+
origin = "https://" + origin;
148+
}
149+
150+
int dotGit = origin.indexOf(".git");
151+
if (dotGit < origin.length() - 1) {
152+
origin = origin.substring(0, dotGit);
153+
}
154+
return origin;
155+
}
156+
}
157+
return null;
158+
}).orElse(null);
159+
}
160+
130161
private static ReconcilerAugmentedClassInfo augmentReconcilerInfo(
131162
ReconcilerAugmentedClassInfo reconcilerInfo) {
132163
// if primary resource is a CR, check if it is annotated with CSVMetadata and augment it if it is
@@ -255,8 +286,8 @@ void generateBundle(ApplicationInfoBuildItem configuration,
255286
}
256287

257288
private Map<String, CSVMetadataHolder> getSharedMetadataHolders(String name, String version, String defaultReplaces,
258-
IndexView index) {
259-
CSVMetadataHolder csvMetadata = new CSVMetadataHolder(name, version, defaultReplaces, "default");
289+
IndexView index, String vcsUrl) {
290+
CSVMetadataHolder csvMetadata = new CSVMetadataHolder(name, version, defaultReplaces, vcsUrl, "default");
260291
final var sharedMetadataImpls = index.getAllKnownImplementors(SHARED_CSV_METADATA);
261292
final var result = new HashMap<String, CSVMetadataHolder>(sharedMetadataImpls.size() + 1);
262293
sharedMetadataImpls.forEach(sharedMetadataImpl -> {

bundle-generator/deployment/src/test/java/io/quarkiverse/operatorsdk/bundle/DefaultBundleWhenNoCsvMetadataTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public void shouldWriteBundleEvenWhenCsvMetadataIsNotUsed() throws IOException {
3737
assertEquals(name, deployment.getName());
3838
// by default, we shouldn't output the version label in the selector match labels as the default controlling this should be overridden by KubernetesLabelConfigOverrider
3939
assertNull(deployment.getSpec().getSelector().getMatchLabels().get("app.kubernetes.io/version"));
40+
assertNotNull(csv.getSpec().getProvider().getName());
41+
assertNotNull(csv.getSpec().getProvider().getUrl());
4042
}
4143

4244
}

bundle-generator/runtime/src/main/java/io/quarkiverse/operatorsdk/bundle/runtime/CSVMetadataHolder.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import java.util.Map;
55
import java.util.Objects;
66

7+
import org.jboss.logging.Logger;
8+
79
public class CSVMetadataHolder {
10+
private static final Logger log = Logger.getLogger(CSVMetadataHolder.class.getName());
811
public final String name;
912
private final String origin;
1013
public final String description;
@@ -117,8 +120,9 @@ public RequiredCRD(String kind, String name, String version) {
117120

118121
}
119122

120-
public CSVMetadataHolder(String name, String version, String replaces, String origin) {
121-
this(name, null, null, null, null, null, null, replaces, null, version, null, null, null, null, null, null, null, null,
123+
public CSVMetadataHolder(String name, String version, String replaces, String providerURL, String origin) {
124+
this(name, null, null, null, null, null, providerURL, replaces, null, version, null, null, null, null, null, null, null,
125+
null,
122126
origin);
123127
}
124128

@@ -133,7 +137,6 @@ public CSVMetadataHolder(String name, String description, String displayName, An
133137
this.displayName = displayName;
134138
this.annotations = annotations;
135139
this.keywords = keywords;
136-
this.providerName = providerName;
137140
this.providerURL = providerURL;
138141
this.replaces = replaces;
139142
this.skips = skips;
@@ -147,6 +150,18 @@ public CSVMetadataHolder(String name, String description, String displayName, An
147150
this.permissionRules = permissionRules;
148151
this.requiredCRDs = requiredCRDs;
149152
this.origin = origin;
153+
154+
// provide a default provider name and output warning if none is provided
155+
if (providerName == null) {
156+
String msg = "";
157+
final var userName = System.getProperty("user.name");
158+
if (userName != null) {
159+
providerName = userName;
160+
msg = ". Using user name " + userName + " as default.";
161+
}
162+
log.warnv("It is recommended that you provide a provider name provided for {0}{1}", name, msg);
163+
}
164+
this.providerName = providerName;
150165
}
151166

152167
@Override

0 commit comments

Comments
 (0)