package io.cattle.platform.servicediscovery.api.action;
import io.cattle.platform.api.action.ActionHandler;
import io.cattle.platform.core.addon.ComposeConfig;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.constants.ServiceConstants;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.core.model.Stack;
import io.cattle.platform.json.JsonMapper;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.servicediscovery.api.service.ServiceDiscoveryApiService;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class StackExportConfigActionHandler implements ActionHandler {
@Inject
ObjectManager objectManager;
@Inject
JsonMapper jsonMapper;
@Inject
ServiceDiscoveryApiService svcDiscoveryServer;
@Override
public String getName() {
return ServiceConstants.PROCESS_STACK_EXPORT_CONFIG;
}
@Override
public Object perform(String name, Object obj, ApiRequest request) {
if (!(obj instanceof Stack)) {
return null;
}
Stack stack = (Stack) obj;
List<? extends Long> serviceIds = DataAccessor.fromMap(request.getRequestObject())
.withKey(ServiceConstants.FIELD_SERVICE_IDS).asList(jsonMapper, Long.class);
List<? extends Service> services = objectManager.mappedChildren(stack, Service.class);
List<Service> toExport = new ArrayList<>();
for (Service service : services) {
// export only non-removed requested services
if ((serviceIds == null || serviceIds.isEmpty()) || serviceIds.contains(service.getId())) {
if (service.getRemoved() == null && !service.getState().equals(CommonStatesConstants.REMOVED)) {
toExport.add(service);
}
}
}
Map.Entry<String, String> composeConfig = svcDiscoveryServer.buildComposeConfig(toExport, stack);
return new ComposeConfig(composeConfig.getKey(), composeConfig.getValue());
}
}