use of io.quarkus.deployment.builditem.ApplicationInfoBuildItem in project quarkus by quarkusio.
the class ContainerImageProcessor method publishImageInfo.
@BuildStep
public void publishImageInfo(ApplicationInfoBuildItem app, ContainerImageConfig containerImageConfig, Optional<FallbackContainerImageRegistryBuildItem> containerImageRegistry, Capabilities capabilities, BuildProducer<ContainerImageInfoBuildItem> containerImage) {
ensureSingleContainerImageExtension(capabilities);
// additionalTags are used even containerImageConfig.image is set because that string cannot contain multiple tags
if (containerImageConfig.additionalTags.isPresent()) {
for (String additionalTag : containerImageConfig.additionalTags.get()) {
if (!ImageReference.isValidTag(additionalTag)) {
throw new IllegalArgumentException("The supplied additional container-image tag '" + additionalTag + "' is invalid");
}
}
}
String effectiveGroup = containerImageConfig.getEffectiveGroup().orElse("");
// This can be the case when running inside kubernetes/minikube in dev-mode. Instead of failing, we should just catch and log.
if (UNKNOWN_USER.equals(effectiveGroup)) {
log.warn("Can't get the current user name, which is used as default for container image group. Can't publish container image info.");
return;
}
// if the user supplied the entire image string, use it
if (containerImageConfig.image.isPresent()) {
ImageReference imageReference = ImageReference.parse(containerImageConfig.image.get());
String repository = imageReference.getRepository();
containerImage.produce(new ContainerImageInfoBuildItem(Optional.of(imageReference.getRegistry()), repository, imageReference.getTag(), containerImageConfig.additionalTags.orElse(Collections.emptyList())));
return;
}
String registry = containerImageConfig.registry.orElseGet(() -> containerImageRegistry.map(FallbackContainerImageRegistryBuildItem::getRegistry).orElse(null));
if ((registry != null) && !ImageReference.isValidRegistry(registry)) {
throw new IllegalArgumentException("The supplied container-image registry '" + registry + "' is invalid");
}
String effectiveName = containerImageConfig.name.orElse(app.getName());
String repository = (containerImageConfig.getEffectiveGroup().map(s -> s + "/").orElse("")) + effectiveName;
if (!ImageReference.isValidRepository(repository)) {
throw new IllegalArgumentException("The supplied combination of container-image group '" + effectiveGroup + "' and name '" + effectiveName + "' is invalid");
}
final String effectiveTag = containerImageConfig.tag.orElse(app.getVersion());
if (!ImageReference.isValidTag(effectiveTag)) {
throw new IllegalArgumentException("The supplied container-image tag '" + effectiveTag + "' is invalid");
}
containerImage.produce(new ContainerImageInfoBuildItem(Optional.ofNullable(registry), containerImageConfig.getEffectiveGroup(), effectiveName, effectiveTag, containerImageConfig.additionalTags.orElse(Collections.emptyList())));
}
use of io.quarkus.deployment.builditem.ApplicationInfoBuildItem in project quarkus-operator-sdk by quarkiverse.
the class BundleProcessor method generateBundle.
@BuildStep
void generateBundle(ApplicationInfoBuildItem configuration, BundleGenerationConfiguration bundleConfiguration, BuildTimeOperatorConfiguration operatorConfiguration, OutputTargetBuildItem outputTarget, CSVMetadataBuildItem csvMetadata, BuildProducer<GeneratedBundleBuildItem> doneGeneratingCSV, GeneratedCRDInfoBuildItem generatedCustomResourcesDefinitions, List<GeneratedKubernetesResourceBuildItem> generatedKubernetesManifests, BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs) {
if (bundleConfiguration.enabled) {
try {
final var crds = generatedCustomResourcesDefinitions.getCRDGenerationInfo().getCrds().values().stream().flatMap(entry -> entry.values().stream()).collect(Collectors.toList());
final var outputDir = outputTarget.getOutputDirectory().resolve(BUNDLE);
final var serviceAccounts = new LinkedList<ServiceAccount>();
final var clusterRoleBindings = new LinkedList<ClusterRoleBinding>();
final var clusterRoles = new LinkedList<ClusterRole>();
final var roleBindings = new LinkedList<RoleBinding>();
final var roles = new LinkedList<Role>();
final var deployments = new LinkedList<Deployment>();
generatedKubernetesManifests.stream().filter(bi -> bi.getName().equals("kubernetes.yml")).findAny().ifPresent(bi -> {
final var resources = Serialization.unmarshalAsList(new ByteArrayInputStream(bi.getContent()));
resources.getItems().forEach(r -> {
if (r instanceof ServiceAccount) {
serviceAccounts.add((ServiceAccount) r);
return;
}
if (r instanceof ClusterRoleBinding) {
clusterRoleBindings.add((ClusterRoleBinding) r);
return;
}
if (r instanceof ClusterRole) {
clusterRoles.add((ClusterRole) r);
return;
}
if (r instanceof RoleBinding) {
roleBindings.add((RoleBinding) r);
return;
}
if (r instanceof Role) {
roles.add((Role) r);
return;
}
if (r instanceof Deployment) {
deployments.add((Deployment) r);
}
});
});
final var generated = BundleGenerator.prepareGeneration(bundleConfiguration, operatorConfiguration, csvMetadata.getCsvGroups(), crds);
generated.forEach(manifestBuilder -> {
final var fileName = manifestBuilder.getFileName();
try {
generatedCSVs.produce(new GeneratedFileSystemResourceBuildItem(Path.of(BUNDLE).resolve(manifestBuilder.getName()).resolve(fileName).toString(), manifestBuilder.getManifestData(serviceAccounts, clusterRoleBindings, clusterRoles, roleBindings, roles, deployments)));
log.infov("Generating {0} for {1} controller -> {2}", manifestBuilder.getManifestType(), manifestBuilder.getName(), outputDir.resolve(manifestBuilder.getName()).resolve(fileName));
} catch (IOException e) {
log.errorv("Cannot generate {0} for {1}: {2}", manifestBuilder.getManifestType(), manifestBuilder.getName(), e.getMessage());
}
});
doneGeneratingCSV.produce(new GeneratedBundleBuildItem());
} catch (Exception e) {
log.infov(e, "Couldn't generate bundle:");
}
}
}
use of io.quarkus.deployment.builditem.ApplicationInfoBuildItem in project quarkus-operator-sdk by quarkiverse.
the class BundleProcessor method gatherCSVMetadata.
@SuppressWarnings("unchecked")
@BuildStep
CSVMetadataBuildItem gatherCSVMetadata(ApplicationInfoBuildItem configuration, BundleGenerationConfiguration bundleConfiguration, CombinedIndexBuildItem combinedIndexBuildItem, ConfigurationServiceBuildItem configurations) {
final var controllerConfigs = configurations.getControllerConfigs();
final var index = combinedIndexBuildItem.getIndex();
final var operatorCsvMetadata = getCSVMetadataForOperator(bundleConfiguration.packageName.orElse(configuration.getName()), index);
final var csvGroups = new HashMap<CSVMetadataHolder, List<AugmentedResourceInfo>>();
ClassUtils.getKnownReconcilers(index, log).forEach(reconcilerInfo -> {
// figure out which group should be used to generate CSV
final var name = reconcilerInfo.name();
log.debugv("Processing reconciler: {0}", name);
final var config = controllerConfigs.get(name);
if (config == null) {
throw new IllegalStateException("Missing configuration for reconciler " + name);
}
// Check whether the reconciler must be shipped using a custom bundle
CSVMetadataHolder csvMetadata = getCsvMetadataFromAnnotation(operatorCsvMetadata, reconcilerInfo.classInfo()).orElse(operatorCsvMetadata);
final var resourceFullName = config.getResourceTypeName();
final var resourceInfo = ResourceInfo.createFrom(config.getResourceClass(), resourceFullName, name, config.getSpecClassName(), config.getStatusClassName());
csvGroups.computeIfAbsent(csvMetadata, m -> new ArrayList<>()).add(new AugmentedResourceInfo(resourceInfo, csvMetadata.name));
});
return new CSVMetadataBuildItem(csvGroups);
}
use of io.quarkus.deployment.builditem.ApplicationInfoBuildItem in project quarkus by quarkusio.
the class ContainerImageInfoTest method whenPublishImageInfo.
private void whenPublishImageInfo() {
BuildTimeConfigurationReader reader = new BuildTimeConfigurationReader(Collections.singletonList(ContainerImageConfig.class));
SmallRyeConfigBuilder builder = ConfigUtils.configBuilder(false, LaunchMode.NORMAL);
DefaultValuesConfigurationSource ds = new DefaultValuesConfigurationSource(reader.getBuildTimePatternMap());
PropertiesConfigSource pcs = new PropertiesConfigSource(new Properties(), "Test Properties");
builder.withSources(ds, pcs);
SmallRyeConfig src = builder.build();
BuildTimeConfigurationReader.ReadResult readResult = reader.readConfiguration(src);
ContainerImageConfig containerImageConfig = (ContainerImageConfig) readResult.requireObjectForClass(ContainerImageConfig.class);
ApplicationInfoBuildItem app = new ApplicationInfoBuildItem(Optional.of(APP_NAME), Optional.of(APP_VERSION));
Capabilities capabilities = new Capabilities(Collections.emptySet());
BuildProducer<ContainerImageInfoBuildItem> containerImage = actualImageConfig -> actualContainerImageInfo = actualImageConfig;
ContainerImageProcessor processor = new ContainerImageProcessor();
processor.publishImageInfo(app, containerImageConfig, Optional.empty(), capabilities, containerImage);
}
Aggregations