Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

components: move params.env image updating to Init stage #1191

Merged

Conversation

ykaliuta
Copy link
Contributor

@ykaliuta ykaliuta commented Aug 19, 2024

Jira: https://issues.redhat.com/browse/RHOAIENG-11592

Image names in environment are not supposed to be changed during
runtime of the operator, so it makes sense to update them only on
startup.

If manifests are overriden by DevFlags, the DevFlags' version will
be used.

The change is straight forward for most of the components where only
images are updated and params.env is located in the kustomize root
directory, but some components (dashboard, ray, codeflare,
modelregistry) also update some extra parameters. For them image
part only is moved to Init since other updates require runtime DSCI
information.

The patch also changes logic for ray, codeflare, and modelregistry
in this regard to update non-image parameters regardless of DevFlags
like it was changed in dashboard recently.

The DevFlags functionality brings some concerns:

  • For most components the code is written such a way that as soon as
    DevFlags supplied the global path variables are changed and never
    reverted back to the defaults. For some (dashboard, trustyai) there
    is (still global) OverridePath/entryPath pair and manifests reverted
    to the default, BUT there is no logic of transition.

  • codeflare: when manifests are overridden namespace param is
    updated in the hardcoded (stock) path;

This logic is preserved.

Description

How Has This Been Tested?

Screenshot or short clip

Merge criteria

  • You have read the contributors guide.
  • Commit messages are meaningful - have a clear and concise summary and detailed explanation of what was changed and why.
  • Pull Request contains a description of the solution, a link to the JIRA issue, and to any dependent or related Pull Request.
  • Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
  • The developer has manually tested the changes and verified that the changes work

@zdtsw
Copy link
Member

zdtsw commented Aug 27, 2024

i am fine with this change, but would like to confirm one requirement first.

@ykaliuta
Copy link
Contributor Author

@bartoszmajsak may be you want to be aware of the proposal

@@ -311,6 +328,10 @@ func main() { //nolint:funlen,maintidx
setupLog.Error(err, "unable to set up ready check")
os.Exit(1)
}
if err := initComponents(platform); err != nil {
setupLog.Error(err, "unable to init components")
os.Exit(1)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should here be os.Exit(1)?
say any of the downstream component fails to set image, will cause operator crash?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. One one hand it makes problems obvious on startup. On it would make some of the system working even if dashboard tries to use wrong repo.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what i am afarid is
if compoent X fail to update, but user does not even want to enable component X but only Y and Z, should that make pod crash ?
in thoery , it should not even fail,
and in another theory if it was a glitch: the restart of pod , due to crash, can fix X in the next run.

Copy link
Contributor Author

@ykaliuta ykaliuta Sep 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If fatal init is not needed, implicit init() will work. UPD: missed platform parameter

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For non-fatal case I would like at least to log the error. Would it be ok to pass Context and use Bartosz' idea to wrap logger in it?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that sounds better, we will need to show the error, only part is i dont know if we should make it fatal.
@lburgazzoli / @VaishnaviHire how you feel about this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made it non-fatal, but on the per-Init level. Leaving possibility :)

@@ -39,6 +39,10 @@ type Component struct {
DevFlags *DevFlags `json:"devFlags,omitempty"`
}

func (c *Component) Init(_ cluster.Platform) error {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe rename to InitImage() if it is only for image not other extra params.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did hope it can be useful for other initializations as well. (but actually could no find any independent of reconcile loop)

components/codeflare/codeflare.go Show resolved Hide resolved
if err := deploy.ApplyParams(ParamsPath, imageParamMap, map[string]string{"namespace": dscispec.ApplicationsNamespace}); err != nil {
return fmt.Errorf("failed update image from %s : %w", CodeflarePath+"/bases", err)
}
if err := deploy.ApplyParams(ParamsPath, map[string]string{}, map[string]string{"namespace": dscispec.ApplicationsNamespace}); err != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if err := deploy.ApplyParams(ParamsPath, map[string]string{}, map[string]string{"namespace": dscispec.ApplicationsNamespace}); err != nil {
if err := deploy.ApplyParams(ParamsPath, nil, map[string]string{"namespace": dscispec.ApplicationsNamespace}); err != nil {

do not even need an empty map ? same for the ray one?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, leftover. (It's a bit counter intuitive that access nil map does not crash)

@zdtsw zdtsw requested review from lburgazzoli and removed request for ajaypratap003 and asanzgom September 11, 2024 10:26
@zdtsw
Copy link
Member

zdtsw commented Sep 11, 2024

FYI @csams

@ykaliuta ykaliuta force-pushed the init-components branch 2 times, most recently from b3d279f to 4898857 Compare September 12, 2024 11:54
@ykaliuta
Copy link
Contributor Author

/retest-required

@ykaliuta
Copy link
Contributor Author

/retest required

Copy link

openshift-ci bot commented Sep 12, 2024

@ykaliuta: The /retest command does not accept any targets.
The following commands are available to trigger required jobs:

  • /test ci-index
  • /test images
  • /test opendatahub-operator-e2e
  • /test opendatahub-operator-pr-image-mirror

Use /test all to run all jobs.

In response to this:

/retest required

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@ykaliuta
Copy link
Contributor Author

/retest-required

3 similar comments
@ykaliuta
Copy link
Contributor Author

/retest-required

@ykaliuta
Copy link
Contributor Author

/retest-required

@ykaliuta
Copy link
Contributor Author

/retest-required

@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

2 similar comments
@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

@ykaliuta
Copy link
Contributor Author

It passes locally if I disable training operator which fails to fetch image from docker.io.

@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

2 similar comments
@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

@zdtsw
Copy link
Member

zdtsw commented Sep 17, 2024

/test opendatahub-operator-e2e

@ykaliuta
Copy link
Contributor Author

/test opendatahub-operator-e2e

@ykaliuta ykaliuta force-pushed the init-components branch 2 times, most recently from f0302f4 to 095d4e6 Compare September 18, 2024 16:23
@ykaliuta
Copy link
Contributor Author

/retest-required

@ykaliuta
Copy link
Contributor Author

read logs more carefully and found my mistake

@ykaliuta
Copy link
Contributor Author

/onhold

wait for #1264

@adelton
Copy link

adelton commented Oct 2, 2024

/onhold

wait for #1264

With #1264 merged, and with some merge conflicts, could you rebase this so that the review can proceed?

@ykaliuta
Copy link
Contributor Author

ykaliuta commented Oct 2, 2024

/onhold
wait for #1264

With #1264 merged, and with some merge conflicts, could you rebase this so that the review can proceed?

There is a small delay with #1059 which creates context with setupLog to be reused here.

@ykaliuta ykaliuta force-pushed the init-components branch 2 times, most recently from 4ad3efe to dac4720 Compare October 2, 2024 08:38
@ykaliuta
Copy link
Contributor Author

ykaliuta commented Oct 2, 2024

/onhold
wait for #1264

With #1264 merged, and with some merge conflicts, could you rebase this so that the review can proceed?

There is a small delay with #1059 which creates context with setupLog to be reused here.

I rebased it. If it comes first, no problem.

Add Init() method to the Component interface and call it from main on
startup.

Will be used to move startup-time code from ReconcileComponent
(like adjusting params.env).

Signed-off-by: Yauheni Kaliuta <[email protected]>
Jira: https://issues.redhat.com/browse/RHOAIENG-11592

Image names in environment are not supposed to be changed during
runtime of the operator, so it makes sense to update them only on
startup.

If manifests are overriden by DevFlags, the DevFlags' version will
be used.

The change is straight forward for most of the components where only
images are updated and params.env is located in the kustomize root
directory, but some components (dashboard, ray, codeflare,
modelregistry) also update some extra parameters. For them image
part only is moved to Init since other updates require runtime DSCI
information.

The patch also changes logic for ray, codeflare, and modelregistry
in this regard to update non-image parameters regardless of DevFlags
like it was changed in dashboard recently.

The DevFlags functionality brings some concerns:

- For most components the code is written such a way that as soon as
DevFlags supplied the global path variables are changed and never
reverted back to the defaults. For some (dashboard, trustyai) there
is (still global) OverridePath/entryPath pair and manifests reverted
to the default, BUT there is no logic of transition.

- codeflare: when manifests are overridden namespace param is
updated in the hardcoded (stock) path;

This logic is preserved.

Signed-off-by: Yauheni Kaliuta <[email protected]>
Comment on lines +47 to +50
var imageParamMap = map[string]string{
"odh-notebook-controller-image": "RELATED_IMAGE_ODH_NOTEBOOK_CONTROLLER_IMAGE",
"odh-kf-notebook-controller-image": "RELATED_IMAGE_ODH_KF_NOTEBOOK_CONTROLLER_IMAGE",
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitty-gritty :
we could have build two maps here, and do the ApplyParams() call on each.
since there is a range loop, it can just run one value each time.

components/component.go Show resolved Hide resolved
@openshift-ci openshift-ci bot added the lgtm label Oct 3, 2024
Copy link

openshift-ci bot commented Oct 3, 2024

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: zdtsw

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved label Oct 3, 2024
@openshift-merge-bot openshift-merge-bot bot merged commit 73823da into opendatahub-io:incubation Oct 3, 2024
8 checks passed
VaishnaviHire added a commit that referenced this pull request Oct 9, 2024
* cluster_config: init cluster variables on startup (#1059)

* cluster_config: move type definitions to the beginning of the file

Just a bit more clarity

Signed-off-by: Yauheni Kaliuta <[email protected]>

* cluster_config: init cluster variables on startup

Cluster configuration is supposed to be the same during operator pod
lifetime. There is no point to detect it on every reconcile cycle
keeping in mind that it can causes many api requests.

Do the initialization on startup. Keep GetOperatorNamespace()
returning error since it defines some logic in the DSCInitialization
reconciler.

Automatically called init() won't work here due to need to check
error of the initialization.

Wrap logger into context and use it in the Init() like
controller-runtime does [1][2].

Save root context without the logger for mgr.Start since "setup"
logger does not fit normal manager's work.

Leave GetDomain() as is since it uses OpenshiftIngress configuration
which is created when DSCInitialization instantiated.

Log cluster configuration on success from Init, so remove platform
logging from main.

[1] https://github.com/kubernetes-sigs/controller-runtime/blob/38546806f2faf5973e3321a7bd5bb3afdbb5767d/pkg/internal/controller/controller.go#L297
[2] https://github.com/kubernetes-sigs/controller-runtime/blob/38546806f2faf5973e3321a7bd5bb3afdbb5767d/pkg/internal/controller/controller.go#L111

Signed-off-by: Yauheni Kaliuta <[email protected]>

* cluster: do not return error from GetRelease

GetRelease return values are defined at startup, the error checked
in main, so no point to return error anymore.

Signed-off-by: Yauheni Kaliuta <[email protected]>

---------

Signed-off-by: Yauheni Kaliuta <[email protected]>

* components: move params.env image updating to Init stage (#1191)

* components, main: add Component Init method

Add Init() method to the Component interface and call it from main on
startup.

Will be used to move startup-time code from ReconcileComponent
(like adjusting params.env).

Signed-off-by: Yauheni Kaliuta <[email protected]>

* components: move params.env image updating to Init stage

Jira: https://issues.redhat.com/browse/RHOAIENG-11592

Image names in environment are not supposed to be changed during
runtime of the operator, so it makes sense to update them only on
startup.

If manifests are overriden by DevFlags, the DevFlags' version will
be used.

The change is straight forward for most of the components where only
images are updated and params.env is located in the kustomize root
directory, but some components (dashboard, ray, codeflare,
modelregistry) also update some extra parameters. For them image
part only is moved to Init since other updates require runtime DSCI
information.

The patch also changes logic for ray, codeflare, and modelregistry
in this regard to update non-image parameters regardless of DevFlags
like it was changed in dashboard recently.

The DevFlags functionality brings some concerns:

- For most components the code is written such a way that as soon as
DevFlags supplied the global path variables are changed and never
reverted back to the defaults. For some (dashboard, trustyai) there
is (still global) OverridePath/entryPath pair and manifests reverted
to the default, BUT there is no logic of transition.

- codeflare: when manifests are overridden namespace param is
updated in the hardcoded (stock) path;

This logic is preserved.

Signed-off-by: Yauheni Kaliuta <[email protected]>

---------

Signed-off-by: Yauheni Kaliuta <[email protected]>

* update: remove webhook service from bundle (#1275)

- we do not need it in bundle, CSV auto generate one during installation
- if we install operator via OLM, webhook service still get used from config/webhook/service.yaml

Signed-off-by: Wen Zhou <[email protected]>

* update: add validation on application and monitoring namespace in DSCI (#1263)

Signed-off-by: Wen Zhou <[email protected]>

* logger: add zap command line switches (#1280)

Allow to tune preconfigured by --log-mode zap backend with standard
zap command line switches from controller-runtime (zap-devel,
zap-encoder, zap-log-level, zap-stacktrace-level,
zap-time-encoding)[1].

This brings flexibility in logger setup for development environments
first of all.

The patch does not change default logger setup and does not change
DSCI override functionality.

[1] https://sdk.operatorframework.io/docs/building-operators/golang/references/logging

Signed-off-by: Yauheni Kaliuta <[email protected]>

* Modify Unit Tests GitHub Actions workflow to get code coverage test reports (#1279)

* Create codecov.yml

* Added to run test coverage also on PRs

* Removing trailing ]

* Update .github/workflows/codecov.yml

Co-authored-by: Wen Zhou <[email protected]>

* Removed go mod install dependency

* Consolidated codecov workflow into unit tests workflow

---------

Co-authored-by: Wen Zhou <[email protected]>

* webhook: move initialization inside of the module (#1284)

Add webhook.Init() function and hide webhook setup inside of the
module. It will make it possible to replace Init with a NOP (no
operation) with conditional compilation for no-webhook build.

Signed-off-by: Yauheni Kaliuta <[email protected]>

* feat: pass platform from env variable or fall back to use old logic (#1252)

* feat: pass platform from env variables or fall back to use old logic

- introduce new env var ODH_PLATFORM_TYPE, value set during build time
  - if value not match, fall back to detect managed then self-managed
- introduce new env var OPERATOR_RELEASE_VERSION, value also set during build time
  - if value is empty, fall back to use old way from CSV to read version or use 0.0.0
- add support from makefile
  - use envstubst to replace version

Signed-off-by: Wen Zhou <[email protected]>

* update: remove release version in the change

Signed-off-by: Wen Zhou <[email protected]>

---------

Signed-off-by: Wen Zhou <[email protected]>

* fix: update release version in DSCI and DSC .status for upgrade case (#1287)

- DSCI: if current version is not matching, update it
- DSC: in both reconcile pass and fail case, update it

Signed-off-by: Wen Zhou <[email protected]>

* Update version to 2.19.0 (#1291)

Co-authored-by: VaishnaviHire <[email protected]>

---------

Signed-off-by: Yauheni Kaliuta <[email protected]>
Signed-off-by: Wen Zhou <[email protected]>
Co-authored-by: Yauheni Kaliuta <[email protected]>
Co-authored-by: Wen Zhou <[email protected]>
Co-authored-by: Adrián Sanz Gómiz <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: VaishnaviHire <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants