controller-runtime icon indicating copy to clipboard operation
controller-runtime copied to clipboard

flag redefined: kubeconfig: allow double vendoring this library but still register flags on behalf of users

Open akoserwal opened this issue 5 years ago • 17 comments

Error:

 /var/folders/3d/_kgky9bj61g5144z004y51qr0000gp/T/go-build652443801/b001/e2e.test flag redefined: kubeconfig
panic: /var/folders/3d/_kgky9bj61g5144z004y51qr0000gp/T/go-build652443801/b001/e2e.test flag redefined: kubeconfig

goroutine 1 [running]:
flag.(*FlagSet).Var(0xc0000d2120, 0x244c6a0, 0xc00004e250, 0x224908b, 0xa, 0x225fced, 0x12)
    /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:848 +0x4ae
flag.(*FlagSet).StringVar(...)
    /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:751
github.com/operator-framework/operator-sdk/pkg/test.(*frameworkOpts).addToFlagSet(0xc00004e240, 0xc0000d2120)
    /Users/akoserwa/go/pkg/mod/github.com/operator-framework/[email protected]/pkg/test/framework.go:102 +0x1bf
github.com/operator-framework/operator-sdk/pkg/test.MainEntry(0xc00040d280)
    /Users/akoserwa/go/pkg/mod/github.com/operator-framework/[email protected]/pkg/test/main_entry.go:27 +0x50
github.com/atlasmap/atlasmap-operator/test/e2e.TestMain(...)
       _testmain.go:42 +0x136

Using :-

framework “github.com/operator-framework/operator-sdk/pkg/test” where it is setting
> flagset.StringVar(&opts.kubeconfigPath, KubeConfigFlag, “”, “path to kubeconfig”)

And in my test case, I am using a library which is also using controller-runtime/operator-sdk github.com/RHsyseng/operator-utils/pkg/utils/openshift

 Method I am calling: openshift.IsOpenShift(framework.KubeConfig)

controller-runtime/pkg/client/config/config.go

// TODO: Fix this to allow double vendoring this library but still register flags on behalf of users
  flag.StringVar(&kubeconfig, “kubeconfig”, “”,
    “Paths to a kubeconfig. Only required if out-of-cluster.“)

I suspect fixing TODO will resolve it? If yes, I would like to work on it.

akoserwal avatar Mar 26 '20 16:03 akoserwal

/cc @DirectXMan12

mengqiy avatar Mar 26 '20 18:03 mengqiy

So, due to some legacy cruft, controller-runtime expects to be the thing that registers that flag. We probably shouldn't but that's a pretty serious breaking change that I don't think we want to make just yet.

cc @shawn-hurley @camilamacedo86 @joelanford @estroz any of you have insight into what the operatorsdk package is doing that it's re-registering that flag?

DirectXMan12 avatar Mar 26 '20 19:03 DirectXMan12

/assign @camilamacedo86

to answer or triage elsewhere.

DirectXMan12 avatar Mar 26 '20 19:03 DirectXMan12

The SDK's test framework uses some client-go APIs directly and requires the kubeconfig's namespace, so it needs the kubeconfig path. While the framework could/should be refactored to use pure controller-runtime, which would allow the framework to delegate registering this flag to controller-runtime, we can ~use a local flagset in the mean time~ retrieve the value using a lookup.

PR: https://github.com/operator-framework/operator-sdk/pull/2731

@akoserwal can you test my branch out to make sure it fixes your issue?

estroz avatar Mar 27 '20 05:03 estroz

@estroz: Getting error:

flag provided but not defined: -singleNamespace
Usage of /var/folders/3d/_kgky9bj61g5144z004y51qr0000gp/T/go-build683683410/b001/e2e.test:
  -globalMan string
        path to operator manifest
  -kubeconfig string
        Paths to a kubeconfig. Only required if out-of-cluster.
  -localOperator
        enable if operator is running locally (not in cluster)
  -localOperatorArgs string
        flags that the operator needs (while using --up-local). example: "--flag1 value1 --flag2=value2"
  -master --kubeconfig

private variable: singleNamespaceMode bool

akoserwal avatar Mar 27 '20 11:03 akoserwal

Hi @estroz,

Since you are working on it already. /assign @estroz

camilamacedo86 avatar Mar 27 '20 11:03 camilamacedo86

@akoserwal try out SDK's master.

estroz avatar Mar 31 '20 21:03 estroz

Issues go stale after 90d of inactivity. Mark the issue as fresh with /remove-lifecycle stale. Stale issues rot after an additional 30d of inactivity and eventually close.

If this issue is safe to close now please do so with /close.

Send feedback to sig-testing, kubernetes/test-infra and/or fejta. /lifecycle stale

fejta-bot avatar Jun 29 '20 22:06 fejta-bot

For future reference, this is the lookup workaround mentioned by @estroz :

kubeconfig := flag.Lookup("kubeconfig").Value.String()

lrascao avatar Dec 28 '21 17:12 lrascao

For future reference, this is the lookup workaround mentioned by @estroz :

kubeconfig := flag.Lookup("kubeconfig").Value.String()

Thank you!

mvleandro avatar Jun 27 '23 19:06 mvleandro

/reopen

It's been a bit. This is still super annoying for basically anyone who happens to import any part of controller-runtime. Mutating global state in an init() in a library is fairly unpleasant - made worse by the fact that Go will only complain the second time the flag is registered, and because of init() ordering, controller-runtime is always the first one, so finding what just side-effect registered --kubeconfig is impossible.

I'd really suggest another look at this. If this were defined in some runtime code or in code that's unlikely to be imported unless by someone actually using controller-runtime, perhaps it would be less frustrating. In my case, I imported an API module that happened to use the controller-runtime Scheme builder. Really divorced from any runtime considerations.

A workaround for now is to re-set flag.CommandLine in my own init().

cc @joelanford @vincepri @alvaroaleman

stevekuznetsov avatar Jan 18 '24 15:01 stevekuznetsov

@stevekuznetsov: Reopened this issue.

In response to this:

/reopen

It's been a bit. This is still super annoying for basically anyone who happens to import any part of controller-runtime. Mutating global state in an init() in a library is fairly unpleasant - made worse by the fact that Go will only complain the second time the flag is registered, and because of init() ordering, controller-runtime is always the first one, so finding what just side-effect registered --kubeconfig is impossible.

I'd really suggest another look at this. If this were defined in some runtime code or in code that's unlikely to be imported unless by someone actually using controller-runtime, perhaps it would be less frustrating. In my case, I imported an API module that happened to use the controller-runtime Scheme builder. Really divorced from any runtime considerations.

A workaround for now is to re-set flag.CommandLine in my own init().

cc @joelanford @vincepri @alvaroaleman

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/test-infra repository.

k8s-ci-robot avatar Jan 18 '24 15:01 k8s-ci-robot

The Kubernetes project currently lacks enough active contributors to adequately respond to all issues.

This bot triages un-triaged issues according to the following rules:

  • After 90d of inactivity, lifecycle/stale is applied
  • After 30d of inactivity since lifecycle/stale was applied, lifecycle/rotten is applied
  • After 30d of inactivity since lifecycle/rotten was applied, the issue is closed

You can:

  • Mark this issue as fresh with /remove-lifecycle rotten
  • Close this issue with /close
  • Offer to help out with Issue Triage

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle rotten

k8s-triage-robot avatar Feb 17 '24 15:02 k8s-triage-robot

The Kubernetes project currently lacks enough active contributors to adequately respond to all issues and PRs.

This bot triages issues according to the following rules:

  • After 90d of inactivity, lifecycle/stale is applied
  • After 30d of inactivity since lifecycle/stale was applied, lifecycle/rotten is applied
  • After 30d of inactivity since lifecycle/rotten was applied, the issue is closed

You can:

  • Reopen this issue with /reopen
  • Mark this issue as fresh with /remove-lifecycle rotten
  • Offer to help out with Issue Triage

Please send feedback to sig-contributor-experience at kubernetes/community.

/close not-planned

k8s-triage-robot avatar Mar 18 '24 16:03 k8s-triage-robot

@k8s-triage-robot: Closing this issue, marking it as "Not Planned".

In response to this:

The Kubernetes project currently lacks enough active contributors to adequately respond to all issues and PRs.

This bot triages issues according to the following rules:

  • After 90d of inactivity, lifecycle/stale is applied
  • After 30d of inactivity since lifecycle/stale was applied, lifecycle/rotten is applied
  • After 30d of inactivity since lifecycle/rotten was applied, the issue is closed

You can:

  • Reopen this issue with /reopen
  • Mark this issue as fresh with /remove-lifecycle rotten
  • Offer to help out with Issue Triage

Please send feedback to sig-contributor-experience at kubernetes/community.

/close not-planned

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/test-infra repository.

k8s-ci-robot avatar Mar 18 '24 16:03 k8s-ci-robot

/label lifecycle/frozen

joelanford avatar Mar 21 '24 02:03 joelanford

@joelanford: The label(s) /label lifecycle/frozen cannot be applied. These labels are supported: api-review, tide/merge-method-merge, tide/merge-method-rebase, tide/merge-method-squash, team/katacoda, refactor. Is this label configured under labels -> additional_labels or labels -> restricted_labels in plugin.yaml?

In response to this:

/label lifecycle/frozen

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/test-infra repository.

k8s-ci-robot avatar Mar 21 '24 02:03 k8s-ci-robot