Skip to content

Commit 816bf13

Browse files
view-tuple-overwrite
Summary: - Support for tuple overwrite in views. - Updated version of `aws.cloud_control` incorporated into test suite. - Added robot test `View Tuple Replacement Working As Exemplified by AWS EC2 Instances List and Detail`.
1 parent 309d9ac commit 816bf13

23 files changed

+1388
-99
lines changed

.vscode/launch.json

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,10 @@
155155
"select JSON_EXTRACT(saml.samlIdentity, '$.username') as saml_username from github.scim.saml_ids saml where saml.org = 'dummyorg';",
156156
"select kind, name, maximumCardsPerInstance from google.compute.acceleratorTypes where project = 'defective-response-content-project' and zone = 'australia-southeast1-a' order by name desc;",
157157
"registry pull google;",
158-
"create materialized view nv as select BackupId, BackupState from aws.cloudhsm.backups where region = 'ap-southeast-2' order by BackupId;"
158+
"create materialized view nv as select BackupId, BackupState from aws.cloudhsm.backups where region = 'ap-southeast-2' order by BackupId;",
159+
"SELECT instance_id FROM aws.ec2.instances WHERE region IN ('us-east-1', 'ap-southeast-2');",
160+
"SELECT instance_id FROM aws.ec2_solid_gold.instances WHERE region IN ('us-east-1', 'ap-southeast-2');",
161+
"SELECT region FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id; SELECT region, instance_id, tenancy, security_groups FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id; SELECT region, instance_id, tenancy, security_groups FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id; SELECT region, instance_id, tenancy, security_groups FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id; SELECT region, instance_id, tenancy, security_groups FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id; SELECT region, instance_id, tenancy, security_groups FROM aws.ec2_nextgen.instances WHERE region IN ('us-east-1', 'ap-southeast-2', 'ap-southeast-1') order by region, instance_id;",
159162
],
160163
"default": "show providers;"
161164
},
@@ -182,12 +185,13 @@
182185
"type": "pickString",
183186
"id": "authString",
184187
"description": "Auth Input arg String",
185-
"default": "{ \"azure\": { \"type\": \"azure_default\" }, \"digitalocean\": { \"type\": \"bearer\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/digitalocean-key.txt\" }, \"google\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/stackql-security-reviewer.json\" }, \"googleadmin\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/ryuk-it-query.json\" }, \"okta\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/okta-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"SSWS \" }, \"github\": { \"type\": \"basic\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/github-key.txt\" }, \"aws\": { \"type\": \"aws_signing_v4\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/aws-secret-key.txt\", \"keyID\": \"AKIA376P4FQSS2ONB2NS\" }, \"netlify\": { \"type\": \"api_key\", \"valuePrefix\": \"Bearer \", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/netlify-token.txt\" }, \"k8s\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/k8s-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"Bearer \" }, \"sumologic\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/sumologic-token.txt\", \"type\": \"basic\" } }",
188+
"default": "{}",
186189
"options": [
187190
"{ \"azure\": { \"type\": \"azure_default\" }, \"digitalocean\": { \"type\": \"bearer\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/digitalocean-key.txt\" }, \"google\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/stackql-security-reviewer.json\" }, \"googleadmin\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/ryuk-it-query.json\" }, \"okta\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/okta-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"SSWS \" }, \"github\": { \"type\": \"basic\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/github-key.txt\" }, \"aws\": { \"type\": \"aws_signing_v4\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/aws-secret-key.txt\", \"keyID\": \"AKIA376P4FQSS2ONB2NS\" }, \"netlify\": { \"type\": \"api_key\", \"valuePrefix\": \"Bearer \", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/netlify-token.txt\" }, \"k8s\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/k8s-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"Bearer \" }, \"sumologic\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/sumologic-token.txt\", \"type\": \"basic\" } }",
188191
"{ \"google\": { \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/google/functional-test-dummy-sa-key.json\" }, \"googleadmin\": { \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/google/functional-test-dummy-sa-key.json\" },s \"okta\": { \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/okta/api-key.txt\", \"type\": \"api_key\", \"valuePrefix\": \"SSWS \" }, \"github\": { \"type\": \"basic\", \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/okta/api-key.txt\" }, \"aws\": { \"type\": \"aws_signing_v4\", \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/aws/functional-test-dummy-aws-key.txt\", \"keyID\": \"AKIA376P4FQSS2ONB2NS\" }, \"netlify\": { \"type\": \"api_key\", \"valuePrefix\": \"Bearer \", \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/netlify/netlify-token.txt\" }, \"k8s\": { \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/k8s/k8s-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"Bearer \" }, \"sumologic\": { \"credentialsfilepath\": \"${workspaceFolder}/test/assets/credentials/dummy/sumologic/sumologic-token.txt\", \"type\": \"basic\" } }",
189192
"{ \"pgi\": { \"type\": \"sql_data_source::postgres\", \"sqlDataSource\": { \"dsn\": \"postgres://stackql:[email protected]:8432\" } }, \"azure\": { \"type\": \"azure_default\" }, \"google\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/stackql-security-reviewer.json\" }, \"okta\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/okta-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"SSWS \" }, \"github\": { \"type\": \"basic\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/github-key.txt\" }, \"aws\": { \"type\": \"aws_signing_v4\", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/aws-secret-key.txt\", \"keyID\": \"AKIA376P4FQSS2ONB2NS\" }, \"netlify\": { \"type\": \"api_key\", \"valuePrefix\": \"Bearer \", \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/netlify-token.txt\" }, \"k8s\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/k8s-token.txt\", \"type\": \"api_key\", \"valuePrefix\": \"Bearer \" }, \"sumologic\": { \"credentialsfilepath\": \"${workspaceFolder}/cicd/keys/integration/sumologic-token.txt\", \"type\": \"basic\" } }",
190-
"{ \"digitalocean\": { \"username_var\": \"DUMMY_DIGITALOCEAN_USERNAME\", \"password_var\": \"DUMMY_DIGITALOCEAN_PASSWORD\", \"type\": \"bearer\" } }"
193+
"{ \"digitalocean\": { \"username_var\": \"DUMMY_DIGITALOCEAN_USERNAME\", \"password_var\": \"DUMMY_DIGITALOCEAN_PASSWORD\", \"type\": \"bearer\" } }",
194+
"{}"
191195
]
192196
},
193197
{
@@ -381,12 +385,7 @@
381385
{
382386
"name": "generic exec",
383387
"type": "go",
384-
"env": {
385-
"DUMMY_DIGITALOCEAN_USERNAME": "myusername",
386-
"DUMMY_DIGITALOCEAN_PASSWORD": "mypassword",
387-
"DD_API_KEY": "myusername",
388-
"DD_APPLICATION_KEY": "mypassword"
389-
},
388+
"envFile": "${workspaceFolder}/.vscode/.env",
390389
"request": "launch",
391390
"mode": "debug",
392391
"program": "${workspaceFolder}/stackql",

docs/walkthroughs/README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ in order to setup, run, verify and tear down testing scenarios. The tests *can*
1616

1717
## Running from CI
1818

19-
The canonical, **ruleset-protected** tag form is `scenario-<run_number>-<anything>`. At this stage, `run_number` must refer to a `stackql` run for which a `linux` `amd64` stackql binary archive is present at the time the tag is run.
19+
The canonical, **ruleset-protected** tag form is `scenario-<<run_number>>-<<anything>>`. At this stage, `run_number` must refer to a `stackql` run for which a `linux` `amd64` stackql binary archive is present at the time the tag is run.
2020

2121

22+
## Plumbing
23+
24+
These walkthroughs are runnable using CI. This is built upon:
25+
26+
- `jinja2` templates, with `<<` and `>>` as delimiters.
27+
2228

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
2+
## Setup
3+
4+
First, create a set of AWS CLI credentials per [the AWS documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html#cli-authentication-user-get), and store them in the appropriate environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
5+
6+
Then, do this in bash:
7+
8+
```bash setup stackql-shell credentials_path=cicd/keys/testing/google-ro-credentials.json app_root_path=./test/tmp/.list-aws-instances.stackql
9+
10+
11+
stackql shell --approot=<<app_root_path>>
12+
```
13+
14+
## Method
15+
16+
Do this in the `stackql` shell, replacing `<<project>>` with your GCP project name, and `<<zone>>` as desired, eg: `australia-southeast1-a`:
17+
18+
```sql stackql-shell input required project=stackql-demo zone=australia-southeast1-a
19+
20+
registry pull aws;
21+
22+
SELECT instance_id, region
23+
FROM aws.ec2.instances
24+
WHERE region IN ('us-east-1', 'eu-west-1');
25+
26+
```
27+
28+
## Result
29+
30+
31+
You will see exactly this included in the output:
32+
33+
```sql expectation stdout-contains-all
34+
|---------------------|-------------------------|
35+
| name | kind |
36+
|---------------------|-------------------------|
37+
| nvidia-tesla-t4-vws | compute#acceleratorType |
38+
|---------------------|-------------------------|
39+
| nvidia-tesla-t4 | compute#acceleratorType |
40+
|---------------------|-------------------------|
41+
| nvidia-tesla-p4-vws | compute#acceleratorType |
42+
|---------------------|-------------------------|
43+
| nvidia-tesla-p4 | compute#acceleratorType |
44+
|---------------------|-------------------------|
45+
```
46+
47+
## Cleanup
48+
49+
```bash teardown best-effort app_root_path=./test/tmp/.list-aws-instances.stackql
50+
51+
rm -rf <<app_root_path>>
52+
53+
```
Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11

22
## Setup
33

4-
First, create a google service account key using the GCP Console, per [the GCP documentation](https://cloud.google.com/iam/docs/keys-create-delete). Grant the service account at least `Viewer` role equivalent privileges, per [the GCP dumentation](https://cloud.google.com/iam/docs/create-service-agents#grant-roles).
4+
First, create a google service account key using the GCP Console, per [the GCP documentation](https://cloud.google.com/iam/docs/keys-create-delete). Grant the service account at least `Viewer` role equivalent privileges, per [the GCP documentation](https://cloud.google.com/iam/docs/create-service-agents#grant-roles).
55

66
Then, do this in bash:
77

8-
```bash setup stackql-shell credentials-path=cicd/keys/testing/google-ro-credentials.json app-root-path=./test/tmp/.get-google-accel.stackql
8+
```bash setup stackql-shell credentials_path=cicd/keys/testing/google-ro-credentials.json app_root_path=./test/tmp/.get-google-accel.stackql
99

10-
export GOOGLE_CREDENTIALS="$(cat <credentials-path>)";
10+
export GOOGLE_CREDENTIALS="$(cat <<credentials_path>>)";
1111

12-
stackql shell --approot=<app-root-path>
12+
stackql shell --approot=<<app_root_path>>
1313
```
1414

1515
## Method
1616

17-
Do this in the `stackql` shell, replacing `<project>` with your GCP project name, and `<zone>` as desired, eg: `australia-southeast1-a`:
17+
Do this in the `stackql` shell, replacing `<<project>>` with your GCP project name, and `<<zone>>` as desired, eg: `australia-southeast1-a`:
1818

1919
```sql stackql-shell input required project=stackql-demo zone=australia-southeast1-a
2020

@@ -25,8 +25,8 @@ select
2525
kind
2626
FROM google.compute.accelerator_types
2727
WHERE
28-
project = '<project>'
29-
AND zone = '<zone>'
28+
project = '<<project>>'
29+
AND zone = '<<zone>>'
3030
ORDER BY
3131
name desc
3232
;
@@ -36,7 +36,7 @@ ORDER BY
3636
## Result
3737

3838

39-
You will see something very much like this included in the output, presuming you have one VM (if you have zero, only the headers should appper, more VMs means more rows):
39+
You will see exactly this included in the output:
4040

4141
```sql expectation stdout-contains-all
4242
|---------------------|-------------------------|
@@ -52,19 +52,10 @@ You will see something very much like this included in the output, presuming you
5252
|---------------------|-------------------------|
5353
```
5454

55-
<!--- EXPECTATION
56-
google\ provider,\ version\ 'v24.11.00274'\ successfully\ installed
57-
goodbye
58-
-->
59-
60-
<x-expectation style="display: none;">
61-
<stdout-contains-nonempty-table></stdout-contains-nonempty-table>
62-
</x-expectation>
63-
6455
## Cleanup
6556

66-
```bash teardown best-effort app-root-path=./test/tmp/.get-google-accel.stackql
57+
```bash teardown best-effort app_root_path=./test/tmp/.get-google-accel.stackql
6758

68-
rm -rf <app-root-path>
59+
rm -rf <<app_root_path>>
6960
7061
```
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11

22
## Setup
33

4-
First, create a google service account key using the GCP Console, per [the GCP documentation](https://cloud.google.com/iam/docs/keys-create-delete). Grant the service account at least `Viewer` role equivalent privileges, per [the GCP dumentation](https://cloud.google.com/iam/docs/create-service-agents#grant-roles).
4+
First, create a google service account key using the GCP Console, per [the GCP documentation](https://cloud.google.com/iam/docs/keys-create-delete). Grant the service account at least `Viewer` role equivalent privileges, per [the GCP documentation](https://cloud.google.com/iam/docs/create-service-agents#grant-roles).
55

66
Then, do this in bash:
77

8-
```bash setup stackql-shell credentials-path=cicd/keys/testing/google-ro-credentials.json app-root-path=./test/tmp/.get-google-vms.stackql
8+
```bash setup stackql-shell credentials_path=cicd/keys/testing/google-ro-credentials.json app_root_path=./test/tmp/.get-google-vms.stackql
99

10-
export GOOGLE_CREDENTIALS="$(cat <credentials-path>)";
10+
export GOOGLE_CREDENTIALS="$(cat <<credentials_path>>)";
1111

12-
stackql shell --approot=<app-root-path>
12+
stackql shell --approot=<<app_root_path>>
1313
```
1414

1515
## Method
1616

17-
Do this in the `stackql` shell, replacing `<project>` with your GCP project name, and `<zone>` as desired, eg: `australia-southeast1-a`:
17+
Do this in the `stackql` shell, replacing `<<project>>` with your GCP project name, and `<<zone>>` as desired, eg: `australia-southeast1-a`:
1818

1919
```sql stackql-shell input required project=stackql-demo zone=australia-southeast1-a
2020

@@ -25,8 +25,8 @@ select
2525
id
2626
FROM google.compute.instances
2727
WHERE
28-
project = '<project>'
29-
AND zone = '<zone>'
28+
project = '<<project>>'
29+
AND zone = '<<zone>>'
3030
;
3131

3232
```
@@ -55,8 +55,8 @@ goodbye
5555

5656
## Cleanup
5757

58-
```bash teardown best-effort app-root-path=./test/tmp/.get-google-vms.stackql
58+
```bash teardown best-effort app_root_path=./test/tmp/.get-google-vms.stackql
5959

60-
rm -rf <app-root-path>
60+
rm -rf <<app_root_path>>
6161
6262
```

internal/stackql/dependencyplanner/dependencyplanner.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,43 @@ func (dp *standardDependencyPlanner) processAcquire(
586586
return anTab, dp.tcc, nil
587587
}
588588

589+
func (dp *standardDependencyPlanner) getScalarParam(param interface{}) (interface{}, bool) {
590+
paramMeta, isParamMeta := param.(parserutil.ParameterMetadata)
591+
if isParamMeta {
592+
val := paramMeta.GetVal()
593+
_, valIsSQLVal := val.(*sqlparser.SQLVal)
594+
if valIsSQLVal {
595+
return val, true
596+
}
597+
}
598+
return nil, false
599+
}
600+
601+
func (dp *standardDependencyPlanner) isVectorParam(param interface{}) bool {
602+
paramMeta, isParamMeta := param.(parserutil.ParameterMetadata)
603+
if isParamMeta {
604+
val := paramMeta.GetVal()
605+
_, valIsSQLVal := val.(sqlparser.ValTuple)
606+
if valIsSQLVal {
607+
return true
608+
}
609+
}
610+
return false
611+
}
612+
613+
func (dp *standardDependencyPlanner) extractStaticSourceParam(e dataflow.Edge, paramKey string) (interface{}, bool) {
614+
if e.GetSource() == nil || e.
615+
GetSource().GetAnnotation() == nil || e.
616+
GetSource().GetAnnotation().GetParameters() == nil {
617+
return nil, false
618+
}
619+
v, ok := e.GetSource().GetAnnotation().GetParameters()[paramKey]
620+
if !ok {
621+
return nil, false
622+
}
623+
return dp.getScalarParam(v)
624+
}
625+
589626
//nolint:gocognit,nestif // live with it
590627
func (dp *standardDependencyPlanner) getStreamFromEdge(
591628
e dataflow.Edge,
@@ -639,9 +676,13 @@ func (dp *standardDependencyPlanner) getStreamFromEdge(
639676
params := toAc.GetParameters()
640677
staticParams := make(map[string]interface{})
641678
for k, v := range params {
679+
existingSourceParam, isExistingFromSource := dp.extractStaticSourceParam(e, k)
680+
// isVector := dp.isVectorParam(v)
642681
if _, ok := incomingCols[k]; !ok {
643682
staticParams[k] = v
644683
incomingCols[k] = struct{}{}
684+
} else if isExistingFromSource && false {
685+
staticParams[k] = existingSourceParam
645686
}
646687
}
647688
if len(staticParams) > 0 {

internal/stackql/drm/prepared_statement_ctx.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,21 @@ type standardPreparedStatementCtx struct {
5353

5454
func (ps *standardPreparedStatementCtx) GetOrderedTccs() []internaldto.TxnControlCounters {
5555
var rv []internaldto.TxnControlCounters
56+
// absolute hack
57+
// TODO: fix all the counter logic
58+
keysRemaining := make(map[string]struct{})
59+
for k := range ps.aliasToTccMap {
60+
keysRemaining[k] = struct{}{}
61+
}
5662
for _, alias := range ps.aliasOrdering {
63+
delete(keysRemaining, alias)
5764
rv = append(rv, ps.aliasToTccMap[alias]...)
5865
}
66+
// if len(keysRemaining) == 1 {
67+
// for k := range keysRemaining {
68+
// rv = append(rv, ps.aliasToTccMap[k]...)
69+
// }
70+
// }
5971
return rv
6072
}
6173

internal/stackql/sql_system/sql/sqlite/sqlengine-setup.ddl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ VALUES (
267267
IIF(JSON_EXTRACT(Properties, ''$.PublicAccessBlockConfiguration.BlockPublicAcls'') = 0, ''false'', ''true'') as BlockPublicAcls,
268268
IIF(JSON_EXTRACT(Properties, ''$.PublicAccessBlockConfiguration.IgnorePublicAcls'') = 0, ''false'', ''true'') as IgnorePublicAcls,
269269
JSON_EXTRACT(Properties, ''$.Tags'') as Tags
270-
FROM aws.cloud_control.resources WHERE region = ''ap-southeast-2'' and data__TypeName = ''AWS::S3::Bucket'' and data__Identifier = ''stackql-trial-bucket-01''
270+
FROM aws.cloud_control.resource WHERE region = ''ap-southeast-2'' and data__TypeName = ''AWS::S3::Bucket'' and data__Identifier = ''stackql-trial-bucket-01''
271271
;'
272272
);
273273

@@ -291,7 +291,7 @@ VALUES (
291291
IIF(JSON_EXTRACT(Properties, ''$.PublicAccessBlockConfiguration.BlockPublicAcls'') = 0, ''false'', ''true'') as BlockPublicAcls,
292292
IIF(JSON_EXTRACT(Properties, ''$.PublicAccessBlockConfiguration.IgnorePublicAcls'') = 0, ''false'', ''true'') as IgnorePublicAcls,
293293
JSON_EXTRACT(Properties, ''$.Tags'') as Tags
294-
FROM aws.cloud_control.resources WHERE region = ''ap-southeast-2'' and data__TypeName = ''AWS::S3::Bucket''
294+
FROM aws.cloud_control_legacy.resources WHERE region = ''ap-southeast-2'' and data__TypeName = ''AWS::S3::Bucket''
295295
;'
296296
);
297297

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
|-------------------------|------------------------------------------|
2-
| BucketName | DomainName |
2+
| bucket_name | domain_name |
33
|-------------------------|------------------------------------------|
44
| stackql-trial-bucket-01 | stackql-trial-bucket-01.s3.amazonaws.com |
5-
|-------------------------|------------------------------------------|
5+
|-------------------------|------------------------------------------|

0 commit comments

Comments
 (0)