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
MULTIARCH-3882: Support PER solution for powervs platform via transit gateway #3277
MULTIARCH-3882: Support PER solution for powervs platform via transit gateway #3277
Conversation
@dharaneeshvrd: This pull request references MULTIARCH-3882 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set. In response to this:
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. |
✅ Deploy Preview for hypershift-docs ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
/retest-required |
/cc @mkumatag |
Can you please separate the vendor file changes into a separate commit? |
9fcb772
to
962131f
Compare
cmd/cluster/core/create.go
Outdated
VPCSubnet string | ||
Debug bool | ||
RecreateSecrets bool | ||
UsePER bool |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These fields are increasing, lets start adding comments for these fields to have better understanding
cmd/cluster/powervs/create.go
Outdated
@@ -50,6 +51,9 @@ func NewCreateCommand(opts *core.CreateOptions) *cobra.Command { | |||
cmd.Flags().Int32Var(&opts.PowerVSPlatform.Memory, "memory", opts.PowerVSPlatform.Memory, "Amount of memory allocated (in GB). Default is 32") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.Debug, "debug", opts.PowerVSPlatform.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.RecreateSecrets, "recreate-secrets", opts.PowerVSPlatform.RecreateSecrets, "Enabling this flag will recreate creds mentioned https://hypershift-docs.netlify.app/reference/api/#hypershift.openshift.io/v1alpha1.PowerVSPlatformSpec here. This is required when rerunning 'hypershift create cluster powervs' or 'hypershift create infra powervs' commands, since API key once created cannot be retrieved again. Please make sure that cluster name used is unique across different management clusters before using this flag") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-per", opts.PowerVSPlatform.UsePER, "Enabling this flag will utilize PER solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we change the name to power-edge-router
cmd/cluster/powervs/destroy.go
Outdated
@@ -39,12 +40,16 @@ func NewDestroyCommand(opts *core.DestroyOptions) *cobra.Command { | |||
cmd.Flags().StringVar(&opts.PowerVSPlatform.CloudInstanceID, "cloud-instance-id", "", "IBM Cloud PowerVS Service Instance ID. Use this flag to reuse an existing PowerVS Service Instance resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.PowerVSPlatform.CloudConnection, "cloud-connection", "", "Cloud Connection in given zone. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.Debug, "debug", opts.PowerVSPlatform.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-per", opts.PowerVSPlatform.UsePER, "Enabling this flag will utilize PER solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same comment as above
cmd/infra/powervs/create.go
Outdated
@@ -218,12 +228,16 @@ func NewCreateCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.OutputFile, "output-file", opts.OutputFile, "Path to file that will contain output information from infra resources (optional)") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.RecreateSecrets, "recreate-secrets", opts.RecreateSecrets, "Enabling this flag will recreate creds mentioned https://hypershift-docs.netlify.app/reference/api/#hypershift.openshift.io/v1alpha1.PowerVSPlatformSpec here. This is required when rerunning 'hypershift create cluster powervs' or 'hypershift create infra powervs' commands, since API key once created cannot be retrieved again. Please make sure that cluster name used is unique across different management clusters before using this flag") | |||
cmd.Flags().BoolVar(&opts.UsePER, "use-per", opts.UsePER, "Enabling this flag will utilize PER solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as above
cmd/infra/powervs/create.go
Outdated
if transitGateway != nil { | ||
infra.TransitGatewayID = *transitGateway.ID | ||
infra.Stats.TransitGatewayState.Status = *transitGateway.Status | ||
} else { | ||
return fmt.Errorf("unable to setup transit gateway") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if transitGateway != nil { | |
infra.TransitGatewayID = *transitGateway.ID | |
infra.Stats.TransitGatewayState.Status = *transitGateway.Status | |
} else { | |
return fmt.Errorf("unable to setup transit gateway") | |
} | |
if transitGateway == nil { | |
return fmt.Errorf("unable to setup transit gateway") | |
} | |
infra.TransitGatewayID = *transitGateway.ID | |
infra.Stats.TransitGatewayState.Status = *transitGateway.Status |
cmd/infra/powervs/create.go
Outdated
if err != nil && err.Error() != transitGatewayNotFound(transitGatewayName).Error() { | ||
return nil, fmt.Errorf("error validating existing transit gateway: %w", err) | ||
} | ||
if tg != nil && *tg.Status == "available" { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a scenario where tg is not nil and status is not in available
state then what happens? Ideally even a create call also should fail as tg already exists, then how do we handle that scenario?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, when validateTransitGatewayByName
returns transitGatewayNotFound error, tg would be nil, so before accessing *tg.status
, need to validate it's not nil. If its nil, will proceed to create a new transit gatway. So we need a nil check here. We will not attempt the create if its already exists.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what if tg is not null(transit gateway exist) and state is not available
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that's a possible case, now handled in validateTransitGatewayByName
func itself, when tg exists and it is not in available state will return transitGatewayUnavailableError
. Thanks for the catch
} | ||
if tg != nil && *tg.Status == "available" { | ||
log(options.InfraID).Info("Using existing transit gateway ...") | ||
return tg, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if available the does it mean that we also have connections as well? what if we just have the transit gateway but not the connections for vpc and powervs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am validating the vpc and powervs connections are attached to this tg and their status is ok in validateTransitGatewayByName
func. Then only I would return the tg obj. If tg is there and connections are not proper then I return transitGatewayConnectionError
.
cmd/infra/powervs/destroy.go
Outdated
@@ -99,6 +103,9 @@ func NewDestroyCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.CloudConnection, "cloud-connection", opts.CloudConnection, "IBM Cloud PowerVS Cloud Connection. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.CloudInstanceID, "cloud-instance-id", opts.CloudInstanceID, "IBM PowerVS Cloud Instance ID. Use this flag to reuse an existing PowerVS Cloud Instance resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will result in debug logs will be printed") | |||
cmd.Flags().BoolVar(&opts.UsePER, "use-per", opts.UsePER, "Enabling this flag will utilize PER solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as above
962131f
to
78b8731
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mkumatag
I have addressed your other comments too, please take a look!
cmd/infra/powervs/create.go
Outdated
if err != nil && err.Error() != transitGatewayNotFound(transitGatewayName).Error() { | ||
return nil, fmt.Errorf("error validating existing transit gateway: %w", err) | ||
} | ||
if tg != nil && *tg.Status == "available" { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, when validateTransitGatewayByName
returns transitGatewayNotFound error, tg would be nil, so before accessing *tg.status
, need to validate it's not nil. If its nil, will proceed to create a new transit gatway. So we need a nil check here. We will not attempt the create if its already exists.
} | ||
if tg != nil && *tg.Status == "available" { | ||
log(options.InfraID).Info("Using existing transit gateway ...") | ||
return tg, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am validating the vpc and powervs connections are attached to this tg and their status is ok in validateTransitGatewayByName
func. Then only I would return the tg obj. If tg is there and connections are not proper then I return transitGatewayConnectionError
.
78b8731
to
054ac22
Compare
CloudConnection string | ||
VPCRegion string | ||
VPC string | ||
VPCSubnet string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see this VPCSubnet
is missing, is this intentionally removed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, its unused, so removed it.
cmd/cluster/powervs/destroy.go
Outdated
@@ -39,12 +40,16 @@ func NewDestroyCommand(opts *core.DestroyOptions) *cobra.Command { | |||
cmd.Flags().StringVar(&opts.PowerVSPlatform.CloudInstanceID, "cloud-instance-id", "", "IBM Cloud PowerVS Service Instance ID. Use this flag to reuse an existing PowerVS Service Instance resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.PowerVSPlatform.CloudConnection, "cloud-connection", "", "Cloud Connection in given zone. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.Debug, "debug", opts.PowerVSPlatform.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-power-edge-router", opts.PowerVSPlatform.UsePER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-power-edge-router", opts.PowerVSPlatform.UsePER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") | |
cmd.Flags().BoolVar(&opts.PowerVSPlatform.PER, "power-edge-router", opts.PowerVSPlatform.PER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") |
cmd/cluster/powervs/create.go
Outdated
@@ -50,6 +51,9 @@ func NewCreateCommand(opts *core.CreateOptions) *cobra.Command { | |||
cmd.Flags().Int32Var(&opts.PowerVSPlatform.Memory, "memory", opts.PowerVSPlatform.Memory, "Amount of memory allocated (in GB). Default is 32") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.Debug, "debug", opts.PowerVSPlatform.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.RecreateSecrets, "recreate-secrets", opts.PowerVSPlatform.RecreateSecrets, "Enabling this flag will recreate creds mentioned https://hypershift-docs.netlify.app/reference/api/#hypershift.openshift.io/v1alpha1.PowerVSPlatformSpec here. This is required when rerunning 'hypershift create cluster powervs' or 'hypershift create infra powervs' commands, since API key once created cannot be retrieved again. Please make sure that cluster name used is unique across different management clusters before using this flag") | |||
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-power-edge-router", opts.PowerVSPlatform.UsePER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cmd.Flags().BoolVar(&opts.PowerVSPlatform.UsePER, "use-power-edge-router", opts.PowerVSPlatform.UsePER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") | |
cmd.Flags().BoolVar(&opts.PowerVSPlatform.PER, "power-edge-router", opts.PowerVSPlatform.PER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
cmd/infra/powervs/create.go
Outdated
@@ -218,12 +228,16 @@ func NewCreateCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.OutputFile, "output-file", opts.OutputFile, "Path to file that will contain output information from infra resources (optional)") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will print PowerVS API Request & Response logs") | |||
cmd.Flags().BoolVar(&opts.RecreateSecrets, "recreate-secrets", opts.RecreateSecrets, "Enabling this flag will recreate creds mentioned https://hypershift-docs.netlify.app/reference/api/#hypershift.openshift.io/v1alpha1.PowerVSPlatformSpec here. This is required when rerunning 'hypershift create cluster powervs' or 'hypershift create infra powervs' commands, since API key once created cannot be retrieved again. Please make sure that cluster name used is unique across different management clusters before using this flag") | |||
cmd.Flags().BoolVar(&opts.UsePER, "use-power-edge-router", opts.UsePER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cmd.Flags().BoolVar(&opts.UsePER, "use-power-edge-router", opts.UsePER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") | |
cmd.Flags().BoolVar(&opts.PER, "power-edge-router", opts.PER, "Enabling this flag will utilize Power Edge Router solution via transit gateway instead of cloud connection to create a connection between PowerVS and VPC") |
cmd/infra/powervs/create.go
Outdated
if err = infra.setupPowerVSCloudConnection(ctx, options, session, gtag); err != nil { | ||
return fmt.Errorf("error setup powervs cloud connection: %w", err) | ||
if options.UsePER { | ||
if err = infra.setupTransitGateway(ctx, options, gtag); err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if err = infra.setupTransitGateway(ctx, options, gtag); err != nil { | |
if err := infra.setupTransitGateway(ctx, options, gtag); err != nil { |
cmd/infra/powervs/create.go
Outdated
if err = infra.isCloudConnectionReady(ctx, options, session); err != nil { | ||
return fmt.Errorf("cloud connection is not up: %w", err) | ||
if !options.UsePER { | ||
if err = infra.isCloudConnectionReady(ctx, options, session); err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if err = infra.isCloudConnectionReady(ctx, options, session); err != nil { | |
if err := infra.isCloudConnectionReady(ctx, options, session); err != nil { |
cmd/infra/powervs/create.go
Outdated
infra.TransitGatewayID = *transitGateway.ID | ||
infra.Stats.TransitGatewayState.Status = *transitGateway.Status | ||
|
||
if err = attachTag(gtag, options.InfraID, transitGateway.Crn, fmt.Sprintf("%s-%s", infra.ID, transitGatewayNameSuffix)); err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if err = attachTag(gtag, options.InfraID, transitGateway.Crn, fmt.Sprintf("%s-%s", infra.ID, transitGatewayNameSuffix)); err != nil { | |
if err := attachTag(gtag, options.InfraID, transitGateway.Crn, fmt.Sprintf("%s-%s", infra.ID, transitGatewayNameSuffix)); err != nil { |
cmd/infra/powervs/create.go
Outdated
if err != nil && err.Error() != transitGatewayNotFound(transitGatewayName).Error() { | ||
return nil, fmt.Errorf("error validating existing transit gateway: %w", err) | ||
} | ||
if tg != nil && *tg.Status == "available" { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what if tg is not null(transit gateway exist) and state is not available
?
cmd/infra/powervs/destroy.go
Outdated
@@ -99,6 +103,9 @@ func NewDestroyCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.CloudConnection, "cloud-connection", opts.CloudConnection, "IBM Cloud PowerVS Cloud Connection. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.CloudInstanceID, "cloud-instance-id", opts.CloudInstanceID, "IBM PowerVS Cloud Instance ID. Use this flag to reuse an existing PowerVS Cloud Instance resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will result in debug logs will be printed") | |||
cmd.Flags().BoolVar(&opts.UsePER, "use-power-edge-router", opts.UsePER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cmd.Flags().BoolVar(&opts.UsePER, "use-power-edge-router", opts.UsePER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") | |
cmd.Flags().BoolVar(&opts.PER, "power-edge-router", opts.PER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") |
cmd/infra/powervs/validate.go
Outdated
return nil, transitGatewayNotFound(name) | ||
} | ||
|
||
if validateStatus { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you can have early return here in case if validateStatus
is set as false
d490bad
to
f5bfb3b
Compare
/retest-required |
1 similar comment
/retest-required |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/lgtm
/retest-required |
f5bfb3b
to
925c812
Compare
/retest-required |
1 similar comment
/retest-required |
/lgtm |
925c812
to
e558df6
Compare
cmd/infra/powervs/destroy.go
Outdated
@@ -99,6 +103,9 @@ func NewDestroyCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.CloudConnection, "cloud-connection", opts.CloudConnection, "IBM Cloud PowerVS Cloud Connection. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.CloudInstanceID, "cloud-instance-id", opts.CloudInstanceID, "IBM PowerVS Cloud Instance ID. Use this flag to reuse an existing PowerVS Cloud Instance resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will result in debug logs will be printed") | |||
cmd.Flags().BoolVar(&opts.PER, "power-edge-router", opts.PER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The description doesn't seem to make sense for the destroy command. Something like, "Enabling this flag ensures that the Power Edge router that was used to create the cluster is cleaned up."
@@ -99,6 +103,9 @@ func NewDestroyCommand() *cobra.Command { | |||
cmd.Flags().StringVar(&opts.CloudConnection, "cloud-connection", opts.CloudConnection, "IBM Cloud PowerVS Cloud Connection. Use this flag to reuse an existing Cloud Connection resource for cluster's infra") | |||
cmd.Flags().StringVar(&opts.CloudInstanceID, "cloud-instance-id", opts.CloudInstanceID, "IBM PowerVS Cloud Instance ID. Use this flag to reuse an existing PowerVS Cloud Instance resource for cluster's infra") | |||
cmd.Flags().BoolVar(&opts.Debug, "debug", opts.Debug, "Enabling this will result in debug logs will be printed") | |||
cmd.Flags().BoolVar(&opts.PER, "power-edge-router", opts.PER, "Enabling this flag will denotes that Power Edge Router solution is used while creating the cluster") | |||
cmd.Flags().StringVar(&opts.TransitGatewayLocation, "transit-gateway-location", opts.TransitGatewayLocation, "IBM Cloud Transit Gateway location") | |||
cmd.Flags().StringVar(&opts.TransitGateway, "transit-gateway", opts.TransitGateway, "IBM Cloud Transit Gateway. Use this flag to reuse an existing Transit Gateway resource for cluster's infra") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above, the wording should be different for the destroy command.
cmd/infra/powervs/destroy.go
Outdated
return err | ||
} | ||
|
||
if options.TransitGateway == "" { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: return early instead of enclosing a large block in the if
Some comments, otherwise lgtm |
e558df6
to
f1af507
Compare
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: csrwng, dharaneeshvrd, mkumatag 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 |
f1af507
to
9f567c2
Compare
/lgtm |
@dharaneeshvrd: all tests passed! Full PR test history. Your PR dashboard. 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. I understand the commands that are listed here. |
More about PER: https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-per
What this PR does / why we need it:
Which issue(s) this PR fixes (optional, use
fixes #<issue_number>(, fixes #<issue_number>, ...)
format, where issue_number might be a GitHub issue, or a Jira story:Fixes #
Checklist