Skip to content

Commit

Permalink
More logs
Browse files Browse the repository at this point in the history
  • Loading branch information
jbiers committed Feb 1, 2025
1 parent 3933d0e commit 0a1899c
Showing 1 changed file with 42 additions and 10 deletions.
52 changes: 42 additions & 10 deletions internal/helm-project-operator/controllers/project/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func Register(
projectGetter namespace.ProjectGetter,
) {

logrus.Debugf("running apply inside Project Controller register")
apply = apply.
// Why do we need the release name?
// To ensure that we don't override the set created by another instance of the Project Operator
Expand Down Expand Up @@ -105,6 +106,7 @@ func Register(
projectGetter: projectGetter,
}

logrus.Debugf("Initing indexers inside Project Controller register")
h.initIndexers()

h.initResolvers(ctx)
Expand Down Expand Up @@ -158,36 +160,44 @@ func (h *handler) shouldManage(projectHelmChart *v1alpha2.ProjectHelmChart) bool
//
// Note: we know that this error would only happen if the namespace is not found since the only valid error returned from this
// call is errors.NewNotFound(c.resource, name)
logrus.Infof("ProjectHelmChart %s/%s has invalid namespace. It will not be managed by this controller.", projectHelmChart.Name, projectHelmChart.Namespace)
return false
}
isProjectRegistrationNamespace := h.projectGetter.IsProjectRegistrationNamespace(namespace)
if !isProjectRegistrationNamespace {
// only watching resources in registered namespaces
logrus.Infof("ProjectHelmChart %s/%s does not live in a project registration namespace. It will not be managed by this controller.", projectHelmChart.Name, projectHelmChart.Namespace)
return false
}
if projectHelmChart.Spec.HelmAPIVersion != h.opts.HelmAPIVersion {
// only watch resources with the HelmAPIVersion this controller was configured with
logrus.Infof("ProjectHelmChart %s/%s has HelmAPIVersion %s. This controller will only manager resources with helmAPIVersion %s.", projectHelmChart.Name, projectHelmChart.Namespace, projectHelmChart.Spec.HelmAPIVersion, h.opts.HelmAPIVersion)
return false
}
return true
}

func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectHelmChartStatus v1alpha2.ProjectHelmChartStatus) ([]runtime.Object, v1alpha2.ProjectHelmChartStatus, error) {
logrus.Infof("Handling ProjectHelmChart %s/%s.", projectHelmChart.Name, projectHelmChart.Namespace)

var objs []runtime.Object

// initial checks to see if we should handle this
shouldManage := h.shouldManage(projectHelmChart)
if !shouldManage {
logrus.Infof("Cancelled handling of ProjectHelmChart %s/%s. shouldManage returned 'false'.", projectHelmChart.Name, projectHelmChart.Namespace)
return nil, projectHelmChartStatus, nil
}
if projectHelmChart.DeletionTimestamp != nil {
logrus.Infof("Cancelled handling of ProjectHelmChart %s/%s. CR has been deleted.", projectHelmChart.Name, projectHelmChart.Namespace)
return nil, projectHelmChartStatus, nil
}

// handle charts with cleanup label
if common2.HasCleanupLabel(projectHelmChart) {
projectHelmChartStatus = h.getCleanupStatus(projectHelmChart, projectHelmChartStatus)
logrus.Infof("Cleaning up HelmChart and HelmRelease for ProjectHelmChart %s/%s", projectHelmChart.Namespace, projectHelmChart.Name)
logrus.Infof("ProjectHelmChart %s/%s has cleanup label set to 'true'. %s", projectHelmChart.Name, projectHelmChart.Namespace, projectHelmChartStatus.StatusMessage)
logrus.Infof("Cleaning up HelmChart and HelmRelease for ProjectHelmChart %s/%s.", projectHelmChart.Namespace, projectHelmChart.Name)
return nil, projectHelmChartStatus, nil
}

Expand All @@ -197,11 +207,14 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
return nil, projectHelmChartStatus, err
}
releaseNamespace, releaseName := h.getReleaseNamespaceAndName(projectHelmChart)
logrus.Infof("ProjectHelmChart %s/%s has project release namespace set to %s and HelmRelease named %s.", projectHelmChart.Name, projectHelmChart.Namespace, releaseNamespace, releaseName)

// check if the releaseName is already tracked by another ProjectHelmChart
projectHelmCharts, err := h.projectHelmChartCache.GetByIndex(ProjectHelmChartByReleaseName, releaseName)
if err != nil {
return nil, projectHelmChartStatus, fmt.Errorf("unable to get ProjectHelmCharts to verify if release is already tracked: %s", err)
err = fmt.Errorf("unable to get ProjectHelmCharts to verify if release is already tracked: %s", err)
logrus.Warnf("%v", err)
return nil, projectHelmChartStatus, err
}
for _, conflictingProjectHelmChart := range projectHelmCharts {
if conflictingProjectHelmChart == nil {
Expand All @@ -221,10 +234,12 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
}
// we have found another ProjectHelmChart that already exists and is tracking this release with some non-conflicting status
err = fmt.Errorf(
"ProjectHelmChart %s/%s already tracks release %s/%s",
conflictingProjectHelmChart.Namespace, conflictingProjectHelmChart.Name,
"unable to create HelmRelease for ProjectHelmChart %s/%s. ProjectHelmChart %s/%s already tracks release %s/%s",
projectHelmChart.Name, projectHelmChart.Namespace,
conflictingProjectHelmChart.Name, conflictingProjectHelmChart.Namespace,
releaseName, releaseNamespace,
)
logrus.Warnf("%v", err)
projectHelmChartStatus = h.getUnableToCreateHelmReleaseStatus(projectHelmChart, projectHelmChartStatus, err)
return nil, projectHelmChartStatus, nil
}
Expand All @@ -237,23 +252,27 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
// gather target project namespaces
targetProjectNamespaces, err := h.projectGetter.GetTargetProjectNamespaces(projectHelmChart)
if err != nil {
return nil, projectHelmChartStatus, fmt.Errorf("unable to find project namespaces to deploy ProjectHelmChart: %s", err)
err = fmt.Errorf("Unable to find target project namespaces to deploy ProjectHelmChart %s/%s: %s", projectHelmChart.Name, projectHelmChart.Namespace, err)
logrus.Warnf("%v", err)
return nil, projectHelmChartStatus, err
}
if len(targetProjectNamespaces) == 0 {
projectReleaseNamespace := h.getProjectReleaseNamespace(projectID, true, projectHelmChart)
if projectReleaseNamespace != nil {
objs = append(objs, projectReleaseNamespace)
logrus.Infof("")
}
projectHelmChartStatus = h.getNoTargetNamespacesStatus(projectHelmChart, projectHelmChartStatus)
logrus.Infof("ProjectHelmChart %s/%s has no target project namespaces. Setting its status to %s.", projectHelmChart.Name, projectHelmChart.Namespace, projectHelmChartStatus.Status)
return objs, projectHelmChartStatus, nil
}

if releaseNamespace != h.systemNamespace && releaseNamespace != projectHelmChart.Namespace {
// need to add release namespace to list of objects to be created
projectReleaseNamespace := h.getProjectReleaseNamespace(projectID, false, projectHelmChart)
objs = append(objs, projectReleaseNamespace)
// need to add auto-generated release namespace to target namespaces
targetProjectNamespaces = append(targetProjectNamespaces, releaseNamespace)
logrus.Infof("Adding auto-generated release namespace %s to list of target namespaces for ProjectHelmChart %s/%s.", releaseNamespace, projectHelmChart.Name, projectHelmChart.Namespace)
}
projectHelmChartStatus.TargetNamespaces = targetProjectNamespaces

Expand All @@ -262,6 +281,7 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
valuesContentBytes, err := values.ToYAML()
if err != nil {
err = fmt.Errorf("unable to marshall spec.values: %s", err)
logrus.Warnf("%v", err)
projectHelmChartStatus = h.getValuesParseErrorStatus(projectHelmChart, projectHelmChartStatus, err)
return nil, projectHelmChartStatus, nil
}
Expand All @@ -277,6 +297,7 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
// the newly created namespace. Without this, a deleted release namespace will always have ProjectHelmCharts stuck in
// WaitingForDashboardValues since the underlying helm release will never be recreated
err = fmt.Errorf("cannot find release namespace %s to deploy release", releaseNamespace)
logrus.Warnf("%v", err)
projectHelmChartStatus = h.getUnableToCreateHelmReleaseStatus(projectHelmChart, projectHelmChartStatus, err)
return objs, projectHelmChartStatus, nil
} else if err != nil {
Expand All @@ -286,11 +307,13 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
// get rolebindings that need to be created in release namespace
k8sRolesToRoleRefs, err := h.getSubjectRoleToRoleRefsFromRoles(projectHelmChart)
if err != nil {
return nil, projectHelmChartStatus, fmt.Errorf("unable to get release roles from project release namespace %s for %s/%s: %s", releaseNamespace, projectHelmChart.Namespace, projectHelmChart.Name, err)
err = fmt.Errorf("unable to get release roles from project release namespace %s for %s/%s: %s", releaseNamespace, projectHelmChart.Name, projectHelmChart.Namespace, err)
return nil, projectHelmChartStatus, err
}
k8sRolesToSubjects, err := h.getSubjectRoleToSubjectsFromBindings(projectHelmChart)
if err != nil {
return nil, projectHelmChartStatus, fmt.Errorf("unable to get rolebindings to default project operator roles from project registration namespace %s for %s/%s: %s", projectHelmChart.Namespace, projectHelmChart.Namespace, projectHelmChart.Name, err)
err = fmt.Errorf("unable to get rolebindings to default project operator roles from project registration namespace %s for %s/%s: %s", projectHelmChart.Namespace, projectHelmChart.Name, projectHelmChart.Namespace, err)
return nil, projectHelmChartStatus, err
}
objs = append(objs,
h.getRoleBindings(projectID, k8sRolesToRoleRefs, k8sRolesToSubjects, projectHelmChart)...,
Expand All @@ -305,10 +328,13 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
// get dashboard values if available
dashboardValues, err := h.getDashboardValuesFromConfigmaps(projectHelmChart)
if err != nil {
return nil, projectHelmChartStatus, fmt.Errorf("unable to get dashboard values from status ConfigMaps: %s", err)
err = fmt.Errorf("unable to get dashboard values from status ConfigMaps: %s", err)
logrus.Warnf("%v", err)
return nil, projectHelmChartStatus, err
}
if len(dashboardValues) == 0 {
projectHelmChartStatus = h.getWaitingForDashboardValuesStatus(projectHelmChart, projectHelmChartStatus)
logrus.Infof("Dashboard values returned with length 0. Setting %s/%s to have status %s", projectHelmChart.Name, projectHelmChart.Namespace, projectHelmChartStatus.Status)
} else {
projectHelmChartStatus.DashboardValues = dashboardValues
projectHelmChartStatus = h.getDeployedStatus(projectHelmChart, projectHelmChartStatus)
Expand All @@ -317,13 +343,17 @@ func (h *handler) OnChange(projectHelmChart *v1alpha2.ProjectHelmChart, projectH
}

func (h *handler) OnRemove(_ string, projectHelmChart *v1alpha2.ProjectHelmChart) (*v1alpha2.ProjectHelmChart, error) {
logrus.Infof("Handling ProjectHelmChart %s/%s removal.", projectHelmChart.Name, projectHelmChart.Namespace)

if projectHelmChart == nil {
logrus.Infof("ProjectHelmChart %s/%s is nil. Canceling removal.", projectHelmChart.Name, projectHelmChart.Namespace)
return nil, nil
}

// get information about the projectHelmChart
projectID, err := h.getProjectID(projectHelmChart)
if err != nil {
logrus.Warnf("Error getting projectID for projectHelmChart %s/%s: %v", projectHelmChart.Name, projectHelmChart.Namespace, err)
return projectHelmChart, err
}

Expand All @@ -341,7 +371,9 @@ func (h *handler) OnRemove(_ string, projectHelmChart *v1alpha2.ProjectHelmChart
// that will delete this projectReleaseNamespace on seeing it
err = h.apply.ApplyObjects(projectReleaseNamespace)
if err != nil {
return projectHelmChart, fmt.Errorf("unable to add orphaned annotation to project release namespace %s", projectReleaseNamespace.Name)
err = fmt.Errorf("unable to add orphaned annotation to project release namespace %s", projectReleaseNamespace.Name)
logrus.Warnf("%v", err)
return projectHelmChart, err
}
return projectHelmChart, nil
}

0 comments on commit 0a1899c

Please sign in to comment.