/*******************************************************************************
* Copyright (c) 2016 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.v2;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import org.cloudfoundry.client.v2.buildpacks.BuildpackResource;
import org.cloudfoundry.client.v2.domains.DomainResource;
import org.cloudfoundry.operations.applications.ApplicationDetail;
import org.cloudfoundry.operations.applications.ApplicationSummary;
import org.cloudfoundry.operations.applications.InstanceDetail;
import org.cloudfoundry.operations.organizations.OrganizationSummary;
import org.cloudfoundry.operations.services.ServiceInstance;
import org.cloudfoundry.operations.services.ServiceInstanceType;
import org.cloudfoundry.operations.spaces.SpaceSummary;
import org.cloudfoundry.operations.stacks.Stack;
import org.springframework.ide.eclipse.boot.core.BootActivator;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFAppState;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFApplication;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFApplicationDetail;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFBuildpack;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFCloudDomain;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFInstanceState;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFInstanceStats;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFOrganization;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFServiceInstance;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFSpace;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.client.CFStack;
import com.google.common.collect.ImmutableList;
/**
* Various helper methods to 'wrap' objects returned by CF client into
* our own types, so that we do not directly expose library types to our
* code.
*
* @author Kris De Volder
*/
public class CFWrappingV2 {
public static CFBuildpack wrap(BuildpackResource rsrc) {
String name = rsrc.getEntity().getName();
return new CFBuildpack() {
@Override
public String getName() {
return name;
}
};
}
public static CFApplicationDetail wrap(ApplicationDetail details, ApplicationExtras extras) {
if (details!=null) {
List<CFInstanceStats> instances = ImmutableList.copyOf(
details.getInstanceDetails()
.stream()
.map(CFWrappingV2::wrap)
.collect(Collectors.toList())
);
CFApplicationSummaryData summary = wrapSummary(details, extras);
return new CFApplicationDetailData(
summary,
instances
);
}
return null;
}
public static CFStack wrap(Stack stack) {
if (stack!=null) {
String name = stack.getName();
return new CFStack() {
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "CFStack("+name+")";
}
};
}
return null;
}
public static CFApplicationDetail wrap(
CFApplicationSummaryData summary,
ApplicationDetail details
) {
List<CFInstanceStats> instanceDetails = ImmutableList.copyOf(
details
.getInstanceDetails()
.stream()
.map(CFWrappingV2::wrap)
.collect(Collectors.toList())
);
return new CFApplicationDetailData(summary, instanceDetails);
}
public static CFCloudDomain wrap(DomainResource domainRsrc) {
if (domainRsrc!=null) {
String name = domainRsrc.getEntity().getName();
return new CFCloudDomain() {
public String getName() {
return name;
}
@Override
public String toString() {
return "CFCloudDomain("+name+")";
}
};
}
return null;
}
public static CFInstanceStats wrap(InstanceDetail instanceDetail) {
return new CFInstanceStats() {
@Override
public CFInstanceState getState() {
try {
return CFInstanceState.valueOf(instanceDetail.getState());
} catch (Exception e) {
BootActivator.log(e);
return CFInstanceState.UNKNOWN;
}
}
@Override
public String toString() {
return ""+getState();
}
};
}
private static CFApplicationSummaryData wrapSummary(ApplicationDetail app, ApplicationExtras extras) {
CFAppState state;
try {
state = CFAppState.valueOf(app.getRequestedState());
} catch (Exception e) {
BootActivator.log(e);
state = CFAppState.UNKNOWN;
}
return new CFApplicationSummaryData(
app.getName(),
app.getInstances(),
app.getRunningInstances(),
app.getMemoryLimit(),
UUID.fromString(app.getId()),
app.getUrls(),
state,
app.getDiskQuota(),
extras
);
}
public static CFApplication wrap(ApplicationSummary app, ApplicationExtras extras) {
CFAppState state;
try {
state = CFAppState.valueOf(app.getRequestedState());
} catch (Exception e) {
BootActivator.log(e);
state = CFAppState.UNKNOWN;
}
return new CFApplicationSummaryData(
app.getName(),
app.getInstances(),
app.getRunningInstances(),
app.getMemoryLimit(),
UUID.fromString(app.getId()),
app.getUrls(),
state,
app.getDiskQuota(),
extras
);
}
public static CFServiceInstance wrap(final ServiceInstance service) {
return new CFServiceInstance() {
@Override
public String getName() {
return service.getName();
}
@Override
public String getPlan() {
return service.getPlan();
}
@Override
public String getDashboardUrl() {
return service.getDashboardUrl();
}
@Override
public String getService() {
if (service.getType()==ServiceInstanceType.USER_PROVIDED) {
return "user-provided";
} else {
return service.getService();
}
}
@Override
public String getDescription() {
return service.getDescription();
}
@Override
public String getDocumentationUrl() {
return service.getDocumentationUrl();
}
};
}
public static CFAppState wrapAppState(String s) {
try {
return CFAppState.valueOf(s);
} catch (Exception e) {
BootActivator.log(e);
return CFAppState.UNKNOWN;
}
}
public static CFSpace wrap(OrganizationSummary org, SpaceSummary space) {
return new CFSpace() {
@Override
public String getName() {
return space.getName();
}
@Override
public CFOrganization getOrganization() {
return wrap(org);
}
@Override
public UUID getGuid() {
return UUID.fromString(space.getId());
}
@Override
public String toString() {
return "CFSpace("+org.getName()+" / "+getName()+")";
}
};
}
public static CFOrganization wrap(OrganizationSummary org) {
return new CFOrganization() {
@Override
public String getName() {
return org.getName();
}
@Override
public UUID getGuid() {
return UUID.fromString(org.getId());
}
};
}
public static CFBuildpack buildpack(String name) {
return new CFBuildpack() {
@Override
public String getName() {
return name;
}
};
}
}