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

Backport of chor: change cluster name param to have datacenter.name as default value into release/1.18.x #20652

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion ui/packages/consul-ui/app/components/hcp-nav-item/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ export default class HcpLinkItemComponent extends Component {

@action
onLinkToConsulCentral() {
this.hcpLinkModal.setResourceId(this.args.linkData?.resourceId);
this.hcpLinkModal.show();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export default class LinkToHcpBannerComponent extends Component {
}
@action
onClusterLink() {
this.hcpLinkModal.setResourceId(this.args.linkData?.resourceId);
this.hcpLinkModal.show();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
</Hds::Form::Radio::Group>
{{#if (and this.isReadOnlyAccessLevelSelected (can "read acls") (can "create tokens"))}}
<div class="link-to-hcp-modal__generate-token">
{{#if globalReadonlyPolicy.data}}
{{#if (and globalReadonlyPolicy globalReadonlyPolicy.data)}}
<p class="hds-typography-display-100 hds-font-weight-medium font-family-sans-display">
Generate a read-only ACL token now (preferred) or copy an existing token’s secret ID
</p>
Expand Down Expand Up @@ -97,7 +97,7 @@
@icon="external-link"
@iconPosition="trailing"
data-test-link-to-hcp-modal-next-button
@href={{hcp-authentication-link this.hcpLinkModal.resourceId this.accessLevel}}
@href={{hcp-authentication-link @dc this.accessLevel}}
/>
<Hds::Button type="button" @text="Cancel" @color="secondary"
data-test-link-to-hcp-modal-cancel-button
Expand Down
18 changes: 10 additions & 8 deletions ui/packages/consul-ui/app/components/link-to-hcp-modal/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ export default class LinkToHcpModalComponent extends Component {
isGeneratingToken = false;
AccessLevel = ACCESS_LEVEL;

constructor(args, owner) {
super(...arguments);
// it is needed for .lookup to not flakey in tests
this.hideModal = this.hcpLinkModal.hide.bind(this.hcpLinkModal);
}

get isReadOnlyAccessLevelSelected() {
return this.accessLevel === this.AccessLevel.GLOBALREADONLY;
}
Expand All @@ -35,10 +41,6 @@ export default class LinkToHcpModalComponent extends Component {
return this.token && this.token.length > 0;
}

deactivateModal = () => {
this.hcpLinkModal.hide();
};

onGenerateTokenClicked = (policy) => {
this.isGeneratingToken = true;
let token = this.tokenRepo.create({
Expand All @@ -53,12 +55,12 @@ export default class LinkToHcpModalComponent extends Component {
});
};

@action
onCancel() {
this.deactivateModal();
}
@action
onAccessModeChanged({ target }) {
this.accessLevel = target.value;
}
@action
deactivateModal() {
this.hideModal();
}
}
15 changes: 3 additions & 12 deletions ui/packages/consul-ui/app/helpers/hcp-authentication-link.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,19 @@ import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';

/**
* A resourceId Looks like:
* organization/b4432207-bb9c-438e-a160-b98923efa979/project/4b09958c-fa91-43ab-8029-eb28d8cee9d4/hashicorp.consul.global-network-manager.cluster/test-from-api
* organization/${organizationId}/project/${projectId}/hashicorp.consul.global-network-manager.cluster/${clusterName}
*
* A HCP URL looks like:
* https://portal.cloud.hashicorp.com/services/consul/clusters/self-managed/link-existing?cluster_name=test-from-api&cluster_version=1.18.0&cluster_access_mode=CONSUL_ACCESS_LEVEL_GLOBAL_READ_WRITE&redirect_url=localhost:8500/services
*/
export const HCP_PREFIX =
'https://portal.cloud.hashicorp.com/services/consul/clusters/self-managed/link-existing';
export default class hcpAuthenticationLink extends Helper {
@service('env') env;
compute([resourceId, accessMode], hash) {
compute([datacenterName, accessMode]) {
let url = new URL(HCP_PREFIX);
const clusterVersion = this.env.var('CONSUL_VERSION');

// if resourceId is empty, we still might want the user to get to the HCP sign-in page
if (resourceId) {
// Array looks like: ["organization", organizationId, "project", projectId, "hashicorp.consul.global-network-manager.cluster", "Cluster Id"]
const [, , , , , clusterName] = resourceId.split('/');
if (clusterName) {
url.searchParams.append('cluster_name', clusterName);
}
if (datacenterName) {
url.searchParams.append('cluster_name', datacenterName);
}

if (clusterVersion) {
Expand Down
6 changes: 1 addition & 5 deletions ui/packages/consul-ui/app/services/hcp-link-modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,12 @@ import { tracked } from '@glimmer/tracking';

export default class HcpLinkModalService extends Service {
@tracked isModalVisible = false;
@tracked resourceId = null;

show(hcpLinkData) {
show() {
this.isModalVisible = true;
}

hide() {
this.isModalVisible = false;
}
setResourceId(resourceId) {
this.resourceId = resourceId;
}
}
11 changes: 0 additions & 11 deletions ui/packages/consul-ui/tests/acceptance/link-to-hcp-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import { module, test } from 'qunit';
import { click, visit } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import HcpLinkModalService from 'consul-ui/services/hcp-link-modal';

const bannerSelector = '[data-test-link-to-hcp-banner]';
const linkToHcpSelector = '[data-test-link-to-hcp]';
Expand All @@ -15,20 +14,10 @@ const linkToHcpModalSelector = '[data-test-link-to-hcp-modal]';
const linkToHcpModalCancelButtonSelector = '[data-test-link-to-hcp-modal-cancel-button]';
module('Acceptance | link to hcp', function (hooks) {
setupApplicationTest(hooks);
const correctResourceId =
'organization/b4432207-bb9c-438e-a160-b98923efa979/project/4b09958c-fa91-43ab-8029-eb28d8cee9d4/hashicorp.consul.global-network-manager.cluster/test-from-api';

hooks.beforeEach(function () {
// clear local storage so we don't have any settings
window.localStorage.clear();
this.owner.register(
'service:hcp-link-modal',
class extends HcpLinkModalService {
setResourceId(resourceId) {
super.setResourceId(correctResourceId);
}
}
);
});

test('the banner and nav item are initially displayed on services page', async function (assert) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ const modalGenerateTokenMissedPolicyAlertSelector =
'[data-test-link-to-hcp-modal-missed-policy-alert]';
const modalNextButtonSelector = '[data-test-link-to-hcp-modal-next-button]';
const modalCancelButtonSelector = '[data-test-link-to-hcp-modal-cancel-button]';
const resourceId =
'organization/b4432207-bb9c-438e-a160-b98923efa979/project/4b09958c-fa91-43ab-8029-eb28d8cee9d4/hashicorp.consul.global-network-manager.cluster/test-from-api';

module('Integration | Component | link-to-hcp-modal', function (hooks) {
let originalClipboardWriteText;
Expand Down Expand Up @@ -71,7 +69,6 @@ module('Integration | Component | link-to-hcp-modal', function (hooks) {
this.owner.register(
'service:hcp-link-modal',
class Stub extends Service {
resourceId = resourceId;
hide = hideModal;
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,9 @@ import { setupRenderingTest } from 'ember-qunit';
import { HCP_PREFIX } from 'consul-ui/helpers/hcp-authentication-link';
import { EnvStub } from 'consul-ui/services/env';

// organization/b4432207-bb9c-438e-a160-b98923efa979/project/4b09958c-fa91-43ab-8029-eb28d8cee9d4/hashicorp.consul.global-network-manager.cluster/test-from-api
const clusterName = 'hello';
const clusterVersion = '1.18.0';
const accessMode = 'CONSUL_ACCESS_LEVEL_GLOBAL_READ_WRITE';
const projectId = '4b09958c-fa91-43ab-8029-eb28d8cee9d4';
const realResourceId = `organization/b4432207-bb9c-438e-a160-b98923efa979/project/${projectId}/hashicorp.consul.global-network-manager.cluster/${clusterName}`;
module('Integration | Helper | hcp-authentication-link', function (hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function () {
Expand All @@ -29,48 +26,31 @@ module('Integration | Helper | hcp-authentication-link', function (hooks) {
);
});
test('it makes a URL out of a real resourceId', async function (assert) {
this.resourceId = realResourceId;
this.dcName = clusterName;

await render(hbs`{{hcp-authentication-link resourceId}}`);
await render(hbs`{{hcp-authentication-link dcName}}`);

assert.equal(
this.element.textContent.trim(),
`${HCP_PREFIX}?cluster_name=${clusterName}&cluster_version=${clusterVersion}`
);
});

test('it returns correct link with invalid resourceId', async function (assert) {
this.resourceId = 'invalid';
test('it returns correct link without dc name', async function (assert) {
this.dcName = null;

await render(hbs`{{hcp-authentication-link resourceId}}`);
assert.equal(
this.element.textContent.trim(),
`${HCP_PREFIX}?cluster_version=${clusterVersion}`
);

// not enough items in id
this.resourceId =
'`organization/b4432207-bb9c-438e-a160-b98923efa979/project/${projectId}/hashicorp.consul.global-network-manager.cluster`';
await render(hbs`{{hcp-authentication-link resourceId}}`);
assert.equal(
this.element.textContent.trim(),
`${HCP_PREFIX}?cluster_version=${clusterVersion}`
);

// value is null
this.resourceId = null;
await render(hbs`{{hcp-authentication-link resourceId}}`);
await render(hbs`{{hcp-authentication-link dcName}}`);
assert.equal(
this.element.textContent.trim(),
`${HCP_PREFIX}?cluster_version=${clusterVersion}`
);
});

test('it makes a URL out of a real resourceId and accessLevel, if passed', async function (assert) {
this.resourceId = realResourceId;
test('it makes a URL out of a dc name and accessLevel, if passed', async function (assert) {
this.dcName = clusterName;
this.accessMode = accessMode;

await render(hbs`{{hcp-authentication-link resourceId accessMode}}`);
await render(hbs`{{hcp-authentication-link dcName accessMode}}`);

assert.equal(
this.element.textContent.trim(),
Expand Down
Loading