diff --git a/addons/core/translations/resources/en-us.yaml b/addons/core/translations/resources/en-us.yaml
index a73983759..59989c95e 100644
--- a/addons/core/translations/resources/en-us.yaml
+++ b/addons/core/translations/resources/en-us.yaml
@@ -374,7 +374,9 @@ target:
diagram:
client: Client
any-worker: Any worker
+ front-line-worker: Front line worker
egress-worker: Egress worker
+ ingress-worker: Ingress worker
host: Host
network: Private network
credential-store:
diff --git a/ui/admin/app/components/worker-diagram/dual-filter/index.hbs b/ui/admin/app/components/worker-diagram/dual-filter/index.hbs
new file mode 100644
index 000000000..2382fc68a
--- /dev/null
+++ b/ui/admin/app/components/worker-diagram/dual-filter/index.hbs
@@ -0,0 +1,67 @@
+
+ {{#if (and @egressFilter @ingressFilter)}}
+
+
+ {{t 'resources.target.workers.diagram.client'}}
+
+
+ {{t 'resources.target.workers.diagram.ingress-worker'}}
+
+
+
+ {{t 'resources.target.workers.diagram.egress-worker'}}
+
+
+ {{t 'resources.target.workers.diagram.host'}}
+
+
+
+ {{else if @ingressFilter}}
+
+
+ {{t 'resources.target.workers.diagram.client'}}
+
+
+ {{t 'resources.target.workers.diagram.ingress-worker'}}
+
+
+ {{t 'resources.target.workers.diagram.host'}}
+
+
+ {{else if @egressFilter}}
+
+
+ {{t 'resources.target.workers.diagram.client'}}
+
+
+ {{t 'resources.target.workers.diagram.front-line-worker'}}
+
+
+
+ {{t 'resources.target.workers.diagram.egress-worker'}}
+
+
+ {{t 'resources.target.workers.diagram.host'}}
+
+
+
+ {{else}}
+
+
+ {{t 'resources.target.workers.diagram.client'}}
+
+
+ {{t 'resources.target.workers.diagram.any-worker'}}
+
+
+ {{t 'resources.target.workers.diagram.host'}}
+
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/ui/admin/app/components/worker-diagram/index.hbs b/ui/admin/app/components/worker-diagram/index.hbs
index f2ed98083..166a39661 100644
--- a/ui/admin/app/components/worker-diagram/index.hbs
+++ b/ui/admin/app/components/worker-diagram/index.hbs
@@ -1 +1,6 @@
-{{yield (hash SingleFilter=(component 'worker-diagram/single-filter'))}}
\ No newline at end of file
+{{yield
+ (hash
+ SingleFilter=(component 'worker-diagram/single-filter')
+ DualFilter=(component 'worker-diagram/dual-filter')
+ )
+}}
\ No newline at end of file
diff --git a/ui/admin/config/environment.js b/ui/admin/config/environment.js
index 9cec2559a..132d64578 100644
--- a/ui/admin/config/environment.js
+++ b/ui/admin/config/environment.js
@@ -149,6 +149,7 @@ module.exports = function (environment) {
ENV.featureFlags['ssh-target'] = true;
ENV.featureFlags['vault-worker-filter'] = true;
ENV.featureFlags['target-worker-filters-v2'] = true;
+ ENV.featureFlags['target-worker-filters-v2-ingress'] = true;
ENV.featureFlags['target-network-address'] = true;
ENV.featureFlags['credential-library-vault-ssh-cert'] = true;
}
diff --git a/ui/admin/tests/integration/components/worker-diagram/dual-filter/index-test.js b/ui/admin/tests/integration/components/worker-diagram/dual-filter/index-test.js
new file mode 100644
index 000000000..1a802a0da
--- /dev/null
+++ b/ui/admin/tests/integration/components/worker-diagram/dual-filter/index-test.js
@@ -0,0 +1,79 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'admin/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+import { setupIntl } from 'ember-intl/test-support';
+
+module(
+ 'Integration | Component | worker-diagram/dual-filter',
+ function (hooks) {
+ setupRenderingTest(hooks);
+ setupIntl(hooks);
+
+ test('it renders the correct diagram when egressFilter is false and ingress is false', async function (assert) {
+ assert.expect(4);
+ await render(
+ hbs``
+ );
+
+ assert.dom('[data-test-dual-filter-egress-off-ingress-off]').isVisible();
+ assert
+ .dom('[data-test-dual-filter-egress-on-ingress-off]')
+ .doesNotExist();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-on]')
+ .doesNotExist();
+ assert.dom('[data-test-dual-filter-egress-on-ingress-on]').doesNotExist();
+ });
+
+ test('it renders the correct diagram when egressFilter is true and ingress is false', async function (assert) {
+ assert.expect(4);
+ await render(
+ hbs``
+ );
+
+ assert.dom('[data-test-dual-filter-egress-on-ingress-off]').isVisible();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-on]')
+ .doesNotExist();
+ assert.dom('[data-test-dual-filter-egress-on-ingress-on]').doesNotExist();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-off]')
+ .doesNotExist();
+ });
+
+ test('it renders the correct diagram when egressFilter is false and ingress is true', async function (assert) {
+ assert.expect(4);
+ await render(
+ hbs``
+ );
+
+ assert.dom('[data-test-dual-filter-egress-off-ingress-on]').isVisible();
+ assert
+ .dom('[data-test-dual-filter-egress-on-ingress-off]')
+ .doesNotExist();
+ assert.dom('[data-test-dual-filter-egress-on-ingress-on]').doesNotExist();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-off]')
+ .doesNotExist();
+ });
+
+ test('it renders the correct diagram when egressFilter is true and ingress is true', async function (assert) {
+ assert.expect(4);
+ await render(
+ hbs``
+ );
+
+ assert.dom('[data-test-dual-filter-egress-on-ingress-on]').isVisible();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-on]')
+ .doesNotExist();
+ assert
+ .dom('[data-test-dual-filter-egress-on-ingress-off]')
+ .doesNotExist();
+ assert
+ .dom('[data-test-dual-filter-egress-off-ingress-off]')
+ .doesNotExist();
+ });
+ }
+);
diff --git a/ui/admin/tests/integration/components/worker-diagram/index-test.js b/ui/admin/tests/integration/components/worker-diagram/index-test.js
index 50ebe4972..4942bb8b6 100644
--- a/ui/admin/tests/integration/components/worker-diagram/index-test.js
+++ b/ui/admin/tests/integration/components/worker-diagram/index-test.js
@@ -21,4 +21,14 @@ module('Integration | Component | worker-diagram/index', function (hooks) {
assert.dom('[data-test-single-filter-egress-off]').isVisible();
});
+
+ test('it renders a dual filter diagram', async function (assert) {
+ featuresService = this.owner.lookup('service:features');
+ featuresService.enable(targetWorkerFilterIngress);
+ featuresService.disable(targetWorkerFilterHCP);
+ assert.expect(1);
+ await render(hbs``);
+
+ assert.dom('[data-test-dual-filter-egress-off-ingress-off]').isVisible();
+ });
});