Skip to content

Commit

Permalink
Compatibility with Kubernetes 1.24 (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
olevitt authored Jul 6, 2022
1 parent 95c94e8 commit db64942
Showing 1 changed file with 36 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,20 +54,15 @@
@Qualifier("Helm")
public class HelmAppsService implements AppsService {

@Autowired
private KubernetesService kubernetesService;

private static final Logger LOGGER = LoggerFactory.getLogger(HelmAppsService.class);
@Autowired
@Qualifier("helm")
ObjectMapper mapperHelm;

@Autowired
private KubernetesService kubernetesService;
@Autowired(required = false)
private List<AdmissionControllerHelm> admissionControllers = new ArrayList<>();

private SimpleDateFormat helmDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private static final Logger LOGGER = LoggerFactory.getLogger(HelmAppsService.class);

@Autowired
private KubernetesClientProvider kubernetesClientProvider;

Expand All @@ -81,7 +76,7 @@ public class HelmAppsService implements AppsService {
private UrlGenerator urlGenerator;

private HelmConfiguration getHelmConfiguration(Region region, User user) {
return helmClientProvider.getConfiguration(region,user);
return helmClientProvider.getConfiguration(region, user);
}

private HelmInstallService getHelmInstallService() {
Expand Down Expand Up @@ -109,7 +104,7 @@ public String getAppId(String scopeName, XGeneratedContext.Scope scope, Property
@Override
public String getExternalDns(String scopeName, XGeneratedContext.Scope scope, Property.XGenerated xGenerated) {
return urlGenerator.generateUrl(user.getIdep(), pkg.getName(),
context.getGlobalContext().getRandomizedId(), scopeName+(StringUtils.isNotBlank(xGenerated.getName()) ? "-"+xGenerated.getName() : ""), region.getServices().getExpose().getDomain());
context.getGlobalContext().getRandomizedId(), scopeName + (StringUtils.isNotBlank(xGenerated.getName()) ? "-" + xGenerated.getName() : ""), region.getServices().getExpose().getDomain());
}

@Override
Expand All @@ -122,8 +117,8 @@ public String getInitScript(String scopeName, XGeneratedContext.Scope scope, Pro
return region.getServices().getInitScript();
}
};
Map<String,String> xGeneratedValues = xGeneratedProcessor.process(xGeneratedContext,xGeneratedProvider);
xGeneratedProcessor.injectIntoContext(fusion,xGeneratedValues);
Map<String, String> xGeneratedValues = xGeneratedProcessor.process(xGeneratedContext, xGeneratedProvider);
xGeneratedProcessor.injectIntoContext(fusion, xGeneratedValues);

long nbInvalidations = admissionControllers.stream().map(controller -> controller.validateContract(region, pkg, fusion, user, context))
.filter(b -> !b).count();
Expand All @@ -132,81 +127,80 @@ public String getInitScript(String scopeName, XGeneratedContext.Scope scope, Pro
}
File values = File.createTempFile("values", ".yaml");
mapperHelm.writeValue(values, fusion);
String namespaceId = kubernetesService.determineNamespaceAndCreateIfNeeded(region,project, user);
HelmInstaller res = getHelmInstallService().installChart(getHelmConfiguration(region,user),catalogId + "/" + pkg.getName(), namespaceId, requestDTO.getName(), requestDTO.isDryRun(),
values,null);
String namespaceId = kubernetesService.determineNamespaceAndCreateIfNeeded(region, project, user);
HelmInstaller res = getHelmInstallService().installChart(getHelmConfiguration(region, user), catalogId + "/" + pkg.getName(), namespaceId, requestDTO.getName(), requestDTO.isDryRun(),
values, null);
values.delete();
return List.of(res.getManifest());
}

@Override
public CompletableFuture<ServicesListing> getUserServices(Region region,Project project,User user) throws IOException, IllegalAccessException {
public CompletableFuture<ServicesListing> getUserServices(Region region, Project project, User user) throws IOException, IllegalAccessException {
return getUserServices(region, project, user, null);
}

@Override
public CompletableFuture<ServicesListing> getUserServices(Region region,Project project,User user, String groupId)
public CompletableFuture<ServicesListing> getUserServices(Region region, Project project, User user, String groupId)
throws IOException, IllegalAccessException {
if (groupId != null) {
LOGGER.debug("STUB : group listing is currently not supported on helm");
return CompletableFuture.completedFuture(new ServicesListing());
}
List<HelmLs> installedCharts = null;
try {
installedCharts = Arrays.asList(getHelmInstallService().listChartInstall(getHelmConfiguration(region,user),project.getNamespace()));
installedCharts = Arrays.asList(getHelmInstallService().listChartInstall(getHelmConfiguration(region, user), project.getNamespace()));
} catch (Exception e) {
return CompletableFuture.completedFuture(new ServicesListing());
}
List<Service> services = new ArrayList<>();
for (HelmLs release : installedCharts) {
services.add(getHelmApp(region,user,release));
services.add(getHelmApp(region, user, release));
}
ServicesListing listing = new ServicesListing();
listing.setApps(services);
return CompletableFuture.completedFuture(listing);
}

@Override
public String getLogs(Region region,Project project,User user, String serviceId, String taskId) {
KubernetesClient client = kubernetesClientProvider.getUserClient(region,user);
return client.pods().inNamespace(kubernetesService.determineNamespaceAndCreateIfNeeded(region,project,user)).withName(taskId).getLog();
public String getLogs(Region region, Project project, User user, String serviceId, String taskId) {
KubernetesClient client = kubernetesClientProvider.getUserClient(region, user);
return client.pods().inNamespace(kubernetesService.determineNamespaceAndCreateIfNeeded(region, project, user)).withName(taskId).getLog();
}

@Override
public Service getUserService(Region region, Project project,User user, String serviceId) throws MultipleServiceFound, ParseException {
public Service getUserService(Region region, Project project, User user, String serviceId) throws MultipleServiceFound, ParseException {
if (serviceId.startsWith("/")) {
serviceId = serviceId.substring(1);
}
HelmLs result = getHelmInstallService().getAppById(getHelmConfiguration(region,user),serviceId, kubernetesService.determineNamespaceAndCreateIfNeeded(region,project, user));
return getHelmApp(region,user,result);
HelmLs result = getHelmInstallService().getAppById(getHelmConfiguration(region, user), serviceId, kubernetesService.determineNamespaceAndCreateIfNeeded(region, project, user));
return getHelmApp(region, user, result);
}

@Override
public UninstallService destroyService(Region region,Project project, User user, final String path, boolean bulk) throws Exception {
public UninstallService destroyService(Region region, Project project, User user, final String path, boolean bulk) throws Exception {
final String namespace = kubernetesService.determineNamespaceAndCreateIfNeeded(region, project, user);
UninstallService result = new UninstallService();
result.setPath(path);
int status = 0;
if (bulk) {
// If bulk in kub we ignore the path and delete every helm release
HelmLs[] releases = getHelmInstallService().listChartInstall(getHelmConfiguration(region,user),namespace);
for (int i = 0; i <releases.length; i++){
status = Math.max(0,getHelmInstallService().uninstaller(getHelmConfiguration(region,user),releases[i].getName(),namespace));
HelmLs[] releases = getHelmInstallService().listChartInstall(getHelmConfiguration(region, user), namespace);
for (int i = 0; i < releases.length; i++) {
status = Math.max(0, getHelmInstallService().uninstaller(getHelmConfiguration(region, user), releases[i].getName(), namespace));
}
}
else {
} else {
// Strip / if present
String cannonicalPath = path.startsWith("/") ? path.substring(1) : path;
status = getHelmInstallService().uninstaller(getHelmConfiguration(region,user),cannonicalPath, namespace);
status = getHelmInstallService().uninstaller(getHelmConfiguration(region, user), cannonicalPath, namespace);
}

result.setSuccess(status == 0);
return result;
}

private Service getHelmApp(Region region, User user, HelmLs release) {
String manifest = getHelmInstallService().getManifest(getHelmConfiguration(region,user),release.getName(), release.getNamespace());
Service service = getServiceFromRelease(region, release, manifest,user);
String manifest = getHelmInstallService().getManifest(getHelmConfiguration(region, user), release.getName(), release.getNamespace());
Service service = getServiceFromRelease(region, release, manifest, user);
service.setStatus(findAppStatus(release));
try {
service.setStartedAt(helmDateFormat.parse(release.getUpdated()).getTime());
Expand All @@ -218,7 +212,7 @@ private Service getHelmApp(Region region, User user, HelmLs release) {
service.setSubtitle(release.getChart());
service.setType(Service.ServiceType.KUBERNETES);
try {
String values = getHelmInstallService().getValues(getHelmConfiguration(region,user),release.getName(), release.getNamespace());
String values = getHelmInstallService().getValues(getHelmConfiguration(region, user), release.getName(), release.getNamespace());
JsonNode node = new ObjectMapper().readTree(values);
Map<String, String> result = new HashMap<>();
node.fields().forEachRemaining(currentNode -> mapAppender(result, currentNode, new ArrayList<String>()));
Expand All @@ -227,7 +221,7 @@ private Service getHelmApp(Region region, User user, HelmLs release) {
e.printStackTrace();
}
try {
String notes = getHelmInstallService().getNotes(getHelmConfiguration(region,user),release.getName(), release.getNamespace());
String notes = getHelmInstallService().getNotes(getHelmConfiguration(region, user), release.getName(), release.getNamespace());
service.setPostInstallInstructions(notes);
} catch (Exception e) {
e.printStackTrace();
Expand All @@ -246,7 +240,7 @@ private void mapAppender(Map<String, String> result, Map.Entry<String, JsonNode>
}

private Service getServiceFromRelease(Region region, HelmLs release, String manifest, User user) {
KubernetesClient client = kubernetesClientProvider.getUserClient(region,user);
KubernetesClient client = kubernetesClientProvider.getUserClient(region, user);
InputStream inputStream = new ByteArrayInputStream(manifest.getBytes(Charset.forName("UTF-8")));
List<HasMetadata> hasMetadatas = client.load(inputStream).get();
List<Ingress> ingresses = hasMetadatas.stream().filter(hasMetadata -> hasMetadata instanceof Ingress)
Expand All @@ -263,9 +257,8 @@ private Service getServiceFromRelease(Region region, HelmLs release, String mani
return host;
}).collect(Collectors.toList());
urls.addAll(listHost);
}
catch (Exception e) {
System.out.println("Warning : could not read urls from ingress "+ingress.getFullResourceName());
} catch (Exception e) {
System.out.println("Warning : could not read urls from ingress " + ingress.getFullResourceName());
}
}
service.setUrls(urls);
Expand All @@ -281,7 +274,7 @@ private Service getServiceFromRelease(Region region, HelmLs release, String mani
status.setReason(pod.getStatus().getContainerStatuses().stream()
.filter(cstatus -> cstatus.getState().getWaiting() != null)
.map(cstatus -> cstatus.getState().getWaiting().getReason())
.findFirst().orElse(null));
.findFirst().orElse(null));
pod.getStatus().getContainerStatuses().forEach(c -> {
Container container = new Container();
container.setName(c.getName());
Expand All @@ -293,14 +286,13 @@ private Service getServiceFromRelease(Region region, HelmLs release, String mani
}).collect(Collectors.toList()));

EventList eventList = client.v1().events().inNamespace(release.getNamespace()).list();
List<Event> events = eventList.getItems().stream().filter(event -> event.getInvolvedObject().getName().contains(release.getName())).map(event -> {
List<Event> events = eventList.getItems().stream().filter(event -> event.getInvolvedObject() != null && event.getInvolvedObject().getName() != null && event.getInvolvedObject().getName().contains(release.getName())).map(event -> {
Event newEvent = new Event();
newEvent.setMessage(event.getMessage());
try {
// TODO : use kubernetes time format instead of helm
newEvent.setTimestamp(helmDateFormat.parse(event.getEventTime().getTime()).getTime());
}
catch (Exception e) {
} catch (Exception e) {

}
return newEvent;
Expand All @@ -311,7 +303,6 @@ private Service getServiceFromRelease(Region region, HelmLs release, String mani
}



private Service.ServiceStatus findAppStatus(HelmLs release) {
if (release.getStatus().equals("deployed")) {
return Service.ServiceStatus.RUNNING;
Expand Down

0 comments on commit db64942

Please sign in to comment.