diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts b/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts index 3c62493c90..3c3721943c 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts @@ -5,6 +5,7 @@ import { Observable, Subject, Subscription } from 'rxjs'; import makeWebSocketObservable, { GetWebSocketResponses } from 'rxjs-websockets'; import { catchError, map, share, switchMap } from 'rxjs/operators'; +import { HideSnackBar, ShowSnackBar } from '../../../../../../../store/src/actions/snackBar.actions'; import { AppState } from '../../../../../../../store/src/app-state'; import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityRequestAction, WrapperRequestActionSuccess } from '../../../../../../../store/src/types/request.types'; @@ -142,6 +143,12 @@ export class HelmReleaseTabBaseComponent implements OnDestroy { resources.endpointId, ); this.addResource(releaseResourceAction, resources); + } else if (messageObj.kind === 'ManifestErrors') { + if (messageObj.data) { + this.store.dispatch( + new ShowSnackBar('Errors were found when parsing this workload. Not all resources may be shown', 'Dismiss') + ); + } } } }); @@ -189,5 +196,6 @@ export class HelmReleaseTabBaseComponent implements OnDestroy { ngOnDestroy() { this.sub.unsubscribe(); + this.store.dispatch(new HideSnackBar()); } } diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.actions.ts b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.actions.ts index 319ef74b8b..b2448b591f 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.actions.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.actions.ts @@ -66,7 +66,6 @@ export class GetHelmReleases implements MonocularPaginationAction { }; } - export class GetHelmRelease implements HelmReleaseSingleEntity { guid: string; constructor( diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.reducers.ts b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.reducers.ts index 1d6797ee74..790325ad9a 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.reducers.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.reducers.ts @@ -2,11 +2,12 @@ import { UPDATE_HELM_RELEASE } from './workloads.actions'; const defaultState = {}; -export function helmReleaseReducer(state: any = defaultState, action) { +export function helmReleaseReducer(state = defaultState, action) { switch (action.type) { case UPDATE_HELM_RELEASE: return { ...state, }; + } } diff --git a/src/jetstream/plugins/kubernetes/get_release.go b/src/jetstream/plugins/kubernetes/get_release.go index bd09da963d..d072870557 100644 --- a/src/jetstream/plugins/kubernetes/get_release.go +++ b/src/jetstream/plugins/kubernetes/get_release.go @@ -142,6 +142,8 @@ func (c *KubernetesSpecification) GetReleaseStatus(ec echo.Context) error { graph.ParseManifest(rel) sendResource(ws, "Graph", graph) + sendResource(ws, "ManifestErrors", rel.ManifestErrors) + stopchan := make(chan bool) go readLoop(ws, stopchan) diff --git a/src/jetstream/plugins/kubernetes/helm/release.go b/src/jetstream/plugins/kubernetes/helm/release.go index 9c15554514..f8fd9c3131 100644 --- a/src/jetstream/plugins/kubernetes/helm/release.go +++ b/src/jetstream/plugins/kubernetes/helm/release.go @@ -32,11 +32,12 @@ var resourcesWithoutStatus = map[string]bool{ // HelmRelease represents a Helm Release deployed via Helm type HelmRelease struct { *release.Release - Endpoint string `json:"-"` - User string `json:"-"` - Resources map[string]KubeResource `json:"resources"` - Jobs []KubeResourceJob `json:"-"` - PodJobs map[string]KubeResourceJob `json:"-"` + Endpoint string `json:"-"` + User string `json:"-"` + Resources map[string]KubeResource `json:"resources"` + Jobs []KubeResourceJob `json:"-"` + PodJobs map[string]KubeResourceJob `json:"-"` + ManifestErrors bool `json:"-"` } // KubeResource is a simple struct to pull out core common metadata for a Kube resource @@ -69,6 +70,7 @@ func NewHelmRelease(info *release.Release, endpoint, user string) *HelmRelease { // Parse the release manifest from the Helm release func (r *HelmRelease) parseManifest() { + r.ManifestErrors = false reader := bytes.NewReader([]byte(r.Manifest)) buffer := bufio.NewReader(reader) var bufr strings.Builder @@ -81,6 +83,7 @@ func (r *HelmRelease) parseManifest() { obj, _, err := decode([]byte(bufr.String()), nil, nil) if err != nil { log.Error(fmt.Sprintf("Helm Manifest Parser: Error while decoding YAML object. Err was: %s", err)) + r.ManifestErrors = true } else { r.processResource(obj) }