Skip to content
This repository was archived by the owner on Jun 29, 2023. It is now read-only.

Commit 5b847db

Browse files
committed
CB-2717 Add IDBMMS and Environments2 API Svc
Squashed commits: CB-2717 * Update docker image versions * Fix ports and startup command in Docker Compose * Add Environments2 API to traefik * Support services in CB_LOCAL_DEV_LIST * Add services to localdev-doctor * Make protocol optional in host-from-url and port-from-url CB-2717 Replace host-from-url & port-from-url with Go functions
1 parent 0e8fa29 commit 5b847db

18 files changed

+209
-20
lines changed

Makefile

+10
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,22 @@ update-container-versions:
4343
sed -i "0,/DOCKER_TAG_CLOUDBREAK/ s/DOCKER_TAG_CLOUDBREAK .*/DOCKER_TAG_CLOUDBREAK $(CB_VERSION)/" include/cloudbreak.bash
4444
sed -i "0,/DOCKER_TAG_ULUWATU/ s/DOCKER_TAG_ULUWATU .*/DOCKER_TAG_ULUWATU $(CB_VERSION)/" include/cloudbreak.bash
4545

46+
update-container-versions-cdpcp:
47+
sed -i "0,/DOCKER_TAG_IDBMMS/ s/DOCKER_TAG_IDBMMS .*/DOCKER_TAG_IDBMMS $(CDPCP_VERSION)/" include/cloudbreak.bash
48+
sed -i "0,/DOCKER_TAG_ENVIRONMENTS2_API/ s/DOCKER_TAG_ENVIRONMENTS2_API .*/DOCKER_TAG_ENVIRONMENTS2_API $(CDPCP_VERSION)/" include/cloudbreak.bash
49+
4650
push-container-versions: update-container-versions
4751
git add include/cloudbreak.bash
4852
git commit -m "Updated container versions to $(CB_VERSION)"
4953
git tag $(CB_VERSION)
5054
git push origin HEAD:$(GIT_BRANCH) --tags
5155

56+
push-container-versions-cdpcp: update-container-versions-cdpcp
57+
git add include/cloudbreak.bash
58+
git commit -m "Updated CDPCP container versions to $(CDPCP_VERSION)"
59+
git tag $(CDPCP_VERSION)
60+
git push origin HEAD:$(GIT_BRANCH) --tags
61+
5262
build: bindata ## Creates linux an osx binaries in "build/$OS"
5363
go test
5464
mkdir -p build/Linux && GOOS=linux go build -ldflags $(FLAGS) -o build/Linux/$(BINARYNAME)

compose.go

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ func GenerateComposeYaml(args []string) {
4949
insertIntoTemplateIfNotLocal(t, localDevList, "periscope")
5050
insertIntoTemplateIfNotLocal(t, localDevList, "redbeams")
5151
insertIntoTemplateIfNotLocal(t, localDevList, "freeipa")
52+
insertIntoTemplateIfNotLocal(t, localDevList, "idbmms")
53+
insertIntoTemplateIfNotLocal(t, localDevList, "environments2-api")
5254

5355
t.Execute(os.Stdout, dataMap)
5456
}

deployer.go

+2
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ func main() {
7474
"service-url": ServiceURL,
7575
"generate-traefik-toml": GenerateTraefikToml,
7676
"generate-caddy-file": GenerateCaddyFile,
77+
"host-from-url": HostFromURL,
78+
"port-from-url": PortFromURL,
7779
}, []string{
7880
"include/circle.bash",
7981
"include/cloudbreak.bash",

functions.go

+20
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"hash"
99
"io"
1010
"os"
11+
"regexp"
1112
"strings"
1213
"text/template"
1314

@@ -114,3 +115,22 @@ func GenerateCaddyFile(args []string) {
114115

115116
t.Execute(os.Stdout, params)
116117
}
118+
119+
func HostFromURL(args []string) {
120+
HostOrPortFromURL(args, 1)
121+
}
122+
123+
func PortFromURL(args []string) {
124+
HostOrPortFromURL(args, 2)
125+
}
126+
127+
func HostOrPortFromURL(args []string, component int) {
128+
url := args[0]
129+
pattern := regexp.MustCompile(`(?:[^:]+://)?([^:]+):([0-9]+)(?:/.*)?`)
130+
submatch := pattern.FindStringSubmatch(url)
131+
if submatch == nil {
132+
fatal("Can't parse URL '" + url + "'")
133+
} else {
134+
fmt.Printf("%s", submatch[component])
135+
}
136+
}

functions_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,45 @@ func TestGenerateCaddyFileMultiple(t *testing.T) {
6464
}
6565
}
6666
}
67+
68+
func TestHostFromURL(t *testing.T) {
69+
var testCases = []struct {
70+
args []string
71+
result string
72+
}{
73+
{[]string{"foo.com:1234"}, "foo.com"},
74+
{[]string{"foo.com:1234/bar/blah/"}, "foo.com"},
75+
{[]string{"http://foo.com:1234"}, "foo.com"},
76+
{[]string{"https://foo.com:1234/bar/blah/"}, "foo.com"},
77+
}
78+
79+
for _, c := range testCases {
80+
out := catchStdOut(t, func() {
81+
HostFromURL(c.args)
82+
})
83+
if out != c.result {
84+
t.Errorf("Host for URL '%s': got '%s', expected '%s'.", c.args, out, c.result)
85+
}
86+
}
87+
}
88+
89+
func TestPortFromURL(t *testing.T) {
90+
var testCases = []struct {
91+
args []string
92+
result string
93+
}{
94+
{[]string{"foo.com:1234"}, "1234"},
95+
{[]string{"foo.com:1234/bar/blah/"}, "1234"},
96+
{[]string{"http://foo.com:1234"}, "1234"},
97+
{[]string{"https://foo.com:1234/bar/blah/"}, "1234"},
98+
}
99+
100+
for _, c := range testCases {
101+
out := catchStdOut(t, func() {
102+
PortFromURL(c.args)
103+
})
104+
if out != c.result {
105+
t.Errorf("Host for URL '%s': got '%s', expected '%s'.", c.args, out, c.result)
106+
}
107+
}
108+
}

include/cloudbreak.bash

+27-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ cloudbreak-conf-tags() {
5252
env-import DOCKER_TAG_FREEIPA 2.13.0-dev.89
5353
env-import DOCKER_TAG_ULUWATU 2.13.0-dev.89
5454

55+
env-import DOCKER_TAG_IDBMMS d4f8f7e4106895e3dec7bfd354e4aefb087823c6
56+
env-import DOCKER_TAG_ENVIRONMENTS2_API d4f8f7e4106895e3dec7bfd354e4aefb087823c6
57+
5558
env-import DOCKER_TAG_POSTGRES 9.6.1-alpine
5659
env-import DOCKER_TAG_LOGROTATE 1.0.1
5760
env-import DOCKER_TAG_CBD_SMARTSENSE 0.13.4
@@ -67,6 +70,9 @@ cloudbreak-conf-tags() {
6770
env-import DOCKER_IMAGE_CLOUDBREAK_FREEIPA hortonworks/cloudbreak-freeipa
6871
env-import DOCKER_IMAGE_CBD_SMARTSENSE hortonworks/cbd-smartsense
6972

73+
env-import DOCKER_IMAGE_IDBMMS docker-private.infra.cloudera.com/cloudera/thunderhead-idbrokermappingmanagement
74+
env-import DOCKER_IMAGE_ENVIRONMENTS2_API docker-private.infra.cloudera.com/cloudera/thunderhead-environments2-api
75+
7076
env-import CB_DEFAULT_SUBSCRIPTION_ADDRESS http://uluwatu:3000/notifications
7177

7278
}
@@ -126,6 +132,12 @@ cloudbreak-conf-db() {
126132
env-import FREEIPA_DB_ENV_SCHEMA "public"
127133
env-import FREEIPA_HBM2DDL_STRATEGY "validate"
128134

135+
env-import IDBMMS_DB_ENV_USER "postgres"
136+
env-import IDBMMS_DB_ENV_DB "idbmmsdb"
137+
env-import IDBMMS_DB_ENV_PASS ""
138+
env-import IDBMMS_DB_PORT_5432_TCP_ADDR "$COMMON_DB"
139+
env-import IDBMMS_DB_PORT_5432_TCP_PORT "5432"
140+
129141
env-import VAULT_DB_SCHEMA "vault"
130142
}
131143

@@ -194,6 +206,20 @@ cloudbreak-conf-defaults() {
194206
env-import CLUSTER_PROXY_URL $(service-url cluster-proxy "$BRIDGE_ADDRESS" "$CB_LOCAL_DEV_LIST" "http://" "10081" "8080")
195207
env-import JAEGER_HOST "$BRIDGE_ADDRESS"
196208

209+
env-import ENVIRONMENT_HOST $(host-from-url "$ENVIRONMENT_URL")
210+
env-import FREEIPA_HOST $(host-from-url "$FREEIPA_URL")
211+
212+
env-import IDBMMS_URL $(service-url idbmms "$BRIDGE_ADDRESS" "$CB_LOCAL_DEV_LIST" "" "8990" "8982")
213+
env-import IDBMMS_HOST $(host-from-url "$IDBMMS_URL")
214+
env-import ENVIRONMENTS2_API_URL $(service-url environments2-api "$BRIDGE_ADDRESS" "$CB_LOCAL_DEV_LIST" "http://" "8984" "8982")
215+
216+
env-import ENVIRONMENT_PORT $(port-from-url "$ENVIRONMENT_URL")
217+
env-import FREEIPA_PORT $(port-from-url "$FREEIPA_URL")
218+
219+
env-import IDBMMS_PORT $(port-from-url "$IDBMMS_URL")
220+
env-import IDBMMS_HEALTHZ_PORT 8991
221+
env-import ENVIRONMENTS2_API_HEALTHZ_PORT 8983
222+
197223
env-import UAA_ULUWATU_SECRET "dummysecret"
198224

199225
if [[ "$CAAS_MOCK" == "true" ]]; then
@@ -340,7 +366,7 @@ generate-toml-file-for-localdev() {
340366

341367
generate-toml-file-for-localdev-force() {
342368
declare traefikFile=${1:-traefik.toml}
343-
generate-traefik-toml "$CLOUDBREAK_URL" "$PERISCOPE_URL" "$DATALAKE_URL" "$ENVIRONMENT_URL" "$REDBEAMS_URL" "$FREEIPA_URL" "http://$CAAS_URL" "$CLUSTER_PROXY_URL" "$CB_LOCAL_DEV_LIST" > "$traefikFile"
369+
generate-traefik-toml "$CLOUDBREAK_URL" "$PERISCOPE_URL" "$DATALAKE_URL" "$ENVIRONMENT_URL" "$REDBEAMS_URL" "$FREEIPA_URL" "http://$CAAS_URL" "$CLUSTER_PROXY_URL" "$ENVIRONMENTS2_API_URL" "$CB_LOCAL_DEV_LIST" > "$traefikFile"
344370
}
345371

346372
generate-traefik-check-diff() {

include/compose.bash

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ compose-kill() {
6464
docker rm -f cbreak_redbeams_1 2> /dev/null || :
6565
docker rm -f cbreak_environment_1 2> /dev/null || :
6666
docker rm -f cbreak_freeipa_1 2> /dev/null || :
67+
docker rm -f cbreak_idbmms_1 2> /dev/null || :
68+
docker rm -f cbreak_environments2-api_1 2> /dev/null || :
6769
}
6870

6971
util-cleanup() {

include/db.bash

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ db-dump() {
1616
fi
1717

1818
if [ "$dbName" = "all" ]; then
19-
for db in $CB_DB_ENV_DB $PERISCOPE_DB_ENV_DB $VAULT_DB_SCHEMA $DATALAKE_DB_ENV_DB $REDBEAMS_DB_ENV_DB $ENVIRONMENT_DB_ENV_DB $FREEIPA_DB_ENV_DB; do
19+
for db in $CB_DB_ENV_DB $PERISCOPE_DB_ENV_DB $VAULT_DB_SCHEMA $DATALAKE_DB_ENV_DB $REDBEAMS_DB_ENV_DB $ENVIRONMENT_DB_ENV_DB $FREEIPA_DB_ENV_DB $IDBMMS_DB_ENV_DB; do
2020
db-dump-database $db
2121
done
2222
else
@@ -51,7 +51,7 @@ db-initialize-databases() {
5151
migrate-startdb
5252
db-wait-for-db-cont cbreak_${COMMON_DB}_1
5353

54-
for db in $CB_DB_ENV_DB $PERISCOPE_DB_ENV_DB $VAULT_DB_SCHEMA $DATALAKE_DB_ENV_DB $REDBEAMS_DB_ENV_DB $ENVIRONMENT_DB_ENV_DB $FREEIPA_DB_ENV_DB; do
54+
for db in $CB_DB_ENV_DB $PERISCOPE_DB_ENV_DB $VAULT_DB_SCHEMA $DATALAKE_DB_ENV_DB $REDBEAMS_DB_ENV_DB $ENVIRONMENT_DB_ENV_DB $FREEIPA_DB_ENV_DB $IDBMMS_DB_ENV_DB; do
5555
db-create-database $db
5656
done
5757

include/deployer.bash

+2
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ localdev-doctor() {
398398
localdev-doctor-service "environment" "8088"
399399
localdev-doctor-service "freeipa" "8090"
400400
localdev-doctor-service "cluster-proxy" "10081"
401+
localdev-doctor-service "idbmms" "8990"
402+
localdev-doctor-service "environments2-api" "8984"
401403
}
402404

403405
localdev-doctor-service() {

include/env.bash

+9
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,22 @@ DOCKER_IMAGE_CLOUDBREAK_REDBEAMS - Redbeams Docker image name
159159
DOCKER_IMAGE_CLOUDBREAK_ENVIRONMENT - Environment Docker image name
160160
DOCKER_IMAGE_CLOUDBREAK_FREEIPA - FreeIpa Docker image name
161161
DOCKER_IMAGE_CLOUDBREAK_WEB - Web UI Docker image name
162+
DOCKER_IMAGE_ENVIRONMENTS2_API - Environments2 API Docker image name
163+
DOCKER_IMAGE_IDBMMS - IDBMMS Docker image name
162164
DOCKER_TAG_ALPINE - Alpine container version
163165
DOCKER_TAG_CBD_SMARTSENSE - SmartSense container version
164166
DOCKER_TAG_CERT_TOOL - Cert tool container version
165167
DOCKER_TAG_CLOUDBREAK - Cloudbreak container version
166168
DOCKER_TAG_CAAS_MOCK - Caas mock image name
167169
DOCKER_TAG_CONSUL - Consul container version
168170
DOCKER_TAG_HAVEGED - Haveged container version
171+
DOCKER_TAG_IDBMMS - IDBMMS container version
169172
DOCKER_TAG_MIGRATION - Migration container version
170173
DOCKER_TAG_PERISCOPE - Autoscale container version
171174
DOCKER_TAG_DATALAKE - Datalake container version
172175
DOCKER_TAG_REDBEAMS - Redbeams container version
173176
DOCKER_TAG_ENVIRONMENT - Environment container version
177+
DOCKER_TAG_ENVIRONMENTS2_API - Environments2 API container version
174178
DOCKER_TAG_FREEIPA - FreeIpa container version
175179
DOCKER_TAG_POSTGRES - Postgresql container version
176180
DOCKER_TAG_LOGROTATE - Logrotate container version
@@ -180,6 +184,11 @@ DOCKER_TAG_ULUWATU - Web UI container version
180184
DOCKER_STOP_TIMEOUT - Specify a shutdown timeout in seconds for containers
181185
HTTP_PROXY_HOST - HTTP proxy address
182186
HTTPS_PROXY_HOST - HTTPS proxy address
187+
IDBMMS_DB_ENV_DB - Name of the IDBMMS database
188+
IDBMMS_DB_ENV_PASS - Password for the IDBMMS database authentication
189+
IDBMMS_DB_ENV_USER - User for the IDBMMS database authentication
190+
IDBMMS_DB_PORT_5432_TCP_ADDR - Address of the IDBMMS database
191+
IDBMMS_DB_PORT_5432_TCP_PORT - Port number of the IDBMMS database
183192
PROXY_PORT - Proxy port
184193
PROXY_USER - Proxy user (basic auth)
185194
PROXY_PASSWORD - Proxy password (basic auth)

include/migrate.bash

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ migrate-one-db() {
113113
local docker_image_name=${DOCKER_IMAGE_CLOUDBREAK_FREEIPA}:${DOCKER_TAG_FREEIPA}
114114
;;
115115
*)
116-
migrateError "Invalid database service name: $service_name. Supported databases: cbdb, periscopedb, datalakedb, redbeamsdb and environmentdb"
116+
migrateError "Invalid database service name: $service_name. Supported databases: cbdb, periscopedb, datalakedb, redbeamsdb, environmentdb and freeipadb"
117117
return 1
118118
;;
119119
esac
@@ -169,7 +169,7 @@ execute-migration() {
169169
fi
170170
;;
171171
*)
172-
migrateError "Invalid database service name: $1. Supported databases: cbdb, periscopedb, datalakedb, redbeamsdb and environmentdb"
172+
migrateError "Invalid database service name: $1. Supported databases: cbdb, periscopedb, datalakedb, redbeamsdb, environmentdb and freeipadb"
173173
return 1
174174
;;
175175
esac

templates/compose-datalake.tmpl

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
- "NOTIFICATION_URLS={{{get . "CB_DEFAULT_SUBSCRIPTION_ADDRESS"}}}"
2929
- "ALTUS_UMS_HOST={{{get . "UMS_HOST"}}}"
3030
- OPENTRACING_JAEGER_UDP-SENDER_HOST={{{get . "JAEGER_HOST"}}}
31+
- "ALTUS_IDBMMS_HOST={{{get . "IDBMMS_HOST"}}}"
32+
- "ALTUS_IDBMMS_PORT={{{get . "IDBMMS_PORT"}}}"
3133
labels:
3234
- traefik.port=8080
3335
- traefik.frontend.rule=PathPrefix:/dl/
@@ -41,11 +43,11 @@
4143
- ./logs/datalake:/datalake-log
4244
- ./etc/:/etc/datalake
4345
networks:
44-
- {{{get . "DOCKER_NETWORK_NAME"}}}
46+
- {{{get . "DOCKER_NETWORK_NAME"}}}
4547
logging:
4648
options:
4749
max-size: "10M"
4850
max-file: "5"
4951
image: {{{get . "DOCKER_IMAGE_CLOUDBREAK_DATALAKE"}}}:{{{get . "DOCKER_TAG_DATALAKE"}}}
5052
command: bash
51-
{{{end}}}
53+
{{{end}}}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{{{define "environments2-api"}}}
2+
environments2-api:
3+
environment:
4+
- http_proxy={{{get . "HTTP_PROXY"}}}
5+
- https_proxy={{{get . "HTTPS_PROXY"}}}
6+
- "SERVICEDEPENDENCIES_UMSHOST={{{get . "UMS_HOST"}}}"
7+
- "SERVICEDEPENDENCIES_UMSPORT={{{get . "UMS_PORT"}}}"
8+
- "SERVICEDEPENDENCIES_IDBMMSHOST={{{get . "IDBMMS_HOST"}}}"
9+
- "SERVICEDEPENDENCIES_IDBMMSPORT={{{get . "IDBMMS_PORT"}}}"
10+
- "SERVICEDEPENDENCIES_CLOUDBREAKENVHOST={{{get . "ENVIRONMENT_HOST"}}}"
11+
- "SERVICEDEPENDENCIES_CLOUDBREAKENVPORT={{{get . "ENVIRONMENT_PORT"}}}"
12+
- "SERVICEDEPENDENCIES_FMSHOST={{{get . "FREEIPA_HOST"}}}"
13+
- "SERVICEDEPENDENCIES_FMSPORT={{{get . "FREEIPA_PORT"}}}"
14+
- TELEMETRY_SERVICE_NAME=Environments2Api
15+
labels:
16+
- traefik.port=8982
17+
- traefik.frontend.rule=PathPrefix:/api/v1/environments2/
18+
- traefik.backend=environments2-api-backend
19+
- traefik.frontend.priority=10
20+
ports:
21+
- 8984:8982
22+
- {{{get . "ENVIRONMENTS2_API_HEALTHZ_PORT"}}}:8983
23+
networks:
24+
- {{{get . "DOCKER_NETWORK_NAME"}}}
25+
logging:
26+
options:
27+
max-size: "10M"
28+
max-file: "5"
29+
image: {{{get . "DOCKER_IMAGE_ENVIRONMENTS2_API"}}}:{{{get . "DOCKER_TAG_ENVIRONMENTS2_API"}}}
30+
{{{end}}}

templates/compose-idbmms.tmpl

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{{{define "idbmms"}}}
2+
idbmms:
3+
environment:
4+
- http_proxy={{{get . "HTTP_PROXY"}}}
5+
- https_proxy={{{get . "HTTPS_PROXY"}}}
6+
- "DB_HOST={{{get . "IDBMMS_DB_PORT_5432_TCP_ADDR"}}}"
7+
- "DB_PORT={{{get . "IDBMMS_DB_PORT_5432_TCP_PORT"}}}"
8+
- "DB_USER={{{get . "IDBMMS_DB_ENV_USER"}}}"
9+
- "DB_PASSWORD={{{get . "IDBMMS_DB_ENV_PASS"}}}"
10+
- "DB_NAME={{{get . "IDBMMS_DB_ENV_DB"}}}"
11+
- "SERVICEDEPENDENCIES_UMSHOST={{{get . "UMS_HOST"}}}"
12+
- "SERVICEDEPENDENCIES_UMSPORT={{{get . "UMS_PORT"}}}"
13+
- "SERVICEDEPENDENCIES_CLOUDBREAKENVHOST={{{get . "ENVIRONMENT_HOST"}}}"
14+
- "SERVICEDEPENDENCIES_CLOUDBREAKENVPORT={{{get . "ENVIRONMENT_PORT"}}}"
15+
- TELEMETRY_SERVICE_NAME=IdBrokerMappingManagement
16+
ports:
17+
- 8990:8982
18+
- {{{get . "IDBMMS_HEALTHZ_PORT"}}}:8983
19+
networks:
20+
- {{{get . "DOCKER_NETWORK_NAME"}}}
21+
logging:
22+
options:
23+
max-size: "10M"
24+
max-file: "5"
25+
image: {{{get . "DOCKER_IMAGE_IDBMMS"}}}:{{{get . "DOCKER_TAG_IDBMMS"}}}
26+
{{{end}}}

templates/compose-main.tmpl

+2
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,5 @@ services:
162162
{{{- block "periscope" .}}}{{{end}}}
163163
{{{- block "redbeams" .}}}{{{end}}}
164164
{{{- block "freeipa" .}}}{{{end}}}
165+
{{{- block "idbmms" .}}}{{{end}}}
166+
{{{- block "environments2-api" .}}}{{{end}}}

templates/traefik.toml.tmpl

+13
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@
4949
[backends.cluster-proxy.servers.server0]
5050
url = "{{{ .ClusterProxyURL }}}"
5151
{{{- end}}}
52+
{{{- if isLocal . "environments2-api" }}}
53+
[backends.environments2-api]
54+
[backends.environments2-api.servers]
55+
[backends.environments2-api.servers.server0]
56+
url = "{{{ .Environments2ApiURL }}}"
57+
{{{- end}}}
5258

5359
[frontends]
5460
{{{- if isLocal . "cloudbreak"}}}
@@ -107,3 +113,10 @@
107113
rule = "PathPrefix:/cluster-proxy"
108114
priority = 100
109115
{{{- end}}}
116+
{{{- if isLocal . "environments2-api"}}}
117+
[frontends.environments2-api-frontend]
118+
backend = "environments2-api"
119+
[frontends.environments2-api-frontend.routes.frontendrule]
120+
rule = "PathPrefix:/api/v1/environments2/"
121+
priority = 100
122+
{{{- end}}}

0 commit comments

Comments
 (0)