use of io.fabric8.kubernetes.model.annotation.Version in project fabric8 by jboss-fuse.
the class ProjectDeployerImpl method resolveProfileDeployments.
private DeployResults resolveProfileDeployments(ProjectRequirements requirements, FabricService fabric, Profile profile, ProfileBuilder builder, boolean mergeWithOldProfile) throws Exception {
DependencyDTO rootDependency = requirements.getRootDependency();
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
if (!mergeWithOldProfile) {
// If we're not merging with the old profile, then create a dummy empty profile to merge with instead.
ProfileBuilder emptyProfile = ProfileBuilder.Factory.create(profile.getVersion(), profile.getId()).setOverlay(true);
profile = emptyProfile.getProfile();
}
if (rootDependency != null) {
// as a hack lets just add this bundle in
LOG.info("Got root: " + rootDependency);
List<String> parentIds = profile.getParentIds();
Profile overlay = profileService.getOverlayProfile(profile);
String bundleUrl = rootDependency.toBundleUrlWithType();
LOG.info("Using resolver to add extra features and bundles on " + bundleUrl);
List<String> features = new ArrayList<String>(profile.getFeatures());
List<String> bundles = new ArrayList<String>(profile.getBundles());
List<String> optionals = new ArrayList<String>(profile.getOptionals());
if (requirements.getFeatures() != null) {
features.addAll(requirements.getFeatures());
}
if (requirements.getBundles() != null) {
bundles.addAll(requirements.getBundles());
}
bundles.add(bundleUrl);
LOG.info("Adding bundle: " + bundleUrl);
// TODO we maybe should detect a karaf based container in a nicer way than this?
boolean isKarafContainer = parentIds.contains("karaf") || parentIds.contains("containers-karaf");
boolean addBundleDependencies = Objects.equal("bundle", rootDependency.getType()) || isKarafContainer;
if (addBundleDependencies && requirements.isUseResolver()) {
// lets build up a list of all current active features and bundles along with all discovered features
List<Feature> availableFeatures = new ArrayList<Feature>();
addAvailableFeaturesFromProfile(availableFeatures, fabric, overlay);
Set<String> currentBundleLocations = new HashSet<>();
currentBundleLocations.addAll(bundles);
// lets add the current features
DownloadManager downloadManager = DownloadManagers.createDownloadManager(fabric, executorService);
Set<Feature> currentFeatures = AgentUtils.getFeatures(fabric, downloadManager, overlay);
addBundlesFromProfile(currentBundleLocations, overlay);
List<String> parentProfileIds = requirements.getParentProfiles();
if (parentProfileIds != null) {
for (String parentProfileId : parentProfileIds) {
Profile parentProfile = profileService.getProfile(profile.getVersion(), parentProfileId);
Profile parentOverlay = profileService.getOverlayProfile(parentProfile);
Set<Feature> parentFeatures = AgentUtils.getFeatures(fabric, downloadManager, parentOverlay);
currentFeatures.addAll(parentFeatures);
addAvailableFeaturesFromProfile(availableFeatures, fabric, parentOverlay);
addBundlesFromProfile(currentBundleLocations, parentOverlay);
}
}
// lets add all known features from the known repositories
for (DependencyDTO dependency : rootDependency.getChildren()) {
if ("test".equals(dependency.getScope()) || "provided".equals(dependency.getScope())) {
continue;
}
if ("jar".equals(dependency.getType())) {
String match = getAllServiceMixBundles().get(dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion());
if (match != null) {
LOG.info("Replacing artifact " + dependency + " with servicemix bundle " + match);
String[] parts = match.split(":");
dependency.setGroupId(parts[0]);
dependency.setArtifactId(parts[1]);
dependency.setVersion(parts[2]);
dependency.setType("bundle");
}
}
String prefix = dependency.toBundleUrlWithoutVersion();
Feature feature = findFeatureWithBundleLocationPrefix(currentFeatures, prefix);
if (feature != null) {
LOG.info("Feature is already is in the profile " + feature.getId() + " for " + dependency.toBundleUrl());
} else {
feature = findFeatureWithBundleLocationPrefix(availableFeatures, prefix);
if (feature != null) {
String name = feature.getName();
if (features.contains(name)) {
LOG.info("Feature is already added " + name + " for " + dependency.toBundleUrl());
} else {
LOG.info("Found a matching feature for bundle " + dependency.toBundleUrl() + ": " + feature.getId());
features.add(name);
}
} else {
String bundleUrlWithType = dependency.toBundleUrlWithType();
String foundBundleUri = findBundleUri(currentBundleLocations, prefix);
if (foundBundleUri != null) {
LOG.info("Bundle already included " + foundBundleUri + " for " + bundleUrlWithType);
} else {
boolean ignore = false;
String bundleWithoutMvnPrefix = getMavenCoords(bundleUrlWithType);
for (String ignoreBundlePrefix : RESOLVER_IGNORE_BUNDLE_PREFIXES) {
if (bundleWithoutMvnPrefix.startsWith(ignoreBundlePrefix)) {
ignore = true;
break;
}
}
if (ignore) {
LOG.info("Ignoring bundle: " + bundleUrlWithType);
} else {
boolean optional = dependency.isOptional();
LOG.info("Adding " + (optional ? "optional " : "") + " bundle: " + bundleUrlWithType);
if (optional) {
optionals.add(bundleUrlWithType);
} else {
bundles.add(bundleUrlWithType);
}
}
}
}
}
}
// Modify the profile through the {@link ProfileBuilder}
builder.setOptionals(optionals).setFeatures(features);
}
builder.setBundles(bundles);
}
profile = profileService.updateProfile(builder.getProfile());
Integer minimumInstances = requirements.getMinimumInstances();
if (minimumInstances != null) {
FabricRequirements fabricRequirements = fabricService.get().getRequirements();
ProfileRequirements profileRequirements = fabricRequirements.getOrCreateProfileRequirement(profile.getId());
profileRequirements.setMinimumInstances(minimumInstances);
fabricRequirements.setVersion(requirements.getVersion());
fabricService.get().setRequirements(fabricRequirements);
}
// lets find a hawtio profile and version
String profileUrl = findHawtioUrl(fabric);
if (profileUrl == null) {
profileUrl = "/";
}
if (!profileUrl.endsWith("/")) {
profileUrl += "/";
}
String profilePath = Profiles.convertProfileIdToPath(profile.getId());
profileUrl += "index.html#/wiki/branch/" + profile.getVersion() + "/view/fabric/profiles/" + profilePath;
return new DeployResults(profile, profileUrl);
}
use of io.fabric8.kubernetes.model.annotation.Version in project fabric8 by jboss-fuse.
the class ProjectDeployerImpl method getOrCreateProfile.
// Implementation methods
// -------------------------------------------------------------------------
private Profile getOrCreateProfile(Version version, ProjectRequirements requirements) {
String profileId = getProfileId(requirements);
if (Strings.isEmpty(profileId)) {
throw new IllegalArgumentException("No profile ID could be deduced for requirements: " + requirements);
}
// make sure the profileId is valid
FabricValidations.validateProfileName(profileId);
Profile profile;
if (!version.hasProfile(profileId)) {
LOG.info("Creating new profile " + profileId + " version " + version + " for requirements: " + requirements);
String versionId = version.getId();
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
ProfileBuilder builder = ProfileBuilder.Factory.create(versionId, profileId);
profile = profileService.createProfile(builder.getProfile());
} else {
profile = version.getRequiredProfile(profileId);
}
return profile;
}
use of io.fabric8.kubernetes.model.annotation.Version in project fabric8 by jboss-fuse.
the class ProjectDeployerImpl method getOrCreateVersion.
private Version getOrCreateVersion(ProjectRequirements requirements) {
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
String versionId = getVersionId(requirements);
Version version = findVersion(fabricService.get(), versionId);
if (version == null) {
String baseId = requirements.getBaseVersion();
baseId = getVersionOrDefaultVersion(fabricService.get(), baseId);
Version baseVersion = findVersion(fabricService.get(), baseId);
if (baseVersion != null) {
version = profileService.createVersionFrom(baseVersion.getId(), versionId, null);
} else {
version = VersionBuilder.Factory.create(versionId).getVersion();
version = profileService.createVersion(version);
}
}
return version;
}
use of io.fabric8.kubernetes.model.annotation.Version in project fabric8 by jboss-fuse.
the class ProjectDeployerTest method testProfileDeploy.
@Test
@Ignore("[FABRIC-1110] Mocked test makes invalid assumption on the implementation")
public void testProfileDeploy() throws Exception {
String groupId = "foo";
String artifactId = "bar";
String expectedProfileId = groupId + "-" + artifactId;
String versionId = "1.0";
ProjectRequirements requirements = new ProjectRequirements();
DependencyDTO rootDependency = new DependencyDTO();
requirements.setRootDependency(rootDependency);
rootDependency.setGroupId(groupId);
rootDependency.setArtifactId(artifactId);
rootDependency.setVersion("1.0.0");
List<String> parentProfileIds = Arrays.asList("karaf");
List<String> features = Arrays.asList("cxf", "war");
requirements.setParentProfiles(parentProfileIds);
requirements.setFeatures(features);
projectDeployer.deployProject(requirements);
// now we should have a profile created
Profile profile = assertProfileInFabric(expectedProfileId, versionId);
assertBundleCount(profile, 1);
assertEquals("parent ids", parentProfileIds, profile.getParentIds());
assertFeatures(profile, features);
String requirementsFileName = "dependencies/" + groupId + "/" + artifactId + "-requirements.json";
byte[] jsonData = profile.getFileConfiguration(requirementsFileName);
assertNotNull("should have found some JSON for: " + requirementsFileName, jsonData);
String json = new String(jsonData);
LOG.info("Got JSON: " + json);
// lets replace the version, parent, features
rootDependency.setVersion("1.0.1");
projectDeployer.deployProject(requirements);
profile = assertProfileInFabric(expectedProfileId, versionId);
assertBundleCount(profile, 1);
// now lets make a new version
expectedProfileId = "cheese";
versionId = "1.2";
requirements.setVersion(versionId);
requirements.setProfileId(expectedProfileId);
parentProfileIds = Arrays.asList("default");
features = Arrays.asList("camel", "war");
requirements.setParentProfiles(parentProfileIds);
requirements.setFeatures(features);
projectDeployer.deployProject(requirements);
profile = assertProfileInFabric(expectedProfileId, versionId);
assertBundleCount(profile, 1);
assertEquals("parent ids", parentProfileIds, profile.getParentIds());
assertFeatures(profile, features);
// assertProfileMetadata();
}
use of io.fabric8.kubernetes.model.annotation.Version in project fabric8 by jboss-fuse.
the class OpenshiftContainerProvider method create.
@Override
public CreateOpenshiftContainerMetadata create(CreateOpenshiftContainerOptions options, CreationStateListener listener) throws Exception {
assertValid();
IUser user = getOrCreateConnection(options).getUser();
IDomain domain = getOrCreateDomain(user, options);
String cartridgeUrl = null;
Set<String> profiles = options.getProfiles();
String versionId = options.getVersion();
Map<String, String> openshiftConfigOverlay = new HashMap<String, String>();
if (profiles != null && versionId != null) {
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
Version version = profileService.getVersion(versionId);
if (version != null) {
for (String profileId : profiles) {
Profile profile = version.getRequiredProfile(profileId);
if (profile != null) {
Profile overlay = profileService.getOverlayProfile(profile);
Map<String, String> openshiftConfig = overlay.getConfiguration(OpenShiftConstants.OPENSHIFT_PID);
if (openshiftConfig != null) {
openshiftConfigOverlay.putAll(openshiftConfig);
}
}
}
}
cartridgeUrl = openshiftConfigOverlay.get("cartridge");
}
if (cartridgeUrl == null) {
cartridgeUrl = defaultCartridgeUrl;
}
String[] cartridgeUrls = cartridgeUrl.split(" ");
LOG.info("Creating cartridges: " + cartridgeUrl);
String standAloneCartridgeUrl = cartridgeUrls[0];
StandaloneCartridge cartridge;
if (standAloneCartridgeUrl.startsWith(PREFIX_CARTRIDGE_ID)) {
cartridge = new StandaloneCartridge(standAloneCartridgeUrl.substring(PREFIX_CARTRIDGE_ID.length()));
} else {
cartridge = new StandaloneCartridge(new URL(standAloneCartridgeUrl));
}
String zookeeperUrl = fabricService.get().getZookeeperUrl();
String zookeeperPassword = fabricService.get().getZookeeperPassword();
Map<String, String> userEnvVars = null;
if (!options.isEnsembleServer()) {
userEnvVars = new HashMap<String, String>();
userEnvVars.put("OPENSHIFT_FUSE_ZOOKEEPER_URL", zookeeperUrl);
userEnvVars.put("OPENSHIFT_FUSE_ZOOKEEPER_PASSWORD", zookeeperPassword);
String zkPasswordEncode = System.getProperty("zookeeper.password.encode", "true");
userEnvVars.put("OPENSHIFT_FUSE_ZOOKEEPER_PASSWORD_ENCODE", zkPasswordEncode);
userEnvVars.put("OPENSHIFT_FUSE_CREATED_FROM_FABRIC", "true");
}
String initGitUrl = null;
int timeout = IHttpClient.NO_TIMEOUT;
ApplicationScale scale = null;
String containerName = options.getName();
long t0 = System.currentTimeMillis();
IApplication application;
try {
application = domain.createApplication(containerName, cartridge, scale, new GearProfile(options.getGearProfile()), initGitUrl, timeout, userEnvVars);
} catch (OpenShiftTimeoutException e) {
long t1;
do {
Thread.sleep(5000);
domain.refresh();
application = domain.getApplicationByName(containerName);
if (application != null) {
break;
}
t1 = System.currentTimeMillis();
} while (t1 - t0 < TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES));
}
LOG.info("Created application " + containerName);
// now lets add all the embedded cartridges
List<IEmbeddableCartridge> list = new ArrayList<IEmbeddableCartridge>();
for (int idx = 1, size = cartridgeUrls.length; idx < size; idx++) {
String embeddedUrl = cartridgeUrls[idx];
LOG.info("Adding embedded cartridge: " + embeddedUrl);
if (embeddedUrl.startsWith(PREFIX_CARTRIDGE_ID)) {
list.add(new EmbeddableCartridge(embeddedUrl.substring(PREFIX_CARTRIDGE_ID.length())));
} else {
list.add(new EmbeddableCartridge(new URL(embeddedUrl)));
}
}
if (!list.isEmpty()) {
application.addEmbeddableCartridges(list);
}
String gitUrl = application.getGitUrl();
// in case of OpenShiftTimeoutException, application resource doesn't contain getCreationLog().
// actually this method throws NPE
CreateOpenshiftContainerMetadata metadata = new CreateOpenshiftContainerMetadata(domain.getId(), application.getUUID(), application.getMessages() == null ? "" : application.getCreationLog(), gitUrl);
metadata.setContainerName(containerName);
metadata.setCreateOptions(options);
return metadata;
}
Aggregations