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

Multiple pool cypress test migration #7616

Conversation

GowthamShanmugam
Copy link
Contributor

Signed-off-by: Gowtham Shanmugasundaram gshanmug@localhost.localdomain

@openshift-ci-robot openshift-ci-robot added the component/ceph Related to ceph-storage-plugin label Dec 21, 2020
@openshift-ci-robot openshift-ci-robot added component/core Related to console core functionality needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Dec 21, 2020
@openshift-ci-robot
Copy link
Contributor

Hi @GowthamShanmugam. Thanks for your PR.

I'm waiting for a openshift member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

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.

@GowthamShanmugam GowthamShanmugam force-pushed the multiple_pool_cypress_test branch 2 times, most recently from 86e59ce to b70c2dc Compare December 21, 2020 21:46

// Check ceph cluster status
cy.exec(`oc get cephCluster -n ${NS} -o json`).then((res) => {
const cephValue = JSON.parse(res.stdout.toString());
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const cephValue = JSON.parse(res.stdout.toString());
const cephValue = JSON.parse(res.stdout);

I don't think if toSting() is required.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Comment on lines 37 to 38

// View create storage class form
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// View create storage class form

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

});

afterEach(() => {
checkErrors();
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
checkErrors();
cy.checkErrors();

If you do it this way you won't have to add an import statement.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

But cy dont have any function with name checkErrors

Copy link
Contributor

Choose a reason for hiding this comment

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

my bad it was previously a cypress command looks like it's no more.

});

it('Check for a new pool creation', () => {
if (cephStatus?.status?.phase === CLUSTER_STATUS.READY) {
Copy link
Contributor

Choose a reason for hiding this comment

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

How are we ending up with a state when Ceph Cluster isn't in Ready?

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 think this check is to handle to corner case, as storage cluster creation takes a longer time than usual and parallelly if someone tries to create the pool.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Anyway, cy.install() always make sure the cluster is in a ready state. So I remove this block.

Comment on lines 65 to 76
} else if (cephStatus?.status?.phase !== CLUSTER_STATUS.READY) {
// This block will execute only if cluster is not in ready state
cy.log('Trying to create a new pool when cluster is not in ready state');
storagePool.prepareStorageClassForm(provisioner);

// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "PROGRESS"));
// Close pool creation form
cy.byTestID(cancelAction).click();
};
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
} else if (cephStatus?.status?.phase !== CLUSTER_STATUS.READY) {
// This block will execute only if cluster is not in ready state
cy.log('Trying to create a new pool when cluster is not in ready state');
storagePool.prepareStorageClassForm(provisioner);
// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "PROGRESS"));
// Close pool creation form
cy.byTestID(cancelAction).click();
};
} else if (cephStatus?.status?.phase !== CLUSTER_STATUS.READY) {
// This block will execute only if cluster is not in ready state
cy.log('Trying to create a new pool when cluster is not in ready state');
storagePool.prepareStorageClassForm(provisioner);
// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "PROGRESS"));
// Close pool creation form
cy.byTestID(cancelAction).click();
};

I realize this is a part of the original tests. But I am not sure why we are doing this check? How can we enforce that Ceph CLuster is indeed in a Progressing state. Not knowing the exact state of the application can be a source of flakes. Tagging @a2batic to understand more about this test.

Comment on lines 82 to 38
it('Should throw an error if duplicate pool is created', () => {
cy.log('Try to creating a new pool with already existing name');
storagePool.prepareStorageClassForm(provisioner);
storagePool.create(poolName, replicaCount);

// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "POOL_DUPLICATED"));
// Close pool creation form
cy.byTestID(confirmAction).click();
});
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
it('Should throw an error if duplicate pool is created', () => {
cy.log('Try to creating a new pool with already existing name');
storagePool.prepareStorageClassForm(provisioner);
storagePool.create(poolName, replicaCount);
// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "POOL_DUPLICATED"));
// Close pool creation form
cy.byTestID(confirmAction).click();
});
it('Should throw an error if duplicate pool is created', () => {
cy.log('Try to creating a new pool with already existing name');
storagePool.prepareStorageClassForm(provisioner);
storagePool.create(poolName, replicaCount);
// Validations
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, "POOL_DUPLICATED"));
// Close pool creation form
cy.byTestID(confirmAction).click();
});

This too should be part of the same it block. As for this to work we need the previous it block to run.

Comment on lines 73 to 70
getPoolMessage: (poolName: string, status: string) => {
return poolMessage.get(status).replace('$PoolName', poolName);
},
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
getPoolMessage: (poolName: string, status: string) => {
return poolMessage.get(status).replace('$PoolName', poolName);
},
getPoolMessage: (poolName: string, status: string) => poolMessage.get(status).replace('$PoolName', poolName);

Comment on lines 4 to 13
export const createStorageClassButton: string = 'item-create';

// Create storage class from
export const provisionerDropdown: string = 'storage-class-provisioner-dropdown';
export const expandPvcCheckbox: string = 'expand-pvc-checkbox';
export const storagePoolDropdown: string = 'pool-dropdown-toggle';
export const createNewPoolButton: string = 'create-new-pool-button';

// Create new pool form
export const titleLabel: string = 'modal-title';
export const poolNameTextBox: string = 'new-pool-name-textbox';
export const replicaDropdown: string = 'replica-dropdown';
export const confirmAction: string = 'confirm-action';
export const cancelAction: string = 'modal-cancel-action';

// Pool status
export const emptyStateBody: string = 'empty-state-body';
Copy link
Contributor

Choose a reason for hiding this comment

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

Constants that are only referenced in one place, don't deserve to be declared as constants. We can directly use them inside the getters. The abstraction provided by storagePool object is good enough. We don't need to reference selectors from here if it's only done once.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Agreed but what if new test cases are written in the future for the same feature. It always better to write a loosely coupled code.

Copy link
Contributor

Choose a reason for hiding this comment

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

I agree with you, but I am not sure if we will have a use case for pool flows again. If it's required in other tests most of the time we will be creating pools via CLI as it's much easier( and less error-prone). Our constants folder is full of constants that are used in only one place. It'd be better if we refactor it into a constant later when we require it, as the chances of these being used again are quite slim.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Copy link
Contributor Author

Choose a reason for hiding this comment

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

removed constants which are all used in one place, please review

Comment on lines 23 to 31
export const poolMessage: Map<string, string> = new Map([
[
'PROGRESS',
'The creation of an OCS storage cluster is still in progress or have failed please try again after the storage cluster is ready to use.',
],
['POOL_START', 'Pool $PoolName creation in progress'],
['POOL_DUPLICATED', 'Pool "$PoolName" already exists'],
['POOL_CREATED', 'Pool $PoolName was successfully created'],
]);
Copy link
Contributor

Choose a reason for hiding this comment

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

I find the usage of Map a bit of an overkill here. We could just use the plain JavaScript object. As I can see the keys are plain strings. I also don't see the need of maintaining insertion order.

storagePool,
} from '../views/multiple-pool';

describe('Test ceph pool creation', () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
describe('Test ceph pool creation', () => {
describe('Test Ceph pool creation', () => {

@GowthamShanmugam GowthamShanmugam force-pushed the multiple_pool_cypress_test branch 2 times, most recently from f3a79a1 to ee58877 Compare December 22, 2020 20:52
@GowthamShanmugam
Copy link
Contributor Author

/retest

@openshift-ci-robot
Copy link
Contributor

@GowthamShanmugam: Cannot trigger testing until a trusted user reviews the PR and leaves an /ok-to-test message.

In response to this:

/retest

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.


describe('Test ceph pool creation', () => {

// Ceph status var
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// Ceph status var
// Ceph status

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

describe('Test ceph pool creation', () => {

// Ceph status var
let cephStatus:any;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
let cephStatus:any;
let cephStatus:string;

// Check ceph cluster status
cy.exec(`oc get cephCluster -n ${NS} -o json`).then((res) => {
const cephValue = JSON.parse(res.stdout.toString());
cephStatus = cephValue.items[0];
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
cephStatus = cephValue.items[0];
cephStatus = cephValue?.items?.[0];

// Pool var
const poolName: string = 'example.com';
const replicaCount: string = '2';
const provisioner: string = 'openshift-storage.rbd.csi.ceph.com';
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const provisioner: string = 'openshift-storage.rbd.csi.ceph.com';
const RBDProvisioner: string = 'openshift-storage.rbd.csi.ceph.com';

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

let cephStatus:any;

// Pool var
const poolName: string = 'example.com';
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const poolName: string = 'example.com';
const poolName: string = 'example-pool';

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

@GowthamShanmugam GowthamShanmugam force-pushed the multiple_pool_cypress_test branch 2 times, most recently from 6862fd2 to 267adbb Compare December 28, 2020 12:21
before(() => {
cy.login();
cy.visit('/');
// cy.install();
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// cy.install();
cy.install();

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah! ack

cy.byTestID(createNewPoolButton).click();
},
create: (poolName: string, replicaCount: string) => {
// Makesure the storage pool creation form is open
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// Makesure the storage pool creation form is open
// Make sure the storage pool creation form is open

// Select provisioner
cy.byTestID(provisionerDropdown)
.click()
.get(`a[id="${RBDProvisioner}-link"]`)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
.get(`a[id="${RBDProvisioner}-link"]`)
.get(`a#${RBDProvisioner}-link`)

You don't really need the a though.

const regex = new RegExp(`${poolDropdownItem.join('|')}`, 'g');
storagePool.validate(poolName, regex);

console.log('Verifying a pool created in backend or not');
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
console.log('Verifying a pool created in backend or not');
cy.log('Verifying a pool created in backend or not');


// Pool status
export const emptyStateBody: string = 'empty-state-body';
export const poolStatus: string = 'Ready';
Copy link
Contributor

Choose a reason for hiding this comment

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

The name of the variable doesn't truly reflect what it does. It would be better if it were an enum.

Suggested change
export const poolStatus: string = 'Ready';
export enum PoolStatus {
READY = 'Ready'
}

Comment on lines 49 to 51
delete: (poolName: string) => {
cy.exec(`oc delete CephBlockPool ${poolName} -n ${NS}`);
},
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
delete: (poolName: string) => {
cy.exec(`oc delete CephBlockPool ${poolName} -n ${NS}`);
},
delete: (poolName: string) => cy.exec(`oc delete CephBlockPool ${poolName} -n ${NS}`);

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

cy.byTestID('create-new-pool-button').click();
},
create: (poolName: string, replicaCount: string) => {
// Makesure the storage pool creation form is open
Copy link
Contributor

Choose a reason for hiding this comment

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

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Comment on lines 16 to 20
PROGRESS:
'The creation of an OCS storage cluster is still in progress or have failed please try again after the storage cluster is ready to use.',
POOL_START: 'Pool $PoolName creation in progress',
POOL_DUPLICATED: 'Pool "$PoolName" already exists',
POOL_CREATED: 'Pool $PoolName was successfully created',
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
PROGRESS:
'The creation of an OCS storage cluster is still in progress or have failed please try again after the storage cluster is ready to use.',
POOL_START: 'Pool $PoolName creation in progress',
POOL_DUPLICATED: 'Pool "$PoolName" already exists',
POOL_CREATED: 'Pool $PoolName was successfully created',
PROGRESS: () =>
'The creation of an OCS storage cluster is still in progress or have failed please try again after the storage cluster is ready to use.',
POOL_START: (poolname) => `Pool ${poolName} creation in progress`,
POOL_DUPLICATED: (poolName) => `Pool "${poolName}" already exists',
POOL_CREATED: (poolName) => `Pool ${poolName} was successfully created`,

Doing this should allow us to remove getPoolMessage.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

},
create: (poolName: string, replicaCount: string) => {
// Makesure the storage pool creation form is open
cy.byLegacyTestID('modal-title').contains('Create New Storage Pool');
Copy link
Contributor

Choose a reason for hiding this comment

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

https://github.com/openshift/console/blob/master/frontend/packages/integration-tests-cypress/views/modal.ts#L10

Suggested change
cy.byLegacyTestID('modal-title').contains('Create New Storage Pool');
modalTitleShouldContain('Create New Storage Pool');

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Comment on lines 42 to 45
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_START'));
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_CREATED'));
// Close pool creation form
cy.get(`#${confirmAction}`).click();
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_START'));
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_CREATED'));
// Close pool creation form
cy.get(`#${confirmAction}`).click();
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_START'));
storagePool.validate(emptyStateBody, storagePool.getPoolMessage(poolName, 'POOL_CREATED'));
// Close pool creation form
cy.get(`#${confirmAction}`).click();

storagePool.create should have this block as it's part of creating a pool.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

modal.submitShouldBeEnabled();

// Create new pool
cy.get('#confirm-action').click();
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Unable to use the submit method from modals. The storage class creation page and the pool creation model both have submit button.

Copy link
Contributor

Choose a reason for hiding this comment

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

If two elements are returned we could chain first or last and then get the required element.

@GowthamShanmugam
Copy link
Contributor Author

/retest

@openshift-ci-robot
Copy link
Contributor

@GowthamShanmugam: Cannot trigger testing until a trusted user reviews the PR and leaves an /ok-to-test message.

In response to this:

/retest

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.

@GowthamShanmugam
Copy link
Contributor Author

@cloudbehl @afreen23 @bipuladh all changes are done please review

@bipuladh
Copy link
Contributor

/ok-to-test

@openshift-ci-robot openshift-ci-robot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Jan 30, 2021
cy.byTestID(storagePoolDropdown).click();
const poolDropdownItem = [poolName, `Replica ${replicaCount} no compression`];
const regex = new RegExp(`${poolDropdownItem.join('|')}`, 'g');
storagePool.validate(poolName, regex);
Copy link
Contributor

Choose a reason for hiding this comment

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

dint know contains supported regex. nice!

Copy link
Contributor

@bipuladh bipuladh left a comment

Choose a reason for hiding this comment

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

Recently introduced change in console.


beforeEach(() => {
cy.visit('/');
cy.clickNavLink(['Storage', 'Storage Classes']);
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
cy.clickNavLink(['Storage', 'Storage Classes']);
cy.clickNavLink(['Storage', 'StorageClasses']);

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

@bipuladh
Copy link
Contributor

bipuladh commented Feb 1, 2021

Please run prettier on the changed files as well. (frontend test is failing as well)

@GowthamShanmugam
Copy link
Contributor Author

@bipuladh solved frontend test is failiers

Copy link
Contributor

@bipuladh bipuladh left a comment

Choose a reason for hiding this comment

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

/lgtm

@openshift-ci-robot openshift-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 2, 2021
Copy link
Contributor

@bipuladh bipuladh left a comment

Choose a reason for hiding this comment

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

/lgtm cancel

});

after(() => {
storagePool.delete(poolName);
Copy link
Contributor

Choose a reason for hiding this comment

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

I think we should make this part of the it block as creation is part of it already.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

// Select provisioner
cy.byTestID('storage-class-provisioner-dropdown')
.click()
.get('#openshift-storage\\.rbd\\.csi\\.ceph\\.com-link')
Copy link
Contributor

Choose a reason for hiding this comment

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

<a href="#" id="openshift-storage.rbd.csi.ceph.com-link" data-test="dropdown-menu-item-link" class="pf-c-dropdown__menu-item">openshift-storage.rbd.csi.ceph.com</a>
The element as rendered in the DOM
Perhaps something like
cy.byTestID('dropdown-menu-item-link').contains('openshift-storage.rbd.csi.ceph.com')

modal.submitShouldBeEnabled();

// Create new pool
cy.get('#confirm-action').click();
Copy link
Contributor

Choose a reason for hiding this comment

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

If two elements are returned we could chain first or last and then get the required element.

@openshift-ci-robot openshift-ci-robot removed the lgtm Indicates that a PR is ready to be merged. label Feb 2, 2021
Copy link
Contributor

@dtaylor113 dtaylor113 left a comment

Choose a reason for hiding this comment

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

/lgtm, just some small suggestions

cy.visit('/');
cy.clickNavLink(['Storage', 'StorageClasses']);
cy.byTestID('item-create').click();
});
Copy link
Contributor

Choose a reason for hiding this comment

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

Little confused why beforeEach is needed since there is only one test? Suggest moving this to top of single it test.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

.type(poolName);
cy.byTestID(replicaDropdown)
.click()
.byLegacyTestID(replicaCount)
Copy link
Contributor

@dtaylor113 dtaylor113 Feb 4, 2021

Choose a reason for hiding this comment

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

Please note that byLegacyTestID and byTestID are Parent Commands and not Child or Dual Commands, as such the chaining here (the cy.get in byLegacyTestID) will start from the root of the DOM, not from replicaDropdown.
So if there was another 'count' link outside of the replicaDropdown which could have, for example < ... data-test-id="3" /> it may be selected.

I've been meaning to convert these to Dual Commands, if your up for it, now would be a good time! :-)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ack

Soigned-off-by: gshanmug <gshanmug@redhat.com>
@GowthamShanmugam
Copy link
Contributor Author

@dtaylor113 Changes done, please review

@GowthamShanmugam
Copy link
Contributor Author

@spadgett Please review

@rawagner
Copy link
Contributor

rawagner commented Feb 5, 2021

/lgtm

@openshift-ci-robot openshift-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 5, 2021
@openshift-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: dtaylor113, GowthamShanmugam, rawagner

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-robot openshift-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 5, 2021
@openshift-merge-robot openshift-merge-robot merged commit c7d2b32 into openshift:master Feb 5, 2021
@spadgett spadgett added this to the v4.7 milestone Feb 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. component/ceph Related to ceph-storage-plugin component/core Related to console core functionality lgtm Indicates that a PR is ready to be merged. ok-to-test Indicates a non-member PR verified by an org member that is safe to test.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

8 participants