Merge branch 'main' into issue_232_lotoussa
commit
3da401a0cc
|
@ -146,6 +146,24 @@
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"doc"
|
"doc"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "sundowndev",
|
||||||
|
"name": "Raphaël",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/16480203?v=4",
|
||||||
|
"profile": "https://crvx.fr/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "vainkop",
|
||||||
|
"name": "vainkop",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/28118190?v=4",
|
||||||
|
"profile": "https://github.com/vainkop",
|
||||||
|
"contributions": [
|
||||||
|
"bug"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ Thank you to all the people who have already contributed to driftctl.
|
||||||
<td align="center"><a href="https://github.com/herbygillot"><img src="https://avatars.githubusercontent.com/u/618376?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Herby Gillot</b></sub></a><br /><a href="#tool-herbygillot" title="Tools">🔧</a></td>
|
<td align="center"><a href="https://github.com/herbygillot"><img src="https://avatars.githubusercontent.com/u/618376?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Herby Gillot</b></sub></a><br /><a href="#tool-herbygillot" title="Tools">🔧</a></td>
|
||||||
<td align="center"><a href="http://louistoussaint.fr"><img src="https://avatars.githubusercontent.com/u/66522867?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Toussaint Louis</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/commits?author=lotoussa" title="Code">💻</a> <a href="https://github.com/cloudskiff/driftctl/commits?author=lotoussa" title="Documentation">📖</a></td>
|
<td align="center"><a href="http://louistoussaint.fr"><img src="https://avatars.githubusercontent.com/u/66522867?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Toussaint Louis</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/commits?author=lotoussa" title="Code">💻</a> <a href="https://github.com/cloudskiff/driftctl/commits?author=lotoussa" title="Documentation">📖</a></td>
|
||||||
<td align="center"><a href="https://dev.to/psedge"><img src="https://avatars.githubusercontent.com/u/5781397?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Peter Sedgewick</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/commits?author=psedge" title="Documentation">📖</a></td>
|
<td align="center"><a href="https://dev.to/psedge"><img src="https://avatars.githubusercontent.com/u/5781397?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Peter Sedgewick</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/commits?author=psedge" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://crvx.fr/"><img src="https://avatars.githubusercontent.com/u/16480203?v=4?s=80" width="80px;" alt=""/><br /><sub><b>Raphaël</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/commits?author=sundowndev" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/vainkop"><img src="https://avatars.githubusercontent.com/u/28118190?v=4?s=80" width="80px;" alt=""/><br /><sub><b>vainkop</b></sub></a><br /><a href="https://github.com/cloudskiff/driftctl/issues?q=author%3Avainkop" title="Bug reports">🐛</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -66,7 +66,7 @@ deps:
|
||||||
.PHONY: install-tools
|
.PHONY: install-tools
|
||||||
install-tools:
|
install-tools:
|
||||||
$(GOGET) gotest.tools/gotestsum
|
$(GOGET) gotest.tools/gotestsum
|
||||||
$(GOGET) github.com/vektra/mockery/.../
|
$(GOGET) github.com/vektra/mockery/v2/.../
|
||||||
|
|
||||||
|
|
||||||
go.mod: FORCE
|
go.mod: FORCE
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
<img src="https://codecov.io/gh/cloudskiff/driftctl/branch/main/graph/badge.svg?token=8C5R02G5S7"/>
|
<img src="https://codecov.io/gh/cloudskiff/driftctl/branch/main/graph/badge.svg?token=8C5R02G5S7"/>
|
||||||
</a>
|
</a>
|
||||||
<img src="https://img.shields.io/docker/pulls/cloudskiff/driftctl"/>
|
<img src="https://img.shields.io/docker/pulls/cloudskiff/driftctl"/>
|
||||||
<img src="https://img.shields.io/microbadger/layers/cloudskiff/driftctl"/>
|
|
||||||
<img src="https://img.shields.io/docker/image-size/cloudskiff/driftctl"/>
|
<img src="https://img.shields.io/docker/image-size/cloudskiff/driftctl"/>
|
||||||
<a href="https://discord.gg/NMCBxtD7Nd">
|
<a href="https://discord.gg/NMCBxtD7Nd">
|
||||||
<img src="https://img.shields.io/discord/783720783469871124?color=%237289da&label=discord&logo=discord"/>
|
<img src="https://img.shields.io/discord/783720783469871124?color=%237289da&label=discord&logo=discord"/>
|
||||||
|
@ -63,3 +62,11 @@ To learn more about compiling driftctl and contributing, please refer to the [co
|
||||||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification and is brought to you by these [awesome contributors](CONTRIBUTORS.md).
|
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification and is brought to you by these [awesome contributors](CONTRIBUTORS.md).
|
||||||
|
|
||||||
Build with ❤️️ from 🇫🇷 🇯🇵 🇬🇷 🇸🇪 🇺🇸
|
Build with ❤️️ from 🇫🇷 🇯🇵 🇬🇷 🇸🇪 🇺🇸
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Collecting users feedback
|
||||||
|
|
||||||
|
Have you launched driftctl ? Please take a moment to answer the [following questions](https://driftctl.typeform.com/to/fYUOOMj3) and help us improve the tool.
|
||||||
|
|
||||||
|
3 minutes, tops!
|
||||||
|
|
|
@ -99,7 +99,7 @@ func TestDriftctlCmd_Scan(t *testing.T) {
|
||||||
env: map[string]string{
|
env: map[string]string{
|
||||||
"DCTL_FROM": "test",
|
"DCTL_FROM": "test",
|
||||||
},
|
},
|
||||||
err: fmt.Errorf("Unable to parse from flag 'test': \nAccepted schemes are: tfstate://,tfstate+s3://"),
|
err: fmt.Errorf("Unable to parse from flag 'test': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
env: map[string]string{
|
env: map[string]string{
|
||||||
|
|
|
@ -20,22 +20,26 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/supplier"
|
"github.com/cloudskiff/driftctl/pkg/iac/supplier"
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/terraform/state/backend"
|
"github.com/cloudskiff/driftctl/pkg/iac/terraform/state/backend"
|
||||||
|
globaloutput "github.com/cloudskiff/driftctl/pkg/output"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote"
|
"github.com/cloudskiff/driftctl/pkg/remote"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/terraform"
|
"github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ScanOptions struct {
|
type ScanOptions struct {
|
||||||
Coverage bool
|
Coverage bool
|
||||||
Detect bool
|
Detect bool
|
||||||
From []config.SupplierConfig
|
From []config.SupplierConfig
|
||||||
To string
|
To string
|
||||||
Output output.OutputConfig
|
Output output.OutputConfig
|
||||||
Filter *jmespath.JMESPath
|
Filter *jmespath.JMESPath
|
||||||
|
Quiet bool
|
||||||
|
BackendOptions *backend.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewScanCmd() *cobra.Command {
|
func NewScanCmd() *cobra.Command {
|
||||||
opts := &ScanOptions{}
|
opts := &ScanOptions{}
|
||||||
|
opts.BackendOptions = &backend.Options{}
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "scan",
|
Use: "scan",
|
||||||
|
@ -77,6 +81,8 @@ func NewScanCmd() *cobra.Command {
|
||||||
opts.Filter = expr
|
opts.Filter = expr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opts.Quiet, _ = cmd.Flags().GetBool("quiet")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
@ -85,6 +91,12 @@ func NewScanCmd() *cobra.Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
fl := cmd.Flags()
|
fl := cmd.Flags()
|
||||||
|
fl.BoolP(
|
||||||
|
"quiet",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
"Do not display anything but scan results",
|
||||||
|
)
|
||||||
fl.StringP(
|
fl.StringP(
|
||||||
"filter",
|
"filter",
|
||||||
"",
|
"",
|
||||||
|
@ -118,12 +130,19 @@ func NewScanCmd() *cobra.Command {
|
||||||
"Cloud provider source\n"+
|
"Cloud provider source\n"+
|
||||||
"Accepted values are: "+strings.Join(supportedRemotes, ",")+"\n",
|
"Accepted values are: "+strings.Join(supportedRemotes, ",")+"\n",
|
||||||
)
|
)
|
||||||
|
fl.StringToStringVarP(&opts.BackendOptions.Headers,
|
||||||
|
"headers",
|
||||||
|
"H",
|
||||||
|
map[string]string{},
|
||||||
|
"Use those HTTP headers to query the provided URL.\n"+
|
||||||
|
"Only used with tfstate+http(s) backend for now.\n",
|
||||||
|
)
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanRun(opts *ScanOptions) error {
|
func scanRun(opts *ScanOptions) error {
|
||||||
selectedOutput := output.GetOutput(opts.Output)
|
selectedOutput := output.GetOutput(opts.Output, opts.Quiet)
|
||||||
|
|
||||||
c := make(chan os.Signal)
|
c := make(chan os.Signal)
|
||||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
|
@ -132,7 +151,9 @@ func scanRun(opts *ScanOptions) error {
|
||||||
providerLibrary := terraform.NewProviderLibrary()
|
providerLibrary := terraform.NewProviderLibrary()
|
||||||
supplierLibrary := resource.NewSupplierLibrary()
|
supplierLibrary := resource.NewSupplierLibrary()
|
||||||
|
|
||||||
err := remote.Activate(opts.To, alerter, providerLibrary, supplierLibrary)
|
progress := globaloutput.NewProgress()
|
||||||
|
|
||||||
|
err := remote.Activate(opts.To, alerter, providerLibrary, supplierLibrary, progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -146,7 +167,7 @@ func scanRun(opts *ScanOptions) error {
|
||||||
|
|
||||||
scanner := pkg.NewScanner(supplierLibrary.Suppliers(), alerter)
|
scanner := pkg.NewScanner(supplierLibrary.Suppliers(), alerter)
|
||||||
|
|
||||||
iacSupplier, err := supplier.GetIACSupplier(opts.From, providerLibrary)
|
iacSupplier, err := supplier.GetIACSupplier(opts.From, providerLibrary, opts.BackendOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -158,7 +179,9 @@ func scanRun(opts *ScanOptions) error {
|
||||||
ctl.Stop()
|
ctl.Stop()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
progress.Start()
|
||||||
analysis, err := ctl.Run()
|
analysis, err := ctl.Run()
|
||||||
|
progress.Stop()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -47,8 +47,8 @@ func IsSupported(key string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetOutput(config OutputConfig) Output {
|
func GetOutput(config OutputConfig, quiet bool) Output {
|
||||||
output.ChangePrinter(GetPrinter(config))
|
output.ChangePrinter(GetPrinter(config, quiet))
|
||||||
|
|
||||||
switch config.Key {
|
switch config.Key {
|
||||||
case JSONOutputType:
|
case JSONOutputType:
|
||||||
|
@ -60,7 +60,11 @@ func GetOutput(config OutputConfig) Output {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPrinter(config OutputConfig) output.Printer {
|
func GetPrinter(config OutputConfig, quiet bool) output.Printer {
|
||||||
|
if quiet {
|
||||||
|
return &output.VoidPrinter{}
|
||||||
|
}
|
||||||
|
|
||||||
switch config.Key {
|
switch config.Key {
|
||||||
case JSONOutputType:
|
case JSONOutputType:
|
||||||
if isStdOut(config.Options["path"]) {
|
if isStdOut(config.Options["path"]) {
|
||||||
|
|
|
@ -267,10 +267,11 @@ func fakeAnalysisWithGithubEnumerationError() *analyser.Analysis {
|
||||||
|
|
||||||
func TestGetPrinter(t *testing.T) {
|
func TestGetPrinter(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
path string
|
path string
|
||||||
key string
|
key string
|
||||||
want output.Printer
|
quiet bool
|
||||||
|
want output.Printer
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "json file output",
|
name: "json file output",
|
||||||
|
@ -278,6 +279,13 @@ func TestGetPrinter(t *testing.T) {
|
||||||
key: JSONOutputType,
|
key: JSONOutputType,
|
||||||
want: output.NewConsolePrinter(),
|
want: output.NewConsolePrinter(),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "json file output quiet",
|
||||||
|
path: "/path/to/file",
|
||||||
|
key: JSONOutputType,
|
||||||
|
quiet: true,
|
||||||
|
want: &output.VoidPrinter{},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "json stdout output",
|
name: "json stdout output",
|
||||||
path: "stdout",
|
path: "stdout",
|
||||||
|
@ -296,6 +304,13 @@ func TestGetPrinter(t *testing.T) {
|
||||||
key: ConsoleOutputType,
|
key: ConsoleOutputType,
|
||||||
want: output.NewConsolePrinter(),
|
want: output.NewConsolePrinter(),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "quiet console stdout output",
|
||||||
|
path: "stdout",
|
||||||
|
quiet: true,
|
||||||
|
key: ConsoleOutputType,
|
||||||
|
want: &output.VoidPrinter{},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
@ -304,7 +319,7 @@ func TestGetPrinter(t *testing.T) {
|
||||||
Options: map[string]string{
|
Options: map[string]string{
|
||||||
"path": tt.path,
|
"path": tt.path,
|
||||||
},
|
},
|
||||||
}); !reflect.DeepEqual(got, tt.want) {
|
}, tt.quiet); !reflect.DeepEqual(got, tt.want) {
|
||||||
t.Errorf("GetPrinter() = %v, want %v", got, tt.want)
|
t.Errorf("GetPrinter() = %v, want %v", got, tt.want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -38,6 +38,7 @@ func TestScanCmd_Valid(t *testing.T) {
|
||||||
{args: []string{"scan", "--from", "tfstate://test", "--from", "tfstate://test2"}},
|
{args: []string{"scan", "--from", "tfstate://test", "--from", "tfstate://test2"}},
|
||||||
{args: []string{"scan", "-t", "aws+tf", "-f", "tfstate://test"}},
|
{args: []string{"scan", "-t", "aws+tf", "-f", "tfstate://test"}},
|
||||||
{args: []string{"scan", "--to", "aws+tf", "--from", "tfstate://test"}},
|
{args: []string{"scan", "--to", "aws+tf", "--from", "tfstate://test"}},
|
||||||
|
{args: []string{"scan", "--to", "aws+tf", "--from", "tfstate+https://github.com/state.tfstate"}},
|
||||||
{args: []string{"scan", "--filter", "Type=='aws_s3_bucket'"}},
|
{args: []string{"scan", "--filter", "Type=='aws_s3_bucket'"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,14 +68,14 @@ func TestScanCmd_Invalid(t *testing.T) {
|
||||||
{args: []string{"scan", "-f"}, expected: `flag needs an argument: 'f' in -f`},
|
{args: []string{"scan", "-f"}, expected: `flag needs an argument: 'f' in -f`},
|
||||||
{args: []string{"scan", "--from"}, expected: `flag needs an argument: --from`},
|
{args: []string{"scan", "--from"}, expected: `flag needs an argument: --from`},
|
||||||
{args: []string{"scan", "--from"}, expected: `flag needs an argument: --from`},
|
{args: []string{"scan", "--from"}, expected: `flag needs an argument: --from`},
|
||||||
{args: []string{"scan", "--from", "tosdgjhgsdhgkjs"}, expected: "Unable to parse from flag 'tosdgjhgsdhgkjs': \nAccepted schemes are: tfstate://,tfstate+s3://"},
|
{args: []string{"scan", "--from", "tosdgjhgsdhgkjs"}, expected: "Unable to parse from flag 'tosdgjhgsdhgkjs': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"},
|
||||||
{args: []string{"scan", "--from", "://"}, expected: "Unable to parse from flag '://': \nAccepted schemes are: tfstate://,tfstate+s3://"},
|
{args: []string{"scan", "--from", "://"}, expected: "Unable to parse from flag '://': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"},
|
||||||
{args: []string{"scan", "--from", "://test"}, expected: "Unable to parse from flag '://test': \nAccepted schemes are: tfstate://,tfstate+s3://"},
|
{args: []string{"scan", "--from", "://test"}, expected: "Unable to parse from flag '://test': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"},
|
||||||
{args: []string{"scan", "--from", "tosdgjhgsdhgkjs://"}, expected: "Unable to parse from flag 'tosdgjhgsdhgkjs://': \nAccepted schemes are: tfstate://,tfstate+s3://"},
|
{args: []string{"scan", "--from", "tosdgjhgsdhgkjs://"}, expected: "Unable to parse from flag 'tosdgjhgsdhgkjs://': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"},
|
||||||
{args: []string{"scan", "--from", "terraform+foo+bar://test"}, expected: "Unable to parse from scheme 'terraform+foo+bar': \nAccepted schemes are: tfstate://,tfstate+s3://"},
|
{args: []string{"scan", "--from", "terraform+foo+bar://test"}, expected: "Unable to parse from scheme 'terraform+foo+bar': \nAccepted schemes are: tfstate://,tfstate+s3://,tfstate+http://,tfstate+https://"},
|
||||||
{args: []string{"scan", "--from", "unsupported://test"}, expected: "Unsupported IaC source 'unsupported': \nAccepted values are: tfstate"},
|
{args: []string{"scan", "--from", "unsupported://test"}, expected: "Unsupported IaC source 'unsupported': \nAccepted values are: tfstate"},
|
||||||
{args: []string{"scan", "--from", "tfstate+foobar://test"}, expected: "Unsupported IaC backend 'foobar': \nAccepted values are: s3"},
|
{args: []string{"scan", "--from", "tfstate+foobar://test"}, expected: "Unsupported IaC backend 'foobar': \nAccepted values are: s3,http,https"},
|
||||||
{args: []string{"scan", "--from", "tfstate:///tmp/test", "--from", "tfstate+toto://test"}, expected: "Unsupported IaC backend 'toto': \nAccepted values are: s3"},
|
{args: []string{"scan", "--from", "tfstate:///tmp/test", "--from", "tfstate+toto://test"}, expected: "Unsupported IaC backend 'toto': \nAccepted values are: s3,http,https"},
|
||||||
{args: []string{"scan", "--filter", "Type='test'"}, expected: "unable to parse filter expression: SyntaxError: Expected tRbracket, received: tUnknown"},
|
{args: []string{"scan", "--filter", "Type='test'"}, expected: "unable to parse filter expression: SyntaxError: Expected tRbracket, received: tUnknown"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ func IsSupplierSupported(supplierKey string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetIACSupplier(configs []config.SupplierConfig, library *terraform.ProviderLibrary) (resource.Supplier, error) {
|
func GetIACSupplier(configs []config.SupplierConfig, library *terraform.ProviderLibrary, backendOpts *backend.Options) (resource.Supplier, error) {
|
||||||
chainSupplier := resource.NewChainSupplier()
|
chainSupplier := resource.NewChainSupplier()
|
||||||
for _, config := range configs {
|
for _, config := range configs {
|
||||||
if !IsSupplierSupported(config.Key) {
|
if !IsSupplierSupported(config.Key) {
|
||||||
|
@ -39,7 +39,7 @@ func GetIACSupplier(configs []config.SupplierConfig, library *terraform.Provider
|
||||||
var err error
|
var err error
|
||||||
switch config.Key {
|
switch config.Key {
|
||||||
case state.TerraformStateReaderSupplier:
|
case state.TerraformStateReaderSupplier:
|
||||||
supplier, err = state.NewReader(config, library)
|
supplier, err = state.NewReader(config, library, backendOpts)
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("Unsupported supplier '%s'", config.Key)
|
return nil, errors.Errorf("Unsupported supplier '%s'", config.Key)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,14 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/iac/terraform/state/backend"
|
||||||
"github.com/cloudskiff/driftctl/pkg/terraform"
|
"github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetIACSupplier(t *testing.T) {
|
func TestGetIACSupplier(t *testing.T) {
|
||||||
type args struct {
|
type args struct {
|
||||||
config []config.SupplierConfig
|
config []config.SupplierConfig
|
||||||
|
options *backend.Options
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -26,6 +28,9 @@ func TestGetIACSupplier(t *testing.T) {
|
||||||
Key: "foobar",
|
Key: "foobar",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
options: &backend.Options{
|
||||||
|
Headers: map[string]string{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
wantErr: fmt.Errorf("Unsupported supplier 'foobar'"),
|
wantErr: fmt.Errorf("Unsupported supplier 'foobar'"),
|
||||||
},
|
},
|
||||||
|
@ -42,6 +47,9 @@ func TestGetIACSupplier(t *testing.T) {
|
||||||
Path: "terraform.tfstate",
|
Path: "terraform.tfstate",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
options: &backend.Options{
|
||||||
|
Headers: map[string]string{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
wantErr: fmt.Errorf("Unsupported supplier 'foobar'"),
|
wantErr: fmt.Errorf("Unsupported supplier 'foobar'"),
|
||||||
},
|
},
|
||||||
|
@ -51,6 +59,9 @@ func TestGetIACSupplier(t *testing.T) {
|
||||||
config: []config.SupplierConfig{
|
config: []config.SupplierConfig{
|
||||||
{Key: "tfstate", Backend: "", Path: "terraform.tfstate"},
|
{Key: "tfstate", Backend: "", Path: "terraform.tfstate"},
|
||||||
},
|
},
|
||||||
|
options: &backend.Options{
|
||||||
|
Headers: map[string]string{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
wantErr: nil,
|
wantErr: nil,
|
||||||
},
|
},
|
||||||
|
@ -62,13 +73,16 @@ func TestGetIACSupplier(t *testing.T) {
|
||||||
{Key: "tfstate", Backend: "s3", Path: "terraform.tfstate"},
|
{Key: "tfstate", Backend: "s3", Path: "terraform.tfstate"},
|
||||||
{Key: "tfstate", Backend: "", Path: "terraform2.tfstate"},
|
{Key: "tfstate", Backend: "", Path: "terraform2.tfstate"},
|
||||||
},
|
},
|
||||||
|
options: &backend.Options{
|
||||||
|
Headers: map[string]string{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
wantErr: nil,
|
wantErr: nil,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
_, err := GetIACSupplier(tt.args.config, terraform.NewProviderLibrary())
|
_, err := GetIACSupplier(tt.args.config, terraform.NewProviderLibrary(), tt.args.options)
|
||||||
if tt.wantErr != nil && err.Error() != tt.wantErr.Error() {
|
if tt.wantErr != nil && err.Error() != tt.wantErr.Error() {
|
||||||
t.Errorf("GetIACSupplier() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("GetIACSupplier() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
@ -82,6 +96,8 @@ func TestGetSupportedSchemes(t *testing.T) {
|
||||||
want := []string{
|
want := []string{
|
||||||
"tfstate://",
|
"tfstate://",
|
||||||
"tfstate+s3://",
|
"tfstate+s3://",
|
||||||
|
"tfstate+http://",
|
||||||
|
"tfstate+https://",
|
||||||
}
|
}
|
||||||
|
|
||||||
if got := GetSupportedSchemes(); !reflect.DeepEqual(got, want) {
|
if got := GetSupportedSchemes(); !reflect.DeepEqual(got, want) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package backend
|
package backend
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
||||||
|
@ -10,10 +11,16 @@ import (
|
||||||
var supportedBackends = []string{
|
var supportedBackends = []string{
|
||||||
BackendKeyFile,
|
BackendKeyFile,
|
||||||
BackendKeyS3,
|
BackendKeyS3,
|
||||||
|
BackendKeyHTTP,
|
||||||
|
BackendKeyHTTPS,
|
||||||
}
|
}
|
||||||
|
|
||||||
type Backend io.ReadCloser
|
type Backend io.ReadCloser
|
||||||
|
|
||||||
|
type Options struct {
|
||||||
|
Headers map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
func IsSupported(backend string) bool {
|
func IsSupported(backend string) bool {
|
||||||
for _, b := range supportedBackends {
|
for _, b := range supportedBackends {
|
||||||
if b == backend {
|
if b == backend {
|
||||||
|
@ -24,8 +31,7 @@ func IsSupported(backend string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetBackend(config config.SupplierConfig) (Backend, error) {
|
func GetBackend(config config.SupplierConfig, opts *Options) (Backend, error) {
|
||||||
|
|
||||||
backend := config.Backend
|
backend := config.Backend
|
||||||
|
|
||||||
if !IsSupported(backend) {
|
if !IsSupported(backend) {
|
||||||
|
@ -37,6 +43,10 @@ func GetBackend(config config.SupplierConfig) (Backend, error) {
|
||||||
return NewFileReader(config.Path)
|
return NewFileReader(config.Path)
|
||||||
case BackendKeyS3:
|
case BackendKeyS3:
|
||||||
return NewS3Reader(config.Path)
|
return NewS3Reader(config.Path)
|
||||||
|
case BackendKeyHTTP:
|
||||||
|
fallthrough
|
||||||
|
case BackendKeyHTTPS:
|
||||||
|
return NewHTTPReader(fmt.Sprintf("%s://%s", config.Backend, config.Path), opts)
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("Unsupported backend '%s'", backend)
|
return nil, errors.Errorf("Unsupported backend '%s'", backend)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
const BackendKeyHTTP = "http"
|
||||||
|
const BackendKeyHTTPS = "https"
|
||||||
|
|
||||||
|
type HTTPBackend struct {
|
||||||
|
url string
|
||||||
|
reader io.ReadCloser
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHTTPReader(rawURL string, opts *Options) (*HTTPBackend, error) {
|
||||||
|
req, err := http.NewRequest(http.MethodGet, rawURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value := range opts.Headers {
|
||||||
|
req.Header.Add(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
client := &http.Client{}
|
||||||
|
res, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &HTTPBackend{rawURL, res.Body}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *HTTPBackend) Read(p []byte) (n int, err error) {
|
||||||
|
if h.reader == nil {
|
||||||
|
return 0, errors.New("Reader not initialized")
|
||||||
|
}
|
||||||
|
return h.reader.Read(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *HTTPBackend) Close() error {
|
||||||
|
if h.reader != nil {
|
||||||
|
return h.reader.Close()
|
||||||
|
}
|
||||||
|
return errors.New("Unable to close reader as nothing was opened")
|
||||||
|
}
|
|
@ -0,0 +1,177 @@
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewHTTPReader(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
url string
|
||||||
|
options *Options
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantURL string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Should fail with wrong URL",
|
||||||
|
args: args{
|
||||||
|
url: "wrong_url",
|
||||||
|
options: &Options{
|
||||||
|
Headers: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantURL: "",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Should fetch URL with auth header",
|
||||||
|
args: args{
|
||||||
|
url: "https://raw.githubusercontent.com/cloudskiff/driftctl/main/.dockerignore",
|
||||||
|
options: &Options{
|
||||||
|
Headers: map[string]string{
|
||||||
|
"Authorization": "Basic Test",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantURL: "https://raw.githubusercontent.com/cloudskiff/driftctl/main/.dockerignore",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := NewHTTPReader(tt.args.url, tt.args.options)
|
||||||
|
if tt.wantErr {
|
||||||
|
assert.Error(t, err)
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
assert.NotNil(t, got)
|
||||||
|
assert.Equal(t, tt.wantURL, got.url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHTTPBackend_Close(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
url string
|
||||||
|
reader func() io.ReadCloser
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "should fail to close reader",
|
||||||
|
fields: fields{
|
||||||
|
url: "",
|
||||||
|
reader: func() io.ReadCloser {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should close reader",
|
||||||
|
fields: fields{
|
||||||
|
url: "",
|
||||||
|
reader: func() io.ReadCloser {
|
||||||
|
m := &MockReaderMock{}
|
||||||
|
m.On("Close").Return(nil)
|
||||||
|
return m
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
h := &HTTPBackend{
|
||||||
|
url: tt.fields.url,
|
||||||
|
reader: tt.fields.reader(),
|
||||||
|
}
|
||||||
|
if err := h.Close(); (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("Close() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHTTPBackend_Read(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
url string
|
||||||
|
reader func() io.ReadCloser
|
||||||
|
}
|
||||||
|
type args struct {
|
||||||
|
p []byte
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
args args
|
||||||
|
wantN int
|
||||||
|
wantErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "should fail to read because of nil reader",
|
||||||
|
fields: fields{
|
||||||
|
url: "",
|
||||||
|
reader: func() io.ReadCloser {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: errors.New("Reader not initialized"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should fail to read",
|
||||||
|
fields: fields{
|
||||||
|
url: "",
|
||||||
|
reader: func() io.ReadCloser {
|
||||||
|
m := &MockReaderMock{}
|
||||||
|
m.On("Read", mock.Anything).Return(0, errors.New("test"))
|
||||||
|
return m
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: errors.New("test"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should read",
|
||||||
|
fields: fields{
|
||||||
|
url: "",
|
||||||
|
reader: func() io.ReadCloser {
|
||||||
|
m := &MockReaderMock{}
|
||||||
|
m.On("Read", mock.Anything).Return(0, nil)
|
||||||
|
return m
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
h := &HTTPBackend{
|
||||||
|
url: tt.fields.url,
|
||||||
|
reader: tt.fields.reader(),
|
||||||
|
}
|
||||||
|
gotN, err := h.Read(tt.args.p)
|
||||||
|
|
||||||
|
if tt.wantErr != nil {
|
||||||
|
assert.EqualError(t, err, tt.wantErr.Error())
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
if gotN != tt.wantN {
|
||||||
|
t.Errorf("Read() gotN = %v, want %v", gotN, tt.wantN)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
// Code generated by mockery v0.0.0-dev. DO NOT EDIT.
|
||||||
|
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import mock "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
|
// MockReaderMock is an autogenerated mock type for the ReaderMock type
|
||||||
|
type MockReaderMock struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close provides a mock function with given fields:
|
||||||
|
func (_m *MockReaderMock) Close() error {
|
||||||
|
ret := _m.Called()
|
||||||
|
|
||||||
|
var r0 error
|
||||||
|
if rf, ok := ret.Get(0).(func() error); ok {
|
||||||
|
r0 = rf()
|
||||||
|
} else {
|
||||||
|
r0 = ret.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read provides a mock function with given fields: p
|
||||||
|
func (_m *MockReaderMock) Read(p []byte) (int, error) {
|
||||||
|
ret := _m.Called(p)
|
||||||
|
|
||||||
|
var r0 int
|
||||||
|
if rf, ok := ret.Get(0).(func([]byte) int); ok {
|
||||||
|
r0 = rf(p)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(1).(func([]byte) error); ok {
|
||||||
|
r1 = rf(p)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
|
@ -22,11 +22,12 @@ import (
|
||||||
const TerraformStateReaderSupplier = "tfstate"
|
const TerraformStateReaderSupplier = "tfstate"
|
||||||
|
|
||||||
type TerraformStateReader struct {
|
type TerraformStateReader struct {
|
||||||
library *terraform.ProviderLibrary
|
library *terraform.ProviderLibrary
|
||||||
config config.SupplierConfig
|
config config.SupplierConfig
|
||||||
backend backend.Backend
|
backend backend.Backend
|
||||||
enumerator enumerator.StateEnumerator
|
enumerator enumerator.StateEnumerator
|
||||||
deserializers []deserializer.CTYDeserializer
|
deserializers []deserializer.CTYDeserializer
|
||||||
|
backendOptions *backend.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *TerraformStateReader) initReader() error {
|
func (r *TerraformStateReader) initReader() error {
|
||||||
|
@ -34,8 +35,8 @@ func (r *TerraformStateReader) initReader() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReader(config config.SupplierConfig, library *terraform.ProviderLibrary) (*TerraformStateReader, error) {
|
func NewReader(config config.SupplierConfig, library *terraform.ProviderLibrary, backendOpts *backend.Options) (*TerraformStateReader, error) {
|
||||||
reader := TerraformStateReader{library: library, config: config, deserializers: iac.Deserializers()}
|
reader := TerraformStateReader{library: library, config: config, deserializers: iac.Deserializers(), backendOptions: backendOpts}
|
||||||
err := reader.initReader()
|
err := reader.initReader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -44,8 +45,7 @@ func NewReader(config config.SupplierConfig, library *terraform.ProviderLibrary)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *TerraformStateReader) retrieve() (map[string][]cty.Value, error) {
|
func (r *TerraformStateReader) retrieve() (map[string][]cty.Value, error) {
|
||||||
|
b, err := backend.GetBackend(r.config, r.backendOptions)
|
||||||
b, err := backend.GetBackend(r.config)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/output"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac"
|
"github.com/cloudskiff/driftctl/pkg/iac"
|
||||||
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
"github.com/cloudskiff/driftctl/pkg/iac/config"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws"
|
||||||
|
@ -96,7 +98,9 @@ func TestTerraformStateReader_AWS_Resources(t *testing.T) {
|
||||||
|
|
||||||
if shouldUpdate {
|
if shouldUpdate {
|
||||||
var err error
|
var err error
|
||||||
realProvider, err = aws.NewAWSTerraformProvider()
|
progress := &output.MockProgress{}
|
||||||
|
progress.On("Inc").Return()
|
||||||
|
realProvider, err = aws.NewAWSTerraformProvider(progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -171,7 +175,9 @@ func TestTerraformStateReader_Github_Resources(t *testing.T) {
|
||||||
|
|
||||||
if shouldUpdate {
|
if shouldUpdate {
|
||||||
var err error
|
var err error
|
||||||
realProvider, err = github.NewGithubTerraformProvider()
|
progress := &output.MockProgress{}
|
||||||
|
progress.On("Inc").Return()
|
||||||
|
realProvider, err = github.NewGithubTerraformProvider(progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Code generated by mockery v0.0.0-dev. DO NOT EDIT.
|
||||||
|
|
||||||
|
package output
|
||||||
|
|
||||||
|
import mock "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
|
// MockProgress is an autogenerated mock type for the Progress type
|
||||||
|
type MockProgress struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inc provides a mock function with given fields:
|
||||||
|
func (_m *MockProgress) Inc() {
|
||||||
|
_m.Called()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start provides a mock function with given fields:
|
||||||
|
func (_m *MockProgress) Start() {
|
||||||
|
_m.Called()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop provides a mock function with given fields:
|
||||||
|
func (_m *MockProgress) Stop() {
|
||||||
|
_m.Called()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Val provides a mock function with given fields:
|
||||||
|
func (_m *MockProgress) Val() uint64 {
|
||||||
|
ret := _m.Called()
|
||||||
|
|
||||||
|
var r0 uint64
|
||||||
|
if rf, ok := ret.Get(0).(func() uint64); ok {
|
||||||
|
r0 = rf()
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(uint64)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
package output
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.uber.org/atomic"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
var spinner = []string{"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"}
|
||||||
|
|
||||||
|
const (
|
||||||
|
progressTimeout = 10 * time.Second
|
||||||
|
progressRefreshRate = 200 * time.Millisecond
|
||||||
|
)
|
||||||
|
|
||||||
|
type Progress interface {
|
||||||
|
Start()
|
||||||
|
Stop()
|
||||||
|
Inc()
|
||||||
|
Val() uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type progress struct {
|
||||||
|
endChan chan struct{}
|
||||||
|
started *atomic.Bool
|
||||||
|
count *atomic.Uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProgress() *progress {
|
||||||
|
return &progress{
|
||||||
|
nil,
|
||||||
|
atomic.NewBool(false),
|
||||||
|
atomic.NewUint64(0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) Start() {
|
||||||
|
if !p.started.Swap(true) {
|
||||||
|
p.count.Store(0)
|
||||||
|
p.endChan = make(chan struct{})
|
||||||
|
go p.watch()
|
||||||
|
go p.render()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) Stop() {
|
||||||
|
if p.started.Swap(false) {
|
||||||
|
close(p.endChan)
|
||||||
|
Printf("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) Inc() {
|
||||||
|
if p.started.Load() {
|
||||||
|
p.count.Inc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) Val() uint64 {
|
||||||
|
return p.count.Load()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) render() {
|
||||||
|
i := -1
|
||||||
|
Printf("Scanning resources:\r")
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-p.endChan:
|
||||||
|
return
|
||||||
|
case <-time.After(progressRefreshRate):
|
||||||
|
i++
|
||||||
|
if i >= len(spinner) {
|
||||||
|
i = 0
|
||||||
|
}
|
||||||
|
Printf("Scanning resources: %s (%d)\r", spinner[i], p.count.Load())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *progress) watch() {
|
||||||
|
Loop:
|
||||||
|
for {
|
||||||
|
lastVal := p.count.Load()
|
||||||
|
select {
|
||||||
|
case <-time.After(progressTimeout):
|
||||||
|
if p.count.Load() != lastVal {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if p.started.Swap(false) {
|
||||||
|
close(p.endChan)
|
||||||
|
break Loop
|
||||||
|
}
|
||||||
|
case <-p.endChan:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logrus.Debug("Progress did not receive any tic. Stopping...")
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package output
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestProgressTimeoutDoesNotInc(t *testing.T) {
|
||||||
|
progress := NewProgress()
|
||||||
|
progress.Start()
|
||||||
|
progress.Stop() // should not hang
|
||||||
|
progress.Inc() // should not hang or inc
|
||||||
|
assert.Equal(t, uint64(0), progress.Val())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProgressTimeoutDoesNotHang(t *testing.T) {
|
||||||
|
progress := NewProgress()
|
||||||
|
progress.Start()
|
||||||
|
time.Sleep(progressTimeout)
|
||||||
|
for progress.started.Load() == true {
|
||||||
|
}
|
||||||
|
progress.Inc() // should not hang or inc
|
||||||
|
progress.Stop() // should not hang
|
||||||
|
assert.Equal(t, uint64(0), progress.Val())
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProgress(t *testing.T) {
|
||||||
|
progress := NewProgress()
|
||||||
|
progress.Start()
|
||||||
|
progress.Inc()
|
||||||
|
progress.Inc()
|
||||||
|
progress.Inc()
|
||||||
|
progress.Stop()
|
||||||
|
assert.Equal(t, uint64(3), progress.Val())
|
||||||
|
}
|
|
@ -29,7 +29,7 @@ func NewCloudfrontDistributionSupplier(provider *AWSTerraformProvider) *Cloudfro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s CloudfrontDistributionSupplier) Resources() ([]resource.Resource, error) {
|
func (s *CloudfrontDistributionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
distributions, err := s.client.ListAllDistributions()
|
distributions, err := s.client.ListAllDistributions()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsCloudfrontDistributionResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsCloudfrontDistributionResourceType)
|
||||||
|
@ -50,7 +50,7 @@ func (s CloudfrontDistributionSupplier) Resources() ([]resource.Resource, error)
|
||||||
return s.deserializer.Deserialize(resources)
|
return s.deserializer.Deserialize(resources)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s CloudfrontDistributionSupplier) readCloudfrontDistribution(distribution cloudfront.DistributionSummary) (cty.Value, error) {
|
func (s *CloudfrontDistributionSupplier) readCloudfrontDistribution(distribution cloudfront.DistributionSummary) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *distribution.Id,
|
ID: *distribution.Id,
|
||||||
Ty: aws.AwsCloudfrontDistributionResourceType,
|
Ty: aws.AwsCloudfrontDistributionResourceType,
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewDBInstanceSupplier(provider *AWSTerraformProvider) *DBInstanceSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s DBInstanceSupplier) Resources() ([]resource.Resource, error) {
|
func (s *DBInstanceSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
resourceList, err := s.client.ListAllDBInstances()
|
resourceList, err := s.client.ListAllDBInstances()
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewDBSubnetGroupSupplier(provider *AWSTerraformProvider) *DBSubnetGroupSupp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s DBSubnetGroupSupplier) Resources() ([]resource.Resource, error) {
|
func (s *DBSubnetGroupSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
subnetGroups, err := s.client.ListAllDbSubnetGroups()
|
subnetGroups, err := s.client.ListAllDbSubnetGroups()
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ func (s DBSubnetGroupSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(ctyValues)
|
return s.deserializer.Deserialize(ctyValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s DBSubnetGroupSupplier) readSubnetGroup(subnetGroup rds.DBSubnetGroup) (cty.Value, error) {
|
func (s *DBSubnetGroupSupplier) readSubnetGroup(subnetGroup rds.DBSubnetGroup) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *subnetGroup.DBSubnetGroupName,
|
ID: *subnetGroup.DBSubnetGroupName,
|
||||||
Ty: aws.AwsDbSubnetGroupResourceType,
|
Ty: aws.AwsDbSubnetGroupResourceType,
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewDynamoDBTableSupplier(provider *AWSTerraformProvider) *DynamoDBTableSupp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s DynamoDBTableSupplier) Resources() ([]resource.Resource, error) {
|
func (s *DynamoDBTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
tables, err := s.repository.ListAllTables()
|
tables, err := s.repository.ListAllTables()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsDynamodbTableResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsDynamodbTableResourceType)
|
||||||
|
@ -50,7 +50,7 @@ func (s DynamoDBTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s DynamoDBTableSupplier) readTable(tableName *string) (cty.Value, error) {
|
func (s *DynamoDBTableSupplier) readTable(tableName *string) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *tableName,
|
ID: *tableName,
|
||||||
Ty: aws.AwsDynamodbTableResourceType,
|
Ty: aws.AwsDynamodbTableResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewEC2AmiSupplier(provider *AWSTerraformProvider) *EC2AmiSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2AmiSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2AmiSupplier) Resources() ([]resource.Resource, error) {
|
||||||
images, err := s.client.ListAllImages()
|
images, err := s.client.ListAllImages()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsAmiResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsAmiResourceType)
|
||||||
|
@ -52,7 +52,7 @@ func (s EC2AmiSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2AmiSupplier) readAMI(id string) (cty.Value, error) {
|
func (s *EC2AmiSupplier) readAMI(id string) (cty.Value, error) {
|
||||||
resImage, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resImage, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsAmiResourceType,
|
Ty: resourceaws.AwsAmiResourceType,
|
||||||
ID: id,
|
ID: id,
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewEC2EbsSnapshotSupplier(provider *AWSTerraformProvider) *EC2EbsSnapshotSu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EbsSnapshotSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2EbsSnapshotSupplier) Resources() ([]resource.Resource, error) {
|
||||||
snapshots, err := s.client.ListAllSnapshots()
|
snapshots, err := s.client.ListAllSnapshots()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEbsSnapshotResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEbsSnapshotResourceType)
|
||||||
|
@ -53,7 +53,7 @@ func (s EC2EbsSnapshotSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EbsSnapshotSupplier) readEbsSnapshot(snapshot ec2.Snapshot) (cty.Value, error) {
|
func (s *EC2EbsSnapshotSupplier) readEbsSnapshot(snapshot ec2.Snapshot) (cty.Value, error) {
|
||||||
id := aws.StringValue(snapshot.SnapshotId)
|
id := aws.StringValue(snapshot.SnapshotId)
|
||||||
resSnapshot, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resSnapshot, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsEbsSnapshotResourceType,
|
Ty: resourceaws.AwsEbsSnapshotResourceType,
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewEC2EbsVolumeSupplier(provider *AWSTerraformProvider) *EC2EbsVolumeSuppli
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EbsVolumeSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2EbsVolumeSupplier) Resources() ([]resource.Resource, error) {
|
||||||
volumes, err := s.client.ListAllVolumes()
|
volumes, err := s.client.ListAllVolumes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEbsVolumeResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEbsVolumeResourceType)
|
||||||
|
@ -53,7 +53,7 @@ func (s EC2EbsVolumeSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EbsVolumeSupplier) readEbsVolume(volume ec2.Volume) (cty.Value, error) {
|
func (s *EC2EbsVolumeSupplier) readEbsVolume(volume ec2.Volume) (cty.Value, error) {
|
||||||
id := aws.StringValue(volume.VolumeId)
|
id := aws.StringValue(volume.VolumeId)
|
||||||
resVolume, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resVolume, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsEbsVolumeResourceType,
|
Ty: resourceaws.AwsEbsVolumeResourceType,
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewEC2EipAssociationSupplier(provider *AWSTerraformProvider) *EC2EipAssocia
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner())}
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner())}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EipAssociationSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2EipAssociationSupplier) Resources() ([]resource.Resource, error) {
|
||||||
associationIds, err := s.client.ListAllAddressesAssociation()
|
associationIds, err := s.client.ListAllAddressesAssociation()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEipAssociationResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEipAssociationResourceType)
|
||||||
|
@ -50,7 +50,7 @@ func (s EC2EipAssociationSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EipAssociationSupplier) readEIPAssociation(assocId string) (cty.Value, error) {
|
func (s *EC2EipAssociationSupplier) readEIPAssociation(assocId string) (cty.Value, error) {
|
||||||
resAssoc, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resAssoc, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsEipAssociationResourceType,
|
Ty: resourceaws.AwsEipAssociationResourceType,
|
||||||
ID: assocId,
|
ID: assocId,
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewEC2EipSupplier(provider *AWSTerraformProvider) *EC2EipSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EipSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2EipSupplier) Resources() ([]resource.Resource, error) {
|
||||||
addresses, err := s.client.ListAllAddresses()
|
addresses, err := s.client.ListAllAddresses()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEipResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsEipResourceType)
|
||||||
|
@ -53,7 +53,7 @@ func (s EC2EipSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2EipSupplier) readEIP(address ec2.Address) (cty.Value, error) {
|
func (s *EC2EipSupplier) readEIP(address ec2.Address) (cty.Value, error) {
|
||||||
id := aws.StringValue(address.AllocationId)
|
id := aws.StringValue(address.AllocationId)
|
||||||
resAddress, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resAddress, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsEipResourceType,
|
Ty: resourceaws.AwsEipResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewEC2InstanceSupplier(provider *AWSTerraformProvider) *EC2InstanceSupplier
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2InstanceSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2InstanceSupplier) Resources() ([]resource.Resource, error) {
|
||||||
instances, err := s.client.ListAllInstances()
|
instances, err := s.client.ListAllInstances()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsInstanceResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsInstanceResourceType)
|
||||||
|
@ -53,7 +53,7 @@ func (s EC2InstanceSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2InstanceSupplier) readInstance(id string) (cty.Value, error) {
|
func (s *EC2InstanceSupplier) readInstance(id string) (cty.Value, error) {
|
||||||
resInstance, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resInstance, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsInstanceResourceType,
|
Ty: resourceaws.AwsInstanceResourceType,
|
||||||
ID: id,
|
ID: id,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewEC2KeyPairSupplier(provider *AWSTerraformProvider) *EC2KeyPairSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2KeyPairSupplier) Resources() ([]resource.Resource, error) {
|
func (s *EC2KeyPairSupplier) Resources() ([]resource.Resource, error) {
|
||||||
keyPairs, err := s.client.ListAllKeyPairs()
|
keyPairs, err := s.client.ListAllKeyPairs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsKeyPairResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsKeyPairResourceType)
|
||||||
|
@ -52,7 +52,7 @@ func (s EC2KeyPairSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s EC2KeyPairSupplier) readKeyPair(name string) (cty.Value, error) {
|
func (s *EC2KeyPairSupplier) readKeyPair(name string) (cty.Value, error) {
|
||||||
resKp, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
resKp, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsKeyPairResourceType,
|
Ty: resourceaws.AwsKeyPairResourceType,
|
||||||
ID: name,
|
ID: name,
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewECRRepositorySupplier(provider *AWSTerraformProvider) *ECRRepositorySupp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r ECRRepositorySupplier) Resources() ([]resource.Resource, error) {
|
func (r *ECRRepositorySupplier) Resources() ([]resource.Resource, error) {
|
||||||
repositories, err := r.client.ListAllRepositories()
|
repositories, err := r.client.ListAllRepositories()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsEcrRepositoryResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsEcrRepositoryResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (r ECRRepositorySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return r.deserializer.Deserialize(retrieve)
|
return r.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r ECRRepositorySupplier) readRepository(repository *ecr.Repository) (cty.Value, error) {
|
func (r *ECRRepositorySupplier) readRepository(repository *ecr.Repository) (cty.Value, error) {
|
||||||
val, err := r.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := r.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *repository.RepositoryName,
|
ID: *repository.RepositoryName,
|
||||||
Ty: aws.AwsEcrRepositoryResourceType,
|
Ty: aws.AwsEcrRepositoryResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewIamAccessKeySupplier(provider *AWSTerraformProvider) *IamAccessKeySuppli
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamAccessKeySupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamAccessKeySupplier) Resources() ([]resource.Resource, error) {
|
||||||
keys, err := listIamAccessKeys(s.client)
|
keys, err := listIamAccessKeys(s.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -52,7 +52,7 @@ func (s IamAccessKeySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamAccessKeySupplier) readRes(key *iam.AccessKeyMetadata) (cty.Value, error) {
|
func (s *IamAccessKeySupplier) readRes(key *iam.AccessKeyMetadata) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamAccessKeyResourceType,
|
Ty: resourceaws.AwsIamAccessKeyResourceType,
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewIamPolicySupplier(provider *AWSTerraformProvider) *IamPolicySupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamPolicySupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
policies, err := listIamPolicies(s.client)
|
policies, err := listIamPolicies(s.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsIamPolicyResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsIamPolicyResourceType)
|
||||||
|
@ -53,7 +53,7 @@ func (s IamPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamPolicySupplier) readRes(resource *iam.Policy) (cty.Value, error) {
|
func (s *IamPolicySupplier) readRes(resource *iam.Policy) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamPolicyResourceType,
|
Ty: resourceaws.AwsIamPolicyResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewIamRolePolicyAttachmentSupplier(provider *AWSTerraformProvider) *IamRole
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRolePolicyAttachmentSupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamRolePolicyAttachmentSupplier) Resources() ([]resource.Resource, error) {
|
||||||
roles, err := listIamRoles(s.client, resourceaws.AwsIamRolePolicyAttachmentResourceType)
|
roles, err := listIamRoles(s.client, resourceaws.AwsIamRolePolicyAttachmentResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -66,7 +66,7 @@ func (s IamRolePolicyAttachmentSupplier) Resources() ([]resource.Resource, error
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRolePolicyAttachmentSupplier) readRes(attachedPol attachedRolePolicy) (cty.Value, error) {
|
func (s *IamRolePolicyAttachmentSupplier) readRes(attachedPol attachedRolePolicy) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamRolePolicyAttachmentResourceType,
|
Ty: resourceaws.AwsIamRolePolicyAttachmentResourceType,
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NewIamRolePolicySupplier(provider *AWSTerraformProvider) *IamRolePolicySupp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRolePolicySupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamRolePolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
policies, err := listIamRolePolicies(s.client, resourceaws.AwsIamRolePolicyResourceType)
|
policies, err := listIamRolePolicies(s.client, resourceaws.AwsIamRolePolicyResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -52,7 +52,7 @@ func (s IamRolePolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRolePolicySupplier) readRes(name string) (cty.Value, error) {
|
func (s *IamRolePolicySupplier) readRes(name string) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamRolePolicyResourceType,
|
Ty: resourceaws.AwsIamRolePolicyResourceType,
|
||||||
|
|
|
@ -45,7 +45,7 @@ func awsIamRoleShouldBeIgnored(roleName string) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRoleSupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamRoleSupplier) Resources() ([]resource.Resource, error) {
|
||||||
roles, err := listIamRoles(s.client, resourceaws.AwsIamRoleResourceType)
|
roles, err := listIamRoles(s.client, resourceaws.AwsIamRoleResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -69,7 +69,7 @@ func (s IamRoleSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamRoleSupplier) readRes(resource *iam.Role) (cty.Value, error) {
|
func (s *IamRoleSupplier) readRes(resource *iam.Role) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamRoleResourceType,
|
Ty: resourceaws.AwsIamRoleResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewIamUserPolicyAttachmentSupplier(provider *AWSTerraformProvider) *IamUser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserPolicyAttachmentSupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamUserPolicyAttachmentSupplier) Resources() ([]resource.Resource, error) {
|
||||||
users, err := listIamUsers(s.client, resourceaws.AwsIamUserPolicyAttachmentResourceType)
|
users, err := listIamUsers(s.client, resourceaws.AwsIamUserPolicyAttachmentResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -63,7 +63,7 @@ func (s IamUserPolicyAttachmentSupplier) Resources() ([]resource.Resource, error
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserPolicyAttachmentSupplier) readRes(attachedPol attachedUserPolicy) (cty.Value, error) {
|
func (s *IamUserPolicyAttachmentSupplier) readRes(attachedPol attachedUserPolicy) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamUserPolicyAttachmentResourceType,
|
Ty: resourceaws.AwsIamUserPolicyAttachmentResourceType,
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NewIamUserPolicySupplier(provider *AWSTerraformProvider) *IamUserPolicySupp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserPolicySupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamUserPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
users, err := listIamUsers(s.client, resourceaws.AwsIamUserPolicyResourceType)
|
users, err := listIamUsers(s.client, resourceaws.AwsIamUserPolicyResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -66,7 +66,7 @@ func (s IamUserPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserPolicySupplier) readRes(policyName string) (cty.Value, error) {
|
func (s *IamUserPolicySupplier) readRes(policyName string) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamUserPolicyResourceType,
|
Ty: resourceaws.AwsIamUserPolicyResourceType,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewIamUserSupplier(provider *AWSTerraformProvider) *IamUserSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserSupplier) Resources() ([]resource.Resource, error) {
|
func (s *IamUserSupplier) Resources() ([]resource.Resource, error) {
|
||||||
users, err := listIamUsers(s.client, resourceaws.AwsIamUserResourceType)
|
users, err := listIamUsers(s.client, resourceaws.AwsIamUserResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -52,7 +52,7 @@ func (s IamUserSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s IamUserSupplier) readRes(user *iam.User) (cty.Value, error) {
|
func (s *IamUserSupplier) readRes(user *iam.User) (cty.Value, error) {
|
||||||
res, err := s.reader.ReadResource(
|
res, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsIamUserResourceType,
|
Ty: resourceaws.AwsIamUserResourceType,
|
||||||
|
|
|
@ -2,6 +2,7 @@ package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/alerter"
|
"github.com/cloudskiff/driftctl/pkg/alerter"
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/output"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
|
@ -14,8 +15,8 @@ const RemoteAWSTerraform = "aws+tf"
|
||||||
* Initialize remote (configure credentials, launch tf providers and start gRPC clients)
|
* Initialize remote (configure credentials, launch tf providers and start gRPC clients)
|
||||||
* Required to use Scanner
|
* Required to use Scanner
|
||||||
*/
|
*/
|
||||||
func Init(alerter *alerter.Alerter, providerLibrary *terraform.ProviderLibrary, supplierLibrary *resource.SupplierLibrary) error {
|
func Init(alerter *alerter.Alerter, providerLibrary *terraform.ProviderLibrary, supplierLibrary *resource.SupplierLibrary, progress output.Progress) error {
|
||||||
provider, err := NewAWSTerraformProvider()
|
provider, err := NewAWSTerraformProvider(progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -67,7 +68,7 @@ func Init(alerter *alerter.Alerter, providerLibrary *terraform.ProviderLibrary,
|
||||||
supplierLibrary.AddSupplier(NewSqsQueuePolicySupplier(provider))
|
supplierLibrary.AddSupplier(NewSqsQueuePolicySupplier(provider))
|
||||||
supplierLibrary.AddSupplier(NewSNSTopicSupplier(provider))
|
supplierLibrary.AddSupplier(NewSNSTopicSupplier(provider))
|
||||||
supplierLibrary.AddSupplier(NewSNSTopicPolicySupplier(provider))
|
supplierLibrary.AddSupplier(NewSNSTopicPolicySupplier(provider))
|
||||||
supplierLibrary.AddSupplier(NewSNSTopicSubscriptionSupplier(provider))
|
supplierLibrary.AddSupplier(NewSNSTopicSubscriptionSupplier(provider, alerter))
|
||||||
supplierLibrary.AddSupplier(NewDynamoDBTableSupplier(provider))
|
supplierLibrary.AddSupplier(NewDynamoDBTableSupplier(provider))
|
||||||
supplierLibrary.AddSupplier(NewRoute53HealthCheckSupplier(provider))
|
supplierLibrary.AddSupplier(NewRoute53HealthCheckSupplier(provider))
|
||||||
supplierLibrary.AddSupplier(NewCloudfrontDistributionSupplier(provider))
|
supplierLibrary.AddSupplier(NewCloudfrontDistributionSupplier(provider))
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
import "github.com/cloudskiff/driftctl/pkg/terraform"
|
import (
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/output"
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
|
)
|
||||||
|
|
||||||
func InitTestAwsProvider(providerLibrary *terraform.ProviderLibrary) (*AWSTerraformProvider, error) {
|
func InitTestAwsProvider(providerLibrary *terraform.ProviderLibrary) (*AWSTerraformProvider, error) {
|
||||||
provider, err := NewAWSTerraformProvider()
|
progress := &output.MockProgress{}
|
||||||
|
progress.On("Inc").Maybe().Return()
|
||||||
|
provider, err := NewAWSTerraformProvider(progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewInternetGatewaySupplier(provider *AWSTerraformProvider) *InternetGateway
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s InternetGatewaySupplier) Resources() ([]resource.Resource, error) {
|
func (s *InternetGatewaySupplier) Resources() ([]resource.Resource, error) {
|
||||||
internetGateways, err := listInternetGateways(s.client)
|
internetGateways, err := listInternetGateways(s.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsInternetGatewayResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsInternetGatewayResourceType)
|
||||||
|
@ -50,7 +50,7 @@ func (s InternetGatewaySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(resources)
|
return s.deserializer.Deserialize(resources)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s InternetGatewaySupplier) readInternetGateway(internetGateway ec2.InternetGateway) (cty.Value, error) {
|
func (s *InternetGatewaySupplier) readInternetGateway(internetGateway ec2.InternetGateway) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsInternetGatewayResourceType
|
var Ty resource.ResourceType = aws.AwsInternetGatewayResourceType
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: Ty,
|
Ty: Ty,
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewKMSAliasSupplier(provider *AWSTerraformProvider) *KMSAliasSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s KMSAliasSupplier) Resources() ([]resource.Resource, error) {
|
func (s *KMSAliasSupplier) Resources() ([]resource.Resource, error) {
|
||||||
aliases, err := s.client.ListAllAliases()
|
aliases, err := s.client.ListAllAliases()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsKmsAliasResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsKmsAliasResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (s KMSAliasSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s KMSAliasSupplier) readAlias(alias *kms.AliasListEntry) (cty.Value, error) {
|
func (s *KMSAliasSupplier) readAlias(alias *kms.AliasListEntry) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *alias.AliasName,
|
ID: *alias.AliasName,
|
||||||
Ty: aws.AwsKmsAliasResourceType,
|
Ty: aws.AwsKmsAliasResourceType,
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewKMSKeySupplier(provider *AWSTerraformProvider) *KMSKeySupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s KMSKeySupplier) Resources() ([]resource.Resource, error) {
|
func (s *KMSKeySupplier) Resources() ([]resource.Resource, error) {
|
||||||
keys, err := s.client.ListAllKeys()
|
keys, err := s.client.ListAllKeys()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsKmsKeyResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsKmsKeyResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (s KMSKeySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s KMSKeySupplier) readKey(key *kms.KeyListEntry) (cty.Value, error) {
|
func (s *KMSKeySupplier) readKey(key *kms.KeyListEntry) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *key.KeyId,
|
ID: *key.KeyId,
|
||||||
Ty: aws.AwsKmsKeyResourceType,
|
Ty: aws.AwsKmsKeyResourceType,
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewLambdaEventSourceMappingSupplier(provider *AWSTerraformProvider) *Lambda
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s LambdaEventSourceMappingSupplier) Resources() ([]resource.Resource, error) {
|
func (s *LambdaEventSourceMappingSupplier) Resources() ([]resource.Resource, error) {
|
||||||
functions, err := s.client.ListAllLambdaEventSourceMappings()
|
functions, err := s.client.ListAllLambdaEventSourceMappings()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsLambdaEventSourceMappingResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsLambdaEventSourceMappingResourceType)
|
||||||
|
@ -49,7 +49,7 @@ func (s LambdaEventSourceMappingSupplier) Resources() ([]resource.Resource, erro
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s LambdaEventSourceMappingSupplier) readLambdaEventSourceMapping(sourceMappingConfig lambda.EventSourceMappingConfiguration) (cty.Value, error) {
|
func (s *LambdaEventSourceMappingSupplier) readLambdaEventSourceMapping(sourceMappingConfig lambda.EventSourceMappingConfiguration) (cty.Value, error) {
|
||||||
resFunction, err := s.reader.ReadResource(
|
resFunction, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
Ty: resourceaws.AwsLambdaEventSourceMappingResourceType,
|
Ty: resourceaws.AwsLambdaEventSourceMappingResourceType,
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewLambdaFunctionSupplier(provider *AWSTerraformProvider) *LambdaFunctionSu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s LambdaFunctionSupplier) Resources() ([]resource.Resource, error) {
|
func (s *LambdaFunctionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
functions, err := s.client.ListAllLambdaFunctions()
|
functions, err := s.client.ListAllLambdaFunctions()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsLambdaFunctionResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsLambdaFunctionResourceType)
|
||||||
|
@ -50,7 +50,7 @@ func (s LambdaFunctionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s LambdaFunctionSupplier) readLambda(function lambda.FunctionConfiguration) (cty.Value, error) {
|
func (s *LambdaFunctionSupplier) readLambda(function lambda.FunctionConfiguration) (cty.Value, error) {
|
||||||
name := *function.FunctionName
|
name := *function.FunctionName
|
||||||
resFunction, err := s.reader.ReadResource(
|
resFunction, err := s.reader.ReadResource(
|
||||||
terraform.ReadResourceArgs{
|
terraform.ReadResourceArgs{
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewNatGatewaySupplier(provider *AWSTerraformProvider) *NatGatewaySupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s NatGatewaySupplier) Resources() ([]resource.Resource, error) {
|
func (s *NatGatewaySupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
retrievedNatGateways, err := listNatGateways(s.client)
|
retrievedNatGateways, err := listNatGateways(s.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -58,7 +58,7 @@ func (s NatGatewaySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return resources, nil
|
return resources, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s NatGatewaySupplier) readNatGateway(gateway ec2.NatGateway) (cty.Value, error) {
|
func (s *NatGatewaySupplier) readNatGateway(gateway ec2.NatGateway) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsNatGatewayResourceType
|
var Ty resource.ResourceType = aws.AwsNatGatewayResourceType
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *gateway.NatGatewayId,
|
ID: *gateway.NatGatewayId,
|
||||||
|
|
|
@ -3,6 +3,7 @@ package aws
|
||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
|
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/output"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
"github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
tf "github.com/cloudskiff/driftctl/pkg/terraform"
|
tf "github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
)
|
)
|
||||||
|
@ -41,7 +42,7 @@ type AWSTerraformProvider struct {
|
||||||
session *session.Session
|
session *session.Session
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAWSTerraformProvider() (*AWSTerraformProvider, error) {
|
func NewAWSTerraformProvider(progress output.Progress) (*AWSTerraformProvider, error) {
|
||||||
p := &AWSTerraformProvider{}
|
p := &AWSTerraformProvider{}
|
||||||
providerKey := "aws"
|
providerKey := "aws"
|
||||||
installer, err := tf.NewProviderInstaller(tf.ProviderConfig{
|
installer, err := tf.NewProviderInstaller(tf.ProviderConfig{
|
||||||
|
@ -64,7 +65,7 @@ func NewAWSTerraformProvider() (*AWSTerraformProvider, error) {
|
||||||
MaxRetries: 10, // TODO make this configurable
|
MaxRetries: 10, // TODO make this configurable
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
}, progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewRoute53HealthCheckSupplier(provider *AWSTerraformProvider) *Route53Healt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53HealthCheckSupplier) Resources() ([]resource.Resource, error) {
|
func (s *Route53HealthCheckSupplier) Resources() ([]resource.Resource, error) {
|
||||||
healthChecks, err := s.client.ListAllHealthChecks()
|
healthChecks, err := s.client.ListAllHealthChecks()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsRoute53HealthCheckResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsRoute53HealthCheckResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (s Route53HealthCheckSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53HealthCheckSupplier) readHealthCheck(healthCheck *route53.HealthCheck) (cty.Value, error) {
|
func (s *Route53HealthCheckSupplier) readHealthCheck(healthCheck *route53.HealthCheck) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *healthCheck.Id,
|
ID: *healthCheck.Id,
|
||||||
Ty: aws.AwsRoute53HealthCheckResourceType,
|
Ty: aws.AwsRoute53HealthCheckResourceType,
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewRoute53RecordSupplier(provider *AWSTerraformProvider) *Route53RecordSupp
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner())}
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner())}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53RecordSupplier) Resources() ([]resource.Resource, error) {
|
func (s *Route53RecordSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
zones, err := s.listZones()
|
zones, err := s.listZones()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -52,7 +52,7 @@ func (s Route53RecordSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53RecordSupplier) listZones() ([][2]string, error) {
|
func (s *Route53RecordSupplier) listZones() ([][2]string, error) {
|
||||||
results := make([][2]string, 0)
|
results := make([][2]string, 0)
|
||||||
zones, err := s.client.ListAllZones()
|
zones, err := s.client.ListAllZones()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -66,7 +66,7 @@ func (s Route53RecordSupplier) listZones() ([][2]string, error) {
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53RecordSupplier) listRecordsForZone(zoneId string, zoneName string) error {
|
func (s *Route53RecordSupplier) listRecordsForZone(zoneId string, zoneName string) error {
|
||||||
|
|
||||||
records, err := s.client.ListRecordsForZone(zoneId)
|
records, err := s.client.ListRecordsForZone(zoneId)
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ func NewRoute53ZoneSupplier(provider *AWSTerraformProvider) *Route53ZoneSupplier
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53ZoneSupplier) Resources() ([]resource.Resource, error) {
|
func (s *Route53ZoneSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
zones, err := s.client.ListAllZones()
|
zones, err := s.client.ListAllZones()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -55,7 +55,7 @@ func (s Route53ZoneSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(results)
|
return s.deserializer.Deserialize(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Route53ZoneSupplier) readZone(hostedZone route53.HostedZone) (cty.Value, error) {
|
func (s *Route53ZoneSupplier) readZone(hostedZone route53.HostedZone) (cty.Value, error) {
|
||||||
name := *hostedZone.Name
|
name := *hostedZone.Name
|
||||||
|
|
||||||
zone, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
zone, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewRouteSupplier(provider *AWSTerraformProvider) *RouteSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteSupplier) Resources() ([]resource.Resource, error) {
|
func (s *RouteSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
routeTables, err := listRouteTables(s.client, aws.AwsRouteResourceType)
|
routeTables, err := listRouteTables(s.client, aws.AwsRouteResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -59,7 +59,7 @@ func (s RouteSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return deserializedRoutes, nil
|
return deserializedRoutes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteSupplier) readRoute(tableId string, route ec2.Route) (cty.Value, error) {
|
func (s *RouteSupplier) readRoute(tableId string, route ec2.Route) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsRouteResourceType
|
var Ty resource.ResourceType = aws.AwsRouteResourceType
|
||||||
|
|
||||||
attributes := map[string]interface{}{
|
attributes := map[string]interface{}{
|
||||||
|
|
|
@ -29,7 +29,7 @@ func NewRouteTableAssociationSupplier(provider *AWSTerraformProvider) *RouteTabl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteTableAssociationSupplier) Resources() ([]resource.Resource, error) {
|
func (s *RouteTableAssociationSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
tables, err := listRouteTables(s.client, aws.AwsRouteTableAssociationResourceType)
|
tables, err := listRouteTables(s.client, aws.AwsRouteTableAssociationResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -64,7 +64,7 @@ func (s RouteTableAssociationSupplier) Resources() ([]resource.Resource, error)
|
||||||
return deserializedRouteTableAssociations, nil
|
return deserializedRouteTableAssociations, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteTableAssociationSupplier) readRouteTableAssociation(assoc ec2.RouteTableAssociation) (cty.Value, error) {
|
func (s *RouteTableAssociationSupplier) readRouteTableAssociation(assoc ec2.RouteTableAssociation) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsRouteTableAssociationResourceType
|
var Ty resource.ResourceType = aws.AwsRouteTableAssociationResourceType
|
||||||
attributes := map[string]interface{}{
|
attributes := map[string]interface{}{
|
||||||
"route_table_id": *assoc.RouteTableId,
|
"route_table_id": *assoc.RouteTableId,
|
||||||
|
@ -83,7 +83,7 @@ func (s RouteTableAssociationSupplier) readRouteTableAssociation(assoc ec2.Route
|
||||||
return *val, nil
|
return *val, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteTableAssociationSupplier) shouldBeIgnored(assoc *ec2.RouteTableAssociation) bool {
|
func (s *RouteTableAssociationSupplier) shouldBeIgnored(assoc *ec2.RouteTableAssociation) bool {
|
||||||
|
|
||||||
// Ignore when nothing is associated
|
// Ignore when nothing is associated
|
||||||
if assoc.GatewayId == nil && assoc.SubnetId == nil {
|
if assoc.GatewayId == nil && assoc.SubnetId == nil {
|
||||||
|
|
|
@ -37,14 +37,17 @@ func NewRouteTableSupplier(provider *AWSTerraformProvider) *RouteTableSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteTableSupplier) Resources() ([]resource.Resource, error) {
|
func (s *RouteTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
|
|
||||||
retrievedRouteTables, err := listRouteTables(s.client, aws.AwsRouteTableResourceType)
|
results, err := listRouteTables(s.client, aws.AwsRouteTableResourceType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, routeTable := range retrievedRouteTables {
|
retrievedDefaultRouteTables := []*ec2.RouteTable{}
|
||||||
|
retrievedRouteTables := []*ec2.RouteTable{}
|
||||||
|
|
||||||
|
for _, routeTable := range results {
|
||||||
res := *routeTable
|
res := *routeTable
|
||||||
var isMain bool
|
var isMain bool
|
||||||
for _, assoc := range res.Associations {
|
for _, assoc := range res.Associations {
|
||||||
|
@ -54,13 +57,16 @@ func (s RouteTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if isMain {
|
if isMain {
|
||||||
s.defaultRouteTableRunner.Run(func() (cty.Value, error) {
|
retrievedDefaultRouteTables = append(retrievedDefaultRouteTables, &res)
|
||||||
return s.readRouteTable(res, true)
|
|
||||||
})
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.routeTableRunner.Run(func() (cty.Value, error) {
|
retrievedRouteTables = append(retrievedRouteTables, &res)
|
||||||
return s.readRouteTable(res, false)
|
}
|
||||||
|
|
||||||
|
for _, routeTable := range retrievedDefaultRouteTables {
|
||||||
|
res := *routeTable
|
||||||
|
s.defaultRouteTableRunner.Run(func() (cty.Value, error) {
|
||||||
|
return s.readRouteTable(res, true)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +75,14 @@ func (s RouteTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, routeTable := range retrievedRouteTables {
|
||||||
|
res := *routeTable
|
||||||
|
s.routeTableRunner.Run(func() (cty.Value, error) {
|
||||||
|
return s.readRouteTable(res, false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
routeTableResources, err := s.routeTableRunner.Wait()
|
routeTableResources, err := s.routeTableRunner.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -91,7 +105,7 @@ func (s RouteTableSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return resources, nil
|
return resources, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s RouteTableSupplier) readRouteTable(routeTable ec2.RouteTable, isMain bool) (cty.Value, error) {
|
func (s *RouteTableSupplier) readRouteTable(routeTable ec2.RouteTable, isMain bool) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsRouteTableResourceType
|
var Ty resource.ResourceType = aws.AwsRouteTableResourceType
|
||||||
attributes := map[string]interface{}{}
|
attributes := map[string]interface{}{}
|
||||||
if isMain {
|
if isMain {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -15,10 +16,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketAnalyticSupplier struct {
|
type S3BucketAnalyticSupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketAnalyticSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketAnalyticSupplier {
|
func NewS3BucketAnalyticSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketAnalyticSupplier {
|
||||||
|
@ -27,6 +29,7 @@ func NewS3BucketAnalyticSupplier(provider *AWSTerraformProvider, repository repo
|
||||||
awsdeserializer.NewS3BucketAnalyticDeserializer(),
|
awsdeserializer.NewS3BucketAnalyticDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +45,7 @@ func (s *S3BucketAnalyticSupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := s.listBucketAnalyticConfiguration(&bucket, region); err != nil {
|
if err := s.listBucketAnalyticConfiguration(&bucket, region); err != nil {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -66,18 +67,6 @@ func TestS3BucketAnalyticSupplier_Resources(t *testing.T) {
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketAnalyticsConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
|
||||||
"eu-west-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.AnalyticsConfiguration{
|
|
||||||
{Id: awssdk.String("Analytics_Bucket1")},
|
|
||||||
{Id: awssdk.String("Analytics2_Bucket1")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
|
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketAnalyticsConfigurations",
|
"ListBucketAnalyticsConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
||||||
|
@ -89,18 +78,6 @@ func TestS3BucketAnalyticSupplier_Resources(t *testing.T) {
|
||||||
},
|
},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketAnalyticsConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift3")},
|
|
||||||
"ap-northeast-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.AnalyticsConfiguration{
|
|
||||||
{Id: awssdk.String("Analytics_Bucket3")},
|
|
||||||
{Id: awssdk.String("Analytics2_Bucket3")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -124,14 +101,14 @@ func TestS3BucketAnalyticSupplier_Resources(t *testing.T) {
|
||||||
"GetBucketLocation",
|
"GetBucketLocation",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
).Return(
|
).Return(
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketAnalyticsConfigurations",
|
"ListBucketAnalyticsConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
).Return(
|
).Return(
|
||||||
nil,
|
nil,
|
||||||
awserr.NewRequestFailure(nil, 403, ""),
|
awserr.NewRequestFailure(nil, 403, ""),
|
||||||
|
@ -169,6 +146,10 @@ func TestS3BucketAnalyticSupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -15,10 +16,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketInventorySupplier struct {
|
type S3BucketInventorySupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketInventorySupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketInventorySupplier {
|
func NewS3BucketInventorySupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketInventorySupplier {
|
||||||
|
@ -27,6 +29,7 @@ func NewS3BucketInventorySupplier(provider *AWSTerraformProvider, repository rep
|
||||||
awsdeserializer.NewS3BucketInventoryDeserializer(),
|
awsdeserializer.NewS3BucketInventoryDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +45,7 @@ func (s *S3BucketInventorySupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := s.listBucketInventoryConfiguration(&bucket, region); err != nil {
|
if err := s.listBucketInventoryConfiguration(&bucket, region); err != nil {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -64,18 +65,6 @@ func TestS3BucketInventorySupplier_Resources(t *testing.T) {
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketInventoryConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
|
||||||
"eu-west-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.InventoryConfiguration{
|
|
||||||
{Id: awssdk.String("Inventory_Bucket1")},
|
|
||||||
{Id: awssdk.String("Inventory2_Bucket1")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
|
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketInventoryConfigurations",
|
"ListBucketInventoryConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
||||||
|
@ -87,18 +76,6 @@ func TestS3BucketInventorySupplier_Resources(t *testing.T) {
|
||||||
},
|
},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketInventoryConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift3")},
|
|
||||||
"eu-west-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.InventoryConfiguration{
|
|
||||||
{Id: awssdk.String("Inventory_Bucket3")},
|
|
||||||
{Id: awssdk.String("Inventory2_Bucket3")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -121,18 +98,17 @@ func TestS3BucketInventorySupplier_Resources(t *testing.T) {
|
||||||
"GetBucketLocation",
|
"GetBucketLocation",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
).Return(
|
).Return(
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketInventoryConfigurations",
|
"ListBucketInventoryConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
).Return(
|
).Return(
|
||||||
nil,
|
nil,
|
||||||
awserr.NewRequestFailure(nil, 403, ""),
|
awserr.NewRequestFailure(nil, 403, ""),
|
||||||
)
|
)
|
||||||
|
|
||||||
},
|
},
|
||||||
wantErr: remoteerror.NewResourceEnumerationError(awserr.NewRequestFailure(nil, 403, ""), resourceaws.AwsS3BucketInventoryResourceType),
|
wantErr: remoteerror.NewResourceEnumerationError(awserr.NewRequestFailure(nil, 403, ""), resourceaws.AwsS3BucketInventoryResourceType),
|
||||||
},
|
},
|
||||||
|
@ -165,6 +141,10 @@ func TestS3BucketInventorySupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -64,18 +65,6 @@ func TestS3BucketMetricSupplier_Resources(t *testing.T) {
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketMetricsConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
|
||||||
"eu-west-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.MetricsConfiguration{
|
|
||||||
{Id: awssdk.String("Metrics_Bucket1")},
|
|
||||||
{Id: awssdk.String("Metrics2_Bucket1")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
|
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketMetricsConfigurations",
|
"ListBucketMetricsConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift2")},
|
||||||
|
@ -87,18 +76,6 @@ func TestS3BucketMetricSupplier_Resources(t *testing.T) {
|
||||||
},
|
},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
|
||||||
"ListBucketMetricsConfigurations",
|
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift3")},
|
|
||||||
"ap-northeast-1",
|
|
||||||
).Return(
|
|
||||||
[]*s3.MetricsConfiguration{
|
|
||||||
{Id: awssdk.String("Metrics_Bucket3")},
|
|
||||||
{Id: awssdk.String("Metrics2_Bucket3")},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -121,14 +98,14 @@ func TestS3BucketMetricSupplier_Resources(t *testing.T) {
|
||||||
"GetBucketLocation",
|
"GetBucketLocation",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
).Return(
|
).Return(
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
repository.On(
|
repository.On(
|
||||||
"ListBucketMetricsConfigurations",
|
"ListBucketMetricsConfigurations",
|
||||||
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
&s3.Bucket{Name: awssdk.String("bucket-martin-test-drift")},
|
||||||
"eu-west-1",
|
"eu-west-3",
|
||||||
).Return(
|
).Return(
|
||||||
nil,
|
nil,
|
||||||
awserr.NewRequestFailure(nil, 403, ""),
|
awserr.NewRequestFailure(nil, 403, ""),
|
||||||
|
@ -165,6 +142,10 @@ func TestS3BucketMetricSupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -15,10 +16,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketMetricSupplier struct {
|
type S3BucketMetricSupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketMetricSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketMetricSupplier {
|
func NewS3BucketMetricSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketMetricSupplier {
|
||||||
|
@ -27,6 +29,7 @@ func NewS3BucketMetricSupplier(provider *AWSTerraformProvider, repository reposi
|
||||||
awsdeserializer.NewS3BucketMetricDeserializer(),
|
awsdeserializer.NewS3BucketMetricDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +45,7 @@ func (s *S3BucketMetricSupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := s.listBucketMetricConfiguration(&bucket, region); err != nil {
|
if err := s.listBucketMetricConfiguration(&bucket, region); err != nil {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -12,10 +13,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketNotificationSupplier struct {
|
type S3BucketNotificationSupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketNotificationSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketNotificationSupplier {
|
func NewS3BucketNotificationSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketNotificationSupplier {
|
||||||
|
@ -24,6 +26,7 @@ func NewS3BucketNotificationSupplier(provider *AWSTerraformProvider, repository
|
||||||
awsdeserializer.NewS3BucketNotificationDeserializer(),
|
awsdeserializer.NewS3BucketNotificationDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +42,7 @@ func (s *S3BucketNotificationSupplier) Resources() ([]resource.Resource, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.runner.Run(func() (cty.Value, error) {
|
s.runner.Run(func() (cty.Value, error) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -119,6 +120,10 @@ func TestS3BucketNotificationSupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -12,10 +13,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketPolicySupplier struct {
|
type S3BucketPolicySupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketPolicySupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketPolicySupplier {
|
func NewS3BucketPolicySupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketPolicySupplier {
|
||||||
|
@ -24,6 +26,7 @@ func NewS3BucketPolicySupplier(provider *AWSTerraformProvider, repository reposi
|
||||||
awsdeserializer.NewS3BucketPolicyDeserializer(),
|
awsdeserializer.NewS3BucketPolicyDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +42,7 @@ func (s *S3BucketPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.runner.Run(func() (cty.Value, error) {
|
s.runner.Run(func() (cty.Value, error) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -120,6 +121,10 @@ func TestS3BucketPolicySupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -2,21 +2,25 @@ package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
|
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
"github.com/cloudskiff/driftctl/pkg/terraform"
|
"github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
"github.com/zclconf/go-cty/cty"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3BucketSupplier struct {
|
type S3BucketSupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
repository repository.S3Repository
|
repository repository.S3Repository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
providerConfig tf.TerraformProviderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewS3BucketSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketSupplier {
|
func NewS3BucketSupplier(provider *AWSTerraformProvider, repository repository.S3Repository) *S3BucketSupplier {
|
||||||
|
@ -25,10 +29,11 @@ func NewS3BucketSupplier(provider *AWSTerraformProvider, repository repository.S
|
||||||
awsdeserializer.NewS3BucketDeserializer(),
|
awsdeserializer.NewS3BucketDeserializer(),
|
||||||
repository,
|
repository,
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
provider.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s S3BucketSupplier) Resources() ([]resource.Resource, error) {
|
func (s *S3BucketSupplier) Resources() ([]resource.Resource, error) {
|
||||||
buckets, err := s.repository.ListAllBuckets()
|
buckets, err := s.repository.ListAllBuckets()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsS3BucketResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsS3BucketResourceType)
|
||||||
|
@ -53,7 +58,7 @@ func (s *S3BucketSupplier) readBucket(bucket s3.Bucket) (cty.Value, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cty.NilVal, err
|
return cty.NilVal, err
|
||||||
}
|
}
|
||||||
if region == "" {
|
if region == "" || region != s.providerConfig.DefaultAlias {
|
||||||
return cty.NilVal, nil
|
return cty.NilVal, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,12 @@ import (
|
||||||
awssdk "github.com/aws/aws-sdk-go/aws"
|
awssdk "github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/parallel"
|
"github.com/cloudskiff/driftctl/pkg/parallel"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/client"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
tf "github.com/cloudskiff/driftctl/pkg/remote/terraform"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
awsdeserializer "github.com/cloudskiff/driftctl/pkg/resource/aws/deserializer"
|
||||||
|
@ -100,6 +102,10 @@ func TestS3BucketSupplier_Resources(t *testing.T) {
|
||||||
deserializer,
|
deserializer,
|
||||||
&mock,
|
&mock,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
tf.TerraformProviderConfig{
|
||||||
|
Name: "test",
|
||||||
|
DefaultAlias: "eu-west-3",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(t, err, tt.wantErr)
|
assert.Equal(t, err, tt.wantErr)
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewSNSTopicPolicySupplier(provider *AWSTerraformProvider) *SNSTopicPolicySu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicPolicySupplier) Resources() ([]resource.Resource, error) {
|
func (s *SNSTopicPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
topics, err := s.client.ListAllTopics()
|
topics, err := s.client.ListAllTopics()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationErrorWithType(err, aws.AwsSnsTopicPolicyResourceType, aws.AwsSnsTopicResourceType)
|
return nil, remoteerror.NewResourceEnumerationErrorWithType(err, aws.AwsSnsTopicPolicyResourceType, aws.AwsSnsTopicResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (s SNSTopicPolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicPolicySupplier) readTopicPolicy(topic sns.Topic) (cty.Value, error) {
|
func (s *SNSTopicPolicySupplier) readTopicPolicy(topic sns.Topic) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *topic.TopicArn,
|
ID: *topic.TopicArn,
|
||||||
Ty: aws.AwsSnsTopicPolicyResourceType,
|
Ty: aws.AwsSnsTopicPolicyResourceType,
|
||||||
|
|
|
@ -1,12 +1,17 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
awssdk "github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/service/sns"
|
"github.com/aws/aws-sdk-go/service/sns"
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/alerter"
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/remote/aws/repository"
|
||||||
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
|
||||||
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
"github.com/cloudskiff/driftctl/pkg/remote/deserializer"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||||
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
"github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
|
@ -14,23 +19,39 @@ import (
|
||||||
"github.com/cloudskiff/driftctl/pkg/terraform"
|
"github.com/cloudskiff/driftctl/pkg/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type pendingTopicAlert struct {
|
||||||
|
endpoint *string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pendingTopicAlert) Message() string {
|
||||||
|
return fmt.Sprintf("%s with pending confirmation status for endpoint \"%s\" will be ignored",
|
||||||
|
aws.AwsSnsTopicSubscriptionResourceType,
|
||||||
|
awssdk.StringValue(p.endpoint))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pendingTopicAlert) ShouldIgnoreResource() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
type SNSTopicSubscriptionSupplier struct {
|
type SNSTopicSubscriptionSupplier struct {
|
||||||
reader terraform.ResourceReader
|
reader terraform.ResourceReader
|
||||||
deserializer deserializer.CTYDeserializer
|
deserializer deserializer.CTYDeserializer
|
||||||
client repository.SNSRepository
|
client repository.SNSRepository
|
||||||
runner *terraform.ParallelResourceReader
|
runner *terraform.ParallelResourceReader
|
||||||
|
alerter alerter.AlerterInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSNSTopicSubscriptionSupplier(provider *AWSTerraformProvider) *SNSTopicSubscriptionSupplier {
|
func NewSNSTopicSubscriptionSupplier(provider *AWSTerraformProvider, a alerter.AlerterInterface) *SNSTopicSubscriptionSupplier {
|
||||||
return &SNSTopicSubscriptionSupplier{
|
return &SNSTopicSubscriptionSupplier{
|
||||||
provider,
|
provider,
|
||||||
awsdeserializer.NewSNSTopicSubscriptionDeserializer(),
|
awsdeserializer.NewSNSTopicSubscriptionDeserializer(),
|
||||||
repository.NewSNSClient(provider.session),
|
repository.NewSNSClient(provider.session),
|
||||||
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
terraform.NewParallelResourceReader(provider.Runner().SubRunner()),
|
||||||
|
a,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicSubscriptionSupplier) Resources() ([]resource.Resource, error) {
|
func (s *SNSTopicSubscriptionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
subscriptions, err := s.client.ListAllSubscriptions()
|
subscriptions, err := s.client.ListAllSubscriptions()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSnsTopicSubscriptionResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSnsTopicSubscriptionResourceType)
|
||||||
|
@ -38,7 +59,7 @@ func (s SNSTopicSubscriptionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
for _, subscription := range subscriptions {
|
for _, subscription := range subscriptions {
|
||||||
subscription := subscription
|
subscription := subscription
|
||||||
s.runner.Run(func() (cty.Value, error) {
|
s.runner.Run(func() (cty.Value, error) {
|
||||||
return s.readTopicSubscription(subscription)
|
return s.readTopicSubscription(subscription, s.alerter)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +71,15 @@ func (s SNSTopicSubscriptionSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicSubscriptionSupplier) readTopicSubscription(subscription *sns.Subscription) (cty.Value, error) {
|
func (s *SNSTopicSubscriptionSupplier) readTopicSubscription(subscription *sns.Subscription, alertr alerter.AlerterInterface) (cty.Value, error) {
|
||||||
|
if subscription.SubscriptionArn != nil && *subscription.SubscriptionArn == "PendingConfirmation" {
|
||||||
|
alertr.SendAlert(
|
||||||
|
fmt.Sprintf("%s.%s", aws.AwsSnsTopicSubscriptionResourceType, *subscription.SubscriptionArn),
|
||||||
|
&pendingTopicAlert{subscription.Endpoint},
|
||||||
|
)
|
||||||
|
return cty.NilVal, nil
|
||||||
|
}
|
||||||
|
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *subscription.SubscriptionArn,
|
ID: *subscription.SubscriptionArn,
|
||||||
Ty: aws.AwsSnsTopicSubscriptionResourceType,
|
Ty: aws.AwsSnsTopicSubscriptionResourceType,
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/service/sns"
|
"github.com/aws/aws-sdk-go/service/sns"
|
||||||
|
|
||||||
|
"github.com/cloudskiff/driftctl/pkg/alerter"
|
||||||
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error"
|
||||||
|
|
||||||
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
resourceaws "github.com/cloudskiff/driftctl/pkg/resource/aws"
|
||||||
|
@ -35,6 +36,7 @@ func TestSNSTopicSubscriptionSupplier_Resources(t *testing.T) {
|
||||||
test string
|
test string
|
||||||
dirName string
|
dirName string
|
||||||
mocks func(client *mocks.SNSRepository)
|
mocks func(client *mocks.SNSRepository)
|
||||||
|
alerts alerter.Alerts
|
||||||
err error
|
err error
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -56,6 +58,23 @@ func TestSNSTopicSubscriptionSupplier_Resources(t *testing.T) {
|
||||||
},
|
},
|
||||||
err: nil,
|
err: nil,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
test: "Multiple SNSTopic Subscription with one pending",
|
||||||
|
dirName: "sns_topic_subscription_multiple",
|
||||||
|
mocks: func(client *mocks.SNSRepository) {
|
||||||
|
client.On("ListAllSubscriptions").Return([]*sns.Subscription{
|
||||||
|
{SubscriptionArn: aws.String("PendingConfirmation"), Endpoint: aws.String("TEST")},
|
||||||
|
{SubscriptionArn: aws.String("arn:aws:sns:us-east-1:526954929923:user-updates-topic2:c0f794c5-a009-4db4-9147-4c55959787fa")},
|
||||||
|
{SubscriptionArn: aws.String("arn:aws:sns:us-east-1:526954929923:user-updates-topic:b6e66147-2b31-4486-8d4b-2a2272264c8e")},
|
||||||
|
}, nil)
|
||||||
|
},
|
||||||
|
alerts: map[string][]alerter.Alert{
|
||||||
|
"aws_sns_topic_subscription.PendingConfirmation": []alerter.Alert{
|
||||||
|
&pendingTopicAlert{aws.String("TEST")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
test: "cannot list SNSTopic subscription",
|
test: "cannot list SNSTopic subscription",
|
||||||
dirName: "sns_topic_subscription_list",
|
dirName: "sns_topic_subscription_list",
|
||||||
|
@ -72,14 +91,16 @@ func TestSNSTopicSubscriptionSupplier_Resources(t *testing.T) {
|
||||||
supplierLibrary := resource.NewSupplierLibrary()
|
supplierLibrary := resource.NewSupplierLibrary()
|
||||||
|
|
||||||
if shouldUpdate {
|
if shouldUpdate {
|
||||||
|
a := alerter.NewAlerter()
|
||||||
provider, err := InitTestAwsProvider(providerLibrary)
|
provider, err := InitTestAwsProvider(providerLibrary)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
supplierLibrary.AddSupplier(NewSNSTopicSubscriptionSupplier(provider))
|
supplierLibrary.AddSupplier(NewSNSTopicSubscriptionSupplier(provider, a))
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run(c.test, func(tt *testing.T) {
|
t.Run(c.test, func(tt *testing.T) {
|
||||||
|
a := alerter.NewAlerter()
|
||||||
fakeClient := mocks.SNSRepository{}
|
fakeClient := mocks.SNSRepository{}
|
||||||
c.mocks(&fakeClient)
|
c.mocks(&fakeClient)
|
||||||
provider := mocks2.NewMockedGoldenTFProvider(c.dirName, providerLibrary.Provider(terraform.AWS), shouldUpdate)
|
provider := mocks2.NewMockedGoldenTFProvider(c.dirName, providerLibrary.Provider(terraform.AWS), shouldUpdate)
|
||||||
|
@ -89,10 +110,15 @@ func TestSNSTopicSubscriptionSupplier_Resources(t *testing.T) {
|
||||||
topicSubscriptionDeserializer,
|
topicSubscriptionDeserializer,
|
||||||
&fakeClient,
|
&fakeClient,
|
||||||
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
terraform.NewParallelResourceReader(parallel.NewParallelRunner(context.TODO(), 10)),
|
||||||
|
a,
|
||||||
}
|
}
|
||||||
got, err := s.Resources()
|
got, err := s.Resources()
|
||||||
assert.Equal(tt, c.err, err)
|
assert.Equal(tt, c.err, err)
|
||||||
|
|
||||||
|
if c.alerts == nil {
|
||||||
|
c.alerts = map[string][]alerter.Alert{}
|
||||||
|
}
|
||||||
|
assert.Equal(tt, c.alerts, a.Retrieve())
|
||||||
mock.AssertExpectationsForObjects(tt)
|
mock.AssertExpectationsForObjects(tt)
|
||||||
test.CtyTestDiff(got, c.dirName, provider, topicSubscriptionDeserializer, shouldUpdate, tt)
|
test.CtyTestDiff(got, c.dirName, provider, topicSubscriptionDeserializer, shouldUpdate, tt)
|
||||||
})
|
})
|
||||||
|
|
|
@ -30,7 +30,7 @@ func NewSNSTopicSupplier(provider *AWSTerraformProvider) *SNSTopicSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicSupplier) Resources() ([]resource.Resource, error) {
|
func (s *SNSTopicSupplier) Resources() ([]resource.Resource, error) {
|
||||||
topics, err := s.client.ListAllTopics()
|
topics, err := s.client.ListAllTopics()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSnsTopicResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSnsTopicResourceType)
|
||||||
|
@ -51,7 +51,7 @@ func (s SNSTopicSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(retrieve)
|
return s.deserializer.Deserialize(retrieve)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SNSTopicSupplier) readTopic(topic sns.Topic) (cty.Value, error) {
|
func (s *SNSTopicSupplier) readTopic(topic sns.Topic) (cty.Value, error) {
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
ID: *topic.TopicArn,
|
ID: *topic.TopicArn,
|
||||||
Ty: aws.AwsSnsTopicResourceType,
|
Ty: aws.AwsSnsTopicResourceType,
|
||||||
|
|
|
@ -28,7 +28,7 @@ func NewSqsQueuePolicySupplier(provider *AWSTerraformProvider) *SqsQueuePolicySu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqsQueuePolicySupplier) Resources() ([]resource.Resource, error) {
|
func (s *SqsQueuePolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
queues, err := s.client.ListAllQueues()
|
queues, err := s.client.ListAllQueues()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationErrorWithType(err, aws.AwsSqsQueuePolicyResourceType, aws.AwsSqsQueueResourceType)
|
return nil, remoteerror.NewResourceEnumerationErrorWithType(err, aws.AwsSqsQueuePolicyResourceType, aws.AwsSqsQueueResourceType)
|
||||||
|
@ -49,7 +49,7 @@ func (s SqsQueuePolicySupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(resources)
|
return s.deserializer.Deserialize(resources)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqsQueuePolicySupplier) readSqsQueuePolicy(queueURL string) (cty.Value, error) {
|
func (s *SqsQueuePolicySupplier) readSqsQueuePolicy(queueURL string) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsSqsQueuePolicyResourceType
|
var Ty resource.ResourceType = aws.AwsSqsQueuePolicyResourceType
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: Ty,
|
Ty: Ty,
|
||||||
|
|
|
@ -28,7 +28,7 @@ func NewSqsQueueSupplier(provider *AWSTerraformProvider) *SqsQueueSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqsQueueSupplier) Resources() ([]resource.Resource, error) {
|
func (s *SqsQueueSupplier) Resources() ([]resource.Resource, error) {
|
||||||
queues, err := s.client.ListAllQueues()
|
queues, err := s.client.ListAllQueues()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSqsQueueResourceType)
|
return nil, remoteerror.NewResourceEnumerationError(err, aws.AwsSqsQueueResourceType)
|
||||||
|
@ -49,7 +49,7 @@ func (s SqsQueueSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return s.deserializer.Deserialize(resources)
|
return s.deserializer.Deserialize(resources)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqsQueueSupplier) readSqsQueue(queueURL string) (cty.Value, error) {
|
func (s *SqsQueueSupplier) readSqsQueue(queueURL string) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsSqsQueueResourceType
|
var Ty resource.ResourceType = aws.AwsSqsQueueResourceType
|
||||||
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
val, err := s.reader.ReadResource(terraform.ReadResourceArgs{
|
||||||
Ty: Ty,
|
Ty: Ty,
|
||||||
|
|
|
@ -36,7 +36,7 @@ func NewSubnetSupplier(provider *AWSTerraformProvider) *SubnetSupplier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SubnetSupplier) Resources() ([]resource.Resource, error) {
|
func (s *SubnetSupplier) Resources() ([]resource.Resource, error) {
|
||||||
input := ec2.DescribeSubnetsInput{}
|
input := ec2.DescribeSubnetsInput{}
|
||||||
var subnets []*ec2.Subnet
|
var subnets []*ec2.Subnet
|
||||||
var defaultSubnets []*ec2.Subnet
|
var defaultSubnets []*ec2.Subnet
|
||||||
|
@ -64,6 +64,11 @@ func (s SubnetSupplier) Resources() ([]resource.Resource, error) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
subnetResources, err := s.subnetRunner.Wait()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
for _, item := range defaultSubnets {
|
for _, item := range defaultSubnets {
|
||||||
res := *item
|
res := *item
|
||||||
s.defaultSubnetRunner.Run(func() (cty.Value, error) {
|
s.defaultSubnetRunner.Run(func() (cty.Value, error) {
|
||||||
|
@ -76,10 +81,6 @@ func (s SubnetSupplier) Resources() ([]resource.Resource, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
subnetResources, err := s.subnetRunner.Wait()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deserialize
|
// Deserialize
|
||||||
deserializedDefaultSubnets, err := s.defaultSubnetDeserializer.Deserialize(defaultSubnetResources)
|
deserializedDefaultSubnets, err := s.defaultSubnetDeserializer.Deserialize(defaultSubnetResources)
|
||||||
|
@ -98,7 +99,7 @@ func (s SubnetSupplier) Resources() ([]resource.Resource, error) {
|
||||||
return resources, nil
|
return resources, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SubnetSupplier) readSubnet(subnet ec2.Subnet) (cty.Value, error) {
|
func (s *SubnetSupplier) readSubnet(subnet ec2.Subnet) (cty.Value, error) {
|
||||||
var Ty resource.ResourceType = aws.AwsSubnetResourceType
|
var Ty resource.ResourceType = aws.AwsSubnetResourceType
|
||||||
if subnet.DefaultForAz != nil && *subnet.DefaultForAz {
|
if subnet.DefaultForAz != nil && *subnet.DefaultForAz {
|
||||||
Ty = aws.AwsDefaultSubnetResourceType
|
Ty = aws.AwsDefaultSubnetResourceType
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZmlsdGVyIjpbXSwiaWQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzOkFuYWx5dGljczJfQnVja2V0MyIsIm5hbWUiOiJBbmFseXRpY3MyX0J1Y2tldDMiLCJzdG9yYWdlX2NsYXNzX2FuYWx5c2lzIjpbeyJkYXRhX2V4cG9ydCI6W3siZGVzdGluYXRpb24iOlt7InMzX2J1Y2tldF9kZXN0aW5hdGlvbiI6W3siYnVja2V0X2FjY291bnRfaWQiOiIiLCJidWNrZXRfYXJuIjoiYXJuOmF3czpzMzo6OmJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDMiLCJmb3JtYXQiOiJDU1YiLCJwcmVmaXgiOiIifV19XSwib3V0cHV0X3NjaGVtYV92ZXJzaW9uIjoiVl8xIn1dfV19",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZmlsdGVyIjpbXSwiaWQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzOkFuYWx5dGljc19CdWNrZXQzIiwibmFtZSI6IkFuYWx5dGljc19CdWNrZXQzIiwic3RvcmFnZV9jbGFzc19hbmFseXNpcyI6W3siZGF0YV9leHBvcnQiOlt7ImRlc3RpbmF0aW9uIjpbeyJzM19idWNrZXRfZGVzdGluYXRpb24iOlt7ImJ1Y2tldF9hY2NvdW50X2lkIjoiIiwiYnVja2V0X2FybiI6ImFybjphd3M6czM6OjpidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZm9ybWF0IjoiQ1NWIiwicHJlZml4IjoiIn1dfV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6IlZfMSJ9XX1dfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJmaWx0ZXIiOltdLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDpBbmFseXRpY3MyX0J1Y2tldDEiLCJuYW1lIjoiQW5hbHl0aWNzMl9CdWNrZXQxIiwic3RvcmFnZV9jbGFzc19hbmFseXNpcyI6W3siZGF0YV9leHBvcnQiOlt7ImRlc3RpbmF0aW9uIjpbeyJzM19idWNrZXRfZGVzdGluYXRpb24iOlt7ImJ1Y2tldF9hY2NvdW50X2lkIjoiIiwiYnVja2V0X2FybiI6ImFybjphd3M6czM6OjpidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJmb3JtYXQiOiJDU1YiLCJwcmVmaXgiOiIifV19XSwib3V0cHV0X3NjaGVtYV92ZXJzaW9uIjoiVl8xIn1dfV19",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlsibGlzdCIsWyJvYmplY3QiLHsiZGF0YV9leHBvcnQiOlsibGlzdCIsWyJvYmplY3QiLHsiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImJ1Y2tldF9hY2NvdW50X2lkIjoic3RyaW5nIiwiYnVja2V0X2FybiI6InN0cmluZyIsImZvcm1hdCI6InN0cmluZyIsInByZWZpeCI6InN0cmluZyJ9XV19XV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6InN0cmluZyJ9XV19XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJmaWx0ZXIiOltdLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDpBbmFseXRpY3NfQnVja2V0MSIsIm5hbWUiOiJBbmFseXRpY3NfQnVja2V0MSIsInN0b3JhZ2VfY2xhc3NfYW5hbHlzaXMiOlt7ImRhdGFfZXhwb3J0IjpbeyJkZXN0aW5hdGlvbiI6W3siczNfYnVja2V0X2Rlc3RpbmF0aW9uIjpbeyJidWNrZXRfYWNjb3VudF9pZCI6IiIsImJ1Y2tldF9hcm4iOiJhcm46YXdzOnMzOjo6YnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0IiwiZm9ybWF0IjoiQ1NWIiwicHJlZml4IjoiIn1dfV0sIm91dHB1dF9zY2hlbWFfdmVyc2lvbiI6IlZfMSJ9XX1dfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -52,113 +52,5 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift:Analytics_Bucket1",
|
|
||||||
"name": "Analytics_Bucket1",
|
|
||||||
"storage_class_analysis": [
|
|
||||||
{
|
|
||||||
"data_export": [
|
|
||||||
{
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"s3_bucket_destination": [
|
|
||||||
{
|
|
||||||
"bucket_account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift",
|
|
||||||
"format": "CSV",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output_schema_version": "V_1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift:Analytics2_Bucket1",
|
|
||||||
"name": "Analytics2_Bucket1",
|
|
||||||
"storage_class_analysis": [
|
|
||||||
{
|
|
||||||
"data_export": [
|
|
||||||
{
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"s3_bucket_destination": [
|
|
||||||
{
|
|
||||||
"bucket_account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift",
|
|
||||||
"format": "CSV",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output_schema_version": "V_1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift3:Analytics2_Bucket3",
|
|
||||||
"name": "Analytics2_Bucket3",
|
|
||||||
"storage_class_analysis": [
|
|
||||||
{
|
|
||||||
"data_export": [
|
|
||||||
{
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"s3_bucket_destination": [
|
|
||||||
{
|
|
||||||
"bucket_account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift3",
|
|
||||||
"format": "CSV",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output_schema_version": "V_1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift3:Analytics_Bucket3",
|
|
||||||
"name": "Analytics_Bucket3",
|
|
||||||
"storage_class_analysis": [
|
|
||||||
{
|
|
||||||
"data_export": [
|
|
||||||
{
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"s3_bucket_destination": [
|
|
||||||
{
|
|
||||||
"bucket_account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift3",
|
|
||||||
"format": "CSV",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output_schema_version": "V_1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiYnVja2V0IjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY291bnRfaWQiOiJzdHJpbmciLCJidWNrZXRfYXJuIjoic3RyaW5nIiwiZW5jcnlwdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJzc2Vfa21zIjpbImxpc3QiLFsib2JqZWN0Iix7ImtleV9pZCI6InN0cmluZyJ9XV0sInNzZV9zMyI6WyJsaXN0IixbIm9iamVjdCIse31dXX1dXSwiZm9ybWF0Ijoic3RyaW5nIiwicHJlZml4Ijoic3RyaW5nIn1dXX1dXSwiZW5hYmxlZCI6ImJvb2wiLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIn1dXSwiaWQiOiJzdHJpbmciLCJpbmNsdWRlZF9vYmplY3RfdmVyc2lvbnMiOiJzdHJpbmciLCJuYW1lIjoic3RyaW5nIiwib3B0aW9uYWxfZmllbGRzIjpbInNldCIsInN0cmluZyJdLCJzY2hlZHVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJmcmVxdWVuY3kiOiJzdHJpbmcifV1dfV0=",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZGVzdGluYXRpb24iOlt7ImJ1Y2tldCI6W3siYWNjb3VudF9pZCI6IiIsImJ1Y2tldF9hcm4iOiJhcm46YXdzOnMzOjo6YnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0MyIsImVuY3J5cHRpb24iOltdLCJmb3JtYXQiOiJPUkMiLCJwcmVmaXgiOiIifV19XSwiZW5hYmxlZCI6dHJ1ZSwiZmlsdGVyIjpbXSwiaWQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzOkludmVudG9yeTJfQnVja2V0MyIsImluY2x1ZGVkX29iamVjdF92ZXJzaW9ucyI6IkFsbCIsIm5hbWUiOiJJbnZlbnRvcnkyX0J1Y2tldDMiLCJvcHRpb25hbF9maWVsZHMiOltdLCJzY2hlZHVsZSI6W3siZnJlcXVlbmN5IjoiRGFpbHkifV19",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiYnVja2V0IjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY291bnRfaWQiOiJzdHJpbmciLCJidWNrZXRfYXJuIjoic3RyaW5nIiwiZW5jcnlwdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJzc2Vfa21zIjpbImxpc3QiLFsib2JqZWN0Iix7ImtleV9pZCI6InN0cmluZyJ9XV0sInNzZV9zMyI6WyJsaXN0IixbIm9iamVjdCIse31dXX1dXSwiZm9ybWF0Ijoic3RyaW5nIiwicHJlZml4Ijoic3RyaW5nIn1dXX1dXSwiZW5hYmxlZCI6ImJvb2wiLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIn1dXSwiaWQiOiJzdHJpbmciLCJpbmNsdWRlZF9vYmplY3RfdmVyc2lvbnMiOiJzdHJpbmciLCJuYW1lIjoic3RyaW5nIiwib3B0aW9uYWxfZmllbGRzIjpbInNldCIsInN0cmluZyJdLCJzY2hlZHVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJmcmVxdWVuY3kiOiJzdHJpbmcifV1dfV0=",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZGVzdGluYXRpb24iOlt7ImJ1Y2tldCI6W3siYWNjb3VudF9pZCI6IiIsImJ1Y2tldF9hcm4iOiJhcm46YXdzOnMzOjo6YnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0MyIsImVuY3J5cHRpb24iOltdLCJmb3JtYXQiOiJPUkMiLCJwcmVmaXgiOiIifV19XSwiZW5hYmxlZCI6dHJ1ZSwiZmlsdGVyIjpbXSwiaWQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzOkludmVudG9yeV9CdWNrZXQzIiwiaW5jbHVkZWRfb2JqZWN0X3ZlcnNpb25zIjoiQWxsIiwibmFtZSI6IkludmVudG9yeV9CdWNrZXQzIiwib3B0aW9uYWxfZmllbGRzIjpbXSwic2NoZWR1bGUiOlt7ImZyZXF1ZW5jeSI6IkRhaWx5In1dfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiYnVja2V0IjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY291bnRfaWQiOiJzdHJpbmciLCJidWNrZXRfYXJuIjoic3RyaW5nIiwiZW5jcnlwdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJzc2Vfa21zIjpbImxpc3QiLFsib2JqZWN0Iix7ImtleV9pZCI6InN0cmluZyJ9XV0sInNzZV9zMyI6WyJsaXN0IixbIm9iamVjdCIse31dXX1dXSwiZm9ybWF0Ijoic3RyaW5nIiwicHJlZml4Ijoic3RyaW5nIn1dXX1dXSwiZW5hYmxlZCI6ImJvb2wiLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIn1dXSwiaWQiOiJzdHJpbmciLCJpbmNsdWRlZF9vYmplY3RfdmVyc2lvbnMiOiJzdHJpbmciLCJuYW1lIjoic3RyaW5nIiwib3B0aW9uYWxfZmllbGRzIjpbInNldCIsInN0cmluZyJdLCJzY2hlZHVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJmcmVxdWVuY3kiOiJzdHJpbmcifV1dfV0=",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJkZXN0aW5hdGlvbiI6W3siYnVja2V0IjpbeyJhY2NvdW50X2lkIjoiIiwiYnVja2V0X2FybiI6ImFybjphd3M6czM6OjpidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJlbmNyeXB0aW9uIjpbXSwiZm9ybWF0IjoiT1JDIiwicHJlZml4IjoiIn1dfV0sImVuYWJsZWQiOnRydWUsImZpbHRlciI6W10sImlkIjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0OkludmVudG9yeTJfQnVja2V0MSIsImluY2x1ZGVkX29iamVjdF92ZXJzaW9ucyI6IkFsbCIsIm5hbWUiOiJJbnZlbnRvcnkyX0J1Y2tldDEiLCJvcHRpb25hbF9maWVsZHMiOltdLCJzY2hlZHVsZSI6W3siZnJlcXVlbmN5IjoiRGFpbHkifV19",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZGVzdGluYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiYnVja2V0IjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY291bnRfaWQiOiJzdHJpbmciLCJidWNrZXRfYXJuIjoic3RyaW5nIiwiZW5jcnlwdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJzc2Vfa21zIjpbImxpc3QiLFsib2JqZWN0Iix7ImtleV9pZCI6InN0cmluZyJ9XV0sInNzZV9zMyI6WyJsaXN0IixbIm9iamVjdCIse31dXX1dXSwiZm9ybWF0Ijoic3RyaW5nIiwicHJlZml4Ijoic3RyaW5nIn1dXX1dXSwiZW5hYmxlZCI6ImJvb2wiLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIn1dXSwiaWQiOiJzdHJpbmciLCJpbmNsdWRlZF9vYmplY3RfdmVyc2lvbnMiOiJzdHJpbmciLCJuYW1lIjoic3RyaW5nIiwib3B0aW9uYWxfZmllbGRzIjpbInNldCIsInN0cmluZyJdLCJzY2hlZHVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJmcmVxdWVuY3kiOiJzdHJpbmcifV1dfV0=",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJkZXN0aW5hdGlvbiI6W3siYnVja2V0IjpbeyJhY2NvdW50X2lkIjoiIiwiYnVja2V0X2FybiI6ImFybjphd3M6czM6OjpidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJlbmNyeXB0aW9uIjpbXSwiZm9ybWF0IjoiT1JDIiwicHJlZml4IjoiIn1dfV0sImVuYWJsZWQiOnRydWUsImZpbHRlciI6W10sImlkIjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0OkludmVudG9yeV9CdWNrZXQxIiwiaW5jbHVkZWRfb2JqZWN0X3ZlcnNpb25zIjoiQWxsIiwibmFtZSI6IkludmVudG9yeV9CdWNrZXQxIiwib3B0aW9uYWxfZmllbGRzIjpbXSwic2NoZWR1bGUiOlt7ImZyZXF1ZW5jeSI6IkRhaWx5In1dfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -52,113 +52,5 @@
|
||||||
"frequency": "Daily"
|
"frequency": "Daily"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"bucket": [
|
|
||||||
{
|
|
||||||
"account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift",
|
|
||||||
"encryption": [],
|
|
||||||
"format": "ORC",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"enabled": true,
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift:Inventory2_Bucket1",
|
|
||||||
"included_object_versions": "All",
|
|
||||||
"name": "Inventory2_Bucket1",
|
|
||||||
"optional_fields": [],
|
|
||||||
"schedule": [
|
|
||||||
{
|
|
||||||
"frequency": "Daily"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"bucket": [
|
|
||||||
{
|
|
||||||
"account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift",
|
|
||||||
"encryption": [],
|
|
||||||
"format": "ORC",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"enabled": true,
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift:Inventory_Bucket1",
|
|
||||||
"included_object_versions": "All",
|
|
||||||
"name": "Inventory_Bucket1",
|
|
||||||
"optional_fields": [],
|
|
||||||
"schedule": [
|
|
||||||
{
|
|
||||||
"frequency": "Daily"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"bucket": [
|
|
||||||
{
|
|
||||||
"account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift3",
|
|
||||||
"encryption": [],
|
|
||||||
"format": "ORC",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"enabled": true,
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift3:Inventory_Bucket3",
|
|
||||||
"included_object_versions": "All",
|
|
||||||
"name": "Inventory_Bucket3",
|
|
||||||
"optional_fields": [],
|
|
||||||
"schedule": [
|
|
||||||
{
|
|
||||||
"frequency": "Daily"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"destination": [
|
|
||||||
{
|
|
||||||
"bucket": [
|
|
||||||
{
|
|
||||||
"account_id": "",
|
|
||||||
"bucket_arn": "arn:aws:s3:::bucket-martin-test-drift3",
|
|
||||||
"encryption": [],
|
|
||||||
"format": "ORC",
|
|
||||||
"prefix": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"enabled": true,
|
|
||||||
"filter": [],
|
|
||||||
"id": "bucket-martin-test-drift3:Inventory2_Bucket3",
|
|
||||||
"included_object_versions": "All",
|
|
||||||
"name": "Inventory2_Bucket3",
|
|
||||||
"optional_fields": [],
|
|
||||||
"schedule": [
|
|
||||||
{
|
|
||||||
"frequency": "Daily"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZmlsdGVyIjpudWxsLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDM6TWV0cmljczJfQnVja2V0MyIsIm5hbWUiOiJNZXRyaWNzMl9CdWNrZXQzIn0=",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiZmlsdGVyIjpudWxsLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDM6TWV0cmljc19CdWNrZXQzIiwibmFtZSI6Ik1ldHJpY3NfQnVja2V0MyJ9",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "bnVsbA==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJmaWx0ZXIiOm51bGwsImlkIjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0Ok1ldHJpY3MyX0J1Y2tldDEiLCJuYW1lIjoiTWV0cmljczJfQnVja2V0MSJ9",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiZmlsdGVyIjpbImxpc3QiLFsib2JqZWN0Iix7InByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl19XV0sImlkIjoic3RyaW5nIiwibmFtZSI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJmaWx0ZXIiOm51bGwsImlkIjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0Ok1ldHJpY3NfQnVja2V0MSIsIm5hbWUiOiJNZXRyaWNzX0J1Y2tldDEifQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -5,34 +5,10 @@
|
||||||
"id": "bucket-martin-test-drift2:Metrics2_Bucket2",
|
"id": "bucket-martin-test-drift2:Metrics2_Bucket2",
|
||||||
"name": "Metrics2_Bucket2"
|
"name": "Metrics2_Bucket2"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"filter": null,
|
|
||||||
"id": "bucket-martin-test-drift:Metrics_Bucket1",
|
|
||||||
"name": "Metrics_Bucket1"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"bucket": "bucket-martin-test-drift2",
|
"bucket": "bucket-martin-test-drift2",
|
||||||
"filter": null,
|
"filter": null,
|
||||||
"id": "bucket-martin-test-drift2:Metrics_Bucket2",
|
"id": "bucket-martin-test-drift2:Metrics_Bucket2",
|
||||||
"name": "Metrics_Bucket2"
|
"name": "Metrics_Bucket2"
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"filter": null,
|
|
||||||
"id": "bucket-martin-test-drift:Metrics2_Bucket1",
|
|
||||||
"name": "Metrics2_Bucket1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"filter": null,
|
|
||||||
"id": "bucket-martin-test-drift3:Metrics2_Bucket3",
|
|
||||||
"name": "Metrics2_Bucket3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"filter": null,
|
|
||||||
"id": "bucket-martin-test-drift3:Metrics_Bucket3",
|
|
||||||
"name": "Metrics_Bucket3"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYWNjZWxlcmF0aW9uX3N0YXR1cyI6InN0cmluZyIsImFjbCI6InN0cmluZyIsImFybiI6InN0cmluZyIsImJ1Y2tldCI6InN0cmluZyIsImJ1Y2tldF9kb21haW5fbmFtZSI6InN0cmluZyIsImJ1Y2tldF9wcmVmaXgiOiJzdHJpbmciLCJidWNrZXRfcmVnaW9uYWxfZG9tYWluX25hbWUiOiJzdHJpbmciLCJjb3JzX3J1bGUiOlsibGlzdCIsWyJvYmplY3QiLHsiYWxsb3dlZF9oZWFkZXJzIjpbImxpc3QiLCJzdHJpbmciXSwiYWxsb3dlZF9tZXRob2RzIjpbImxpc3QiLCJzdHJpbmciXSwiYWxsb3dlZF9vcmlnaW5zIjpbImxpc3QiLCJzdHJpbmciXSwiZXhwb3NlX2hlYWRlcnMiOlsibGlzdCIsInN0cmluZyJdLCJtYXhfYWdlX3NlY29uZHMiOiJudW1iZXIifV1dLCJmb3JjZV9kZXN0cm95IjoiYm9vbCIsImdyYW50IjpbInNldCIsWyJvYmplY3QiLHsiaWQiOiJzdHJpbmciLCJwZXJtaXNzaW9ucyI6WyJzZXQiLCJzdHJpbmciXSwidHlwZSI6InN0cmluZyIsInVyaSI6InN0cmluZyJ9XV0sImhvc3RlZF96b25lX2lkIjoic3RyaW5nIiwiaWQiOiJzdHJpbmciLCJsaWZlY3ljbGVfcnVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJhYm9ydF9pbmNvbXBsZXRlX211bHRpcGFydF91cGxvYWRfZGF5cyI6Im51bWJlciIsImVuYWJsZWQiOiJib29sIiwiZXhwaXJhdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJkYXRlIjoic3RyaW5nIiwiZGF5cyI6Im51bWJlciIsImV4cGlyZWRfb2JqZWN0X2RlbGV0ZV9tYXJrZXIiOiJib29sIn1dXSwiaWQiOiJzdHJpbmciLCJub25jdXJyZW50X3ZlcnNpb25fZXhwaXJhdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJkYXlzIjoibnVtYmVyIn1dXSwibm9uY3VycmVudF92ZXJzaW9uX3RyYW5zaXRpb24iOlsic2V0IixbIm9iamVjdCIseyJkYXlzIjoibnVtYmVyIiwic3RvcmFnZV9jbGFzcyI6InN0cmluZyJ9XV0sInByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl0sInRyYW5zaXRpb24iOlsic2V0IixbIm9iamVjdCIseyJkYXRlIjoic3RyaW5nIiwiZGF5cyI6Im51bWJlciIsInN0b3JhZ2VfY2xhc3MiOiJzdHJpbmcifV1dfV1dLCJsb2dnaW5nIjpbInNldCIsWyJvYmplY3QiLHsidGFyZ2V0X2J1Y2tldCI6InN0cmluZyIsInRhcmdldF9wcmVmaXgiOiJzdHJpbmcifV1dLCJvYmplY3RfbG9ja19jb25maWd1cmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7Im9iamVjdF9sb2NrX2VuYWJsZWQiOiJzdHJpbmciLCJydWxlIjpbImxpc3QiLFsib2JqZWN0Iix7ImRlZmF1bHRfcmV0ZW50aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImRheXMiOiJudW1iZXIiLCJtb2RlIjoic3RyaW5nIiwieWVhcnMiOiJudW1iZXIifV1dfV1dfV1dLCJwb2xpY3kiOiJzdHJpbmciLCJyZWdpb24iOiJzdHJpbmciLCJyZXBsaWNhdGlvbl9jb25maWd1cmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7InJvbGUiOiJzdHJpbmciLCJydWxlcyI6WyJzZXQiLFsib2JqZWN0Iix7ImRlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY2Vzc19jb250cm9sX3RyYW5zbGF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7Im93bmVyIjoic3RyaW5nIn1dXSwiYWNjb3VudF9pZCI6InN0cmluZyIsImJ1Y2tldCI6InN0cmluZyIsInJlcGxpY2Ffa21zX2tleV9pZCI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3MiOiJzdHJpbmcifV1dLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIiwidGFncyI6WyJtYXAiLCJzdHJpbmciXX1dXSwiaWQiOiJzdHJpbmciLCJwcmVmaXgiOiJzdHJpbmciLCJwcmlvcml0eSI6Im51bWJlciIsInNvdXJjZV9zZWxlY3Rpb25fY3JpdGVyaWEiOlsibGlzdCIsWyJvYmplY3QiLHsic3NlX2ttc19lbmNyeXB0ZWRfb2JqZWN0cyI6WyJsaXN0IixbIm9iamVjdCIseyJlbmFibGVkIjoiYm9vbCJ9XV19XV0sInN0YXR1cyI6InN0cmluZyJ9XV19XV0sInJlcXVlc3RfcGF5ZXIiOiJzdHJpbmciLCJzZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2NvbmZpZ3VyYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsicnVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJhcHBseV9zZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2J5X2RlZmF1bHQiOlsibGlzdCIsWyJvYmplY3QiLHsia21zX21hc3Rlcl9rZXlfaWQiOiJzdHJpbmciLCJzc2VfYWxnb3JpdGhtIjoic3RyaW5nIn1dXX1dXX1dXSwidGFncyI6WyJtYXAiLCJzdHJpbmciXSwidmVyc2lvbmluZyI6WyJsaXN0IixbIm9iamVjdCIseyJlbmFibGVkIjoiYm9vbCIsIm1mYV9kZWxldGUiOiJib29sIn1dXSwid2Vic2l0ZSI6WyJsaXN0IixbIm9iamVjdCIseyJlcnJvcl9kb2N1bWVudCI6InN0cmluZyIsImluZGV4X2RvY3VtZW50Ijoic3RyaW5nIiwicmVkaXJlY3RfYWxsX3JlcXVlc3RzX3RvIjoic3RyaW5nIiwicm91dGluZ19ydWxlcyI6InN0cmluZyJ9XV0sIndlYnNpdGVfZG9tYWluIjoic3RyaW5nIiwid2Vic2l0ZV9lbmRwb2ludCI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJhY2NlbGVyYXRpb25fc3RhdHVzIjoiIiwiYWNsIjpudWxsLCJhcm4iOiJhcm46YXdzOnMzOjo6YnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0IiwiYnVja2V0IjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0IiwiYnVja2V0X2RvbWFpbl9uYW1lIjoiYnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0LnMzLmFtYXpvbmF3cy5jb20iLCJidWNrZXRfcHJlZml4IjpudWxsLCJidWNrZXRfcmVnaW9uYWxfZG9tYWluX25hbWUiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQuczMuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20iLCJjb3JzX3J1bGUiOltdLCJmb3JjZV9kZXN0cm95IjpudWxsLCJncmFudCI6W10sImhvc3RlZF96b25lX2lkIjoiWjFCS0NUWEQ3NEVaUEUiLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdCIsImxpZmVjeWNsZV9ydWxlIjpbXSwibG9nZ2luZyI6W10sIm9iamVjdF9sb2NrX2NvbmZpZ3VyYXRpb24iOltdLCJwb2xpY3kiOm51bGwsInJlZ2lvbiI6ImV1LXdlc3QtMSIsInJlcGxpY2F0aW9uX2NvbmZpZ3VyYXRpb24iOltdLCJyZXF1ZXN0X3BheWVyIjoiQnVja2V0T3duZXIiLCJzZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2NvbmZpZ3VyYXRpb24iOltdLCJ0YWdzIjp7fSwidmVyc2lvbmluZyI6W3siZW5hYmxlZCI6ZmFsc2UsIm1mYV9kZWxldGUiOmZhbHNlfV0sIndlYnNpdGUiOltdLCJ3ZWJzaXRlX2RvbWFpbiI6bnVsbCwid2Vic2l0ZV9lbmRwb2ludCI6bnVsbH0=",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYWNjZWxlcmF0aW9uX3N0YXR1cyI6InN0cmluZyIsImFjbCI6InN0cmluZyIsImFybiI6InN0cmluZyIsImJ1Y2tldCI6InN0cmluZyIsImJ1Y2tldF9kb21haW5fbmFtZSI6InN0cmluZyIsImJ1Y2tldF9wcmVmaXgiOiJzdHJpbmciLCJidWNrZXRfcmVnaW9uYWxfZG9tYWluX25hbWUiOiJzdHJpbmciLCJjb3JzX3J1bGUiOlsibGlzdCIsWyJvYmplY3QiLHsiYWxsb3dlZF9oZWFkZXJzIjpbImxpc3QiLCJzdHJpbmciXSwiYWxsb3dlZF9tZXRob2RzIjpbImxpc3QiLCJzdHJpbmciXSwiYWxsb3dlZF9vcmlnaW5zIjpbImxpc3QiLCJzdHJpbmciXSwiZXhwb3NlX2hlYWRlcnMiOlsibGlzdCIsInN0cmluZyJdLCJtYXhfYWdlX3NlY29uZHMiOiJudW1iZXIifV1dLCJmb3JjZV9kZXN0cm95IjoiYm9vbCIsImdyYW50IjpbInNldCIsWyJvYmplY3QiLHsiaWQiOiJzdHJpbmciLCJwZXJtaXNzaW9ucyI6WyJzZXQiLCJzdHJpbmciXSwidHlwZSI6InN0cmluZyIsInVyaSI6InN0cmluZyJ9XV0sImhvc3RlZF96b25lX2lkIjoic3RyaW5nIiwiaWQiOiJzdHJpbmciLCJsaWZlY3ljbGVfcnVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJhYm9ydF9pbmNvbXBsZXRlX211bHRpcGFydF91cGxvYWRfZGF5cyI6Im51bWJlciIsImVuYWJsZWQiOiJib29sIiwiZXhwaXJhdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJkYXRlIjoic3RyaW5nIiwiZGF5cyI6Im51bWJlciIsImV4cGlyZWRfb2JqZWN0X2RlbGV0ZV9tYXJrZXIiOiJib29sIn1dXSwiaWQiOiJzdHJpbmciLCJub25jdXJyZW50X3ZlcnNpb25fZXhwaXJhdGlvbiI6WyJsaXN0IixbIm9iamVjdCIseyJkYXlzIjoibnVtYmVyIn1dXSwibm9uY3VycmVudF92ZXJzaW9uX3RyYW5zaXRpb24iOlsic2V0IixbIm9iamVjdCIseyJkYXlzIjoibnVtYmVyIiwic3RvcmFnZV9jbGFzcyI6InN0cmluZyJ9XV0sInByZWZpeCI6InN0cmluZyIsInRhZ3MiOlsibWFwIiwic3RyaW5nIl0sInRyYW5zaXRpb24iOlsic2V0IixbIm9iamVjdCIseyJkYXRlIjoic3RyaW5nIiwiZGF5cyI6Im51bWJlciIsInN0b3JhZ2VfY2xhc3MiOiJzdHJpbmcifV1dfV1dLCJsb2dnaW5nIjpbInNldCIsWyJvYmplY3QiLHsidGFyZ2V0X2J1Y2tldCI6InN0cmluZyIsInRhcmdldF9wcmVmaXgiOiJzdHJpbmcifV1dLCJvYmplY3RfbG9ja19jb25maWd1cmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7Im9iamVjdF9sb2NrX2VuYWJsZWQiOiJzdHJpbmciLCJydWxlIjpbImxpc3QiLFsib2JqZWN0Iix7ImRlZmF1bHRfcmV0ZW50aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImRheXMiOiJudW1iZXIiLCJtb2RlIjoic3RyaW5nIiwieWVhcnMiOiJudW1iZXIifV1dfV1dfV1dLCJwb2xpY3kiOiJzdHJpbmciLCJyZWdpb24iOiJzdHJpbmciLCJyZXBsaWNhdGlvbl9jb25maWd1cmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7InJvbGUiOiJzdHJpbmciLCJydWxlcyI6WyJzZXQiLFsib2JqZWN0Iix7ImRlc3RpbmF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7ImFjY2Vzc19jb250cm9sX3RyYW5zbGF0aW9uIjpbImxpc3QiLFsib2JqZWN0Iix7Im93bmVyIjoic3RyaW5nIn1dXSwiYWNjb3VudF9pZCI6InN0cmluZyIsImJ1Y2tldCI6InN0cmluZyIsInJlcGxpY2Ffa21zX2tleV9pZCI6InN0cmluZyIsInN0b3JhZ2VfY2xhc3MiOiJzdHJpbmcifV1dLCJmaWx0ZXIiOlsibGlzdCIsWyJvYmplY3QiLHsicHJlZml4Ijoic3RyaW5nIiwidGFncyI6WyJtYXAiLCJzdHJpbmciXX1dXSwiaWQiOiJzdHJpbmciLCJwcmVmaXgiOiJzdHJpbmciLCJwcmlvcml0eSI6Im51bWJlciIsInNvdXJjZV9zZWxlY3Rpb25fY3JpdGVyaWEiOlsibGlzdCIsWyJvYmplY3QiLHsic3NlX2ttc19lbmNyeXB0ZWRfb2JqZWN0cyI6WyJsaXN0IixbIm9iamVjdCIseyJlbmFibGVkIjoiYm9vbCJ9XV19XV0sInN0YXR1cyI6InN0cmluZyJ9XV19XV0sInJlcXVlc3RfcGF5ZXIiOiJzdHJpbmciLCJzZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2NvbmZpZ3VyYXRpb24iOlsibGlzdCIsWyJvYmplY3QiLHsicnVsZSI6WyJsaXN0IixbIm9iamVjdCIseyJhcHBseV9zZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2J5X2RlZmF1bHQiOlsibGlzdCIsWyJvYmplY3QiLHsia21zX21hc3Rlcl9rZXlfaWQiOiJzdHJpbmciLCJzc2VfYWxnb3JpdGhtIjoic3RyaW5nIn1dXX1dXX1dXSwidGFncyI6WyJtYXAiLCJzdHJpbmciXSwidmVyc2lvbmluZyI6WyJsaXN0IixbIm9iamVjdCIseyJlbmFibGVkIjoiYm9vbCIsIm1mYV9kZWxldGUiOiJib29sIn1dXSwid2Vic2l0ZSI6WyJsaXN0IixbIm9iamVjdCIseyJlcnJvcl9kb2N1bWVudCI6InN0cmluZyIsImluZGV4X2RvY3VtZW50Ijoic3RyaW5nIiwicmVkaXJlY3RfYWxsX3JlcXVlc3RzX3RvIjoic3RyaW5nIiwicm91dGluZ19ydWxlcyI6InN0cmluZyJ9XV0sIndlYnNpdGVfZG9tYWluIjoic3RyaW5nIiwid2Vic2l0ZV9lbmRwb2ludCI6InN0cmluZyJ9XQ==",
|
|
||||||
"Val": "eyJhY2NlbGVyYXRpb25fc3RhdHVzIjoiIiwiYWNsIjpudWxsLCJhcm4iOiJhcm46YXdzOnMzOjo6YnVja2V0LW1hcnRpbi10ZXN0LWRyaWZ0MyIsImJ1Y2tldCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDMiLCJidWNrZXRfZG9tYWluX25hbWUiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzLnMzLmFtYXpvbmF3cy5jb20iLCJidWNrZXRfcHJlZml4IjpudWxsLCJidWNrZXRfcmVnaW9uYWxfZG9tYWluX25hbWUiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzLnMzLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20iLCJjb3JzX3J1bGUiOltdLCJmb3JjZV9kZXN0cm95IjpudWxsLCJncmFudCI6W10sImhvc3RlZF96b25lX2lkIjoiWjJNNEVIVVIyNlA3WlciLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdDMiLCJsaWZlY3ljbGVfcnVsZSI6W10sImxvZ2dpbmciOltdLCJvYmplY3RfbG9ja19jb25maWd1cmF0aW9uIjpbXSwicG9saWN5IjpudWxsLCJyZWdpb24iOiJhcC1ub3J0aGVhc3QtMSIsInJlcGxpY2F0aW9uX2NvbmZpZ3VyYXRpb24iOltdLCJyZXF1ZXN0X3BheWVyIjoiQnVja2V0T3duZXIiLCJzZXJ2ZXJfc2lkZV9lbmNyeXB0aW9uX2NvbmZpZ3VyYXRpb24iOltdLCJ0YWdzIjp7fSwidmVyc2lvbmluZyI6W3siZW5hYmxlZCI6ZmFsc2UsIm1mYV9kZWxldGUiOmZhbHNlfV0sIndlYnNpdGUiOltdLCJ3ZWJzaXRlX2RvbWFpbiI6bnVsbCwid2Vic2l0ZV9lbmRwb2ludCI6bnVsbH0=",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,98 +1,34 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"acceleration_status": "",
|
"acceleration_status": "",
|
||||||
"acl": null,
|
"acl": null,
|
||||||
"arn": "arn:aws:s3:::bucket-martin-test-drift2",
|
"arn": "arn:aws:s3:::bucket-martin-test-drift2",
|
||||||
"bucket": "bucket-martin-test-drift2",
|
"bucket": "bucket-martin-test-drift2",
|
||||||
"bucket_domain_name": "bucket-martin-test-drift2.s3.amazonaws.com",
|
"bucket_domain_name": "bucket-martin-test-drift2.s3.amazonaws.com",
|
||||||
"bucket_prefix": null,
|
"bucket_prefix": null,
|
||||||
"bucket_regional_domain_name": "bucket-martin-test-drift2.s3.eu-west-3.amazonaws.com",
|
"bucket_regional_domain_name": "bucket-martin-test-drift2.s3.eu-west-3.amazonaws.com",
|
||||||
"cors_rule": [],
|
"cors_rule": [],
|
||||||
"force_destroy": null,
|
"force_destroy": null,
|
||||||
"grant": [],
|
"grant": [],
|
||||||
"hosted_zone_id": "Z3R1K369G5AVDG",
|
"hosted_zone_id": "Z3R1K369G5AVDG",
|
||||||
"id": "bucket-martin-test-drift2",
|
"id": "bucket-martin-test-drift2",
|
||||||
"lifecycle_rule": [],
|
"lifecycle_rule": [],
|
||||||
"logging": [],
|
"logging": [],
|
||||||
"object_lock_configuration": [],
|
"object_lock_configuration": [],
|
||||||
"policy": null,
|
"policy": null,
|
||||||
"region": "eu-west-3",
|
"region": "eu-west-3",
|
||||||
"replication_configuration": [],
|
"replication_configuration": [],
|
||||||
"request_payer": "BucketOwner",
|
"request_payer": "BucketOwner",
|
||||||
"server_side_encryption_configuration": [],
|
"server_side_encryption_configuration": [],
|
||||||
"tags": {},
|
"tags": {},
|
||||||
"versioning": [
|
"versioning": [
|
||||||
{
|
{
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"mfa_delete": false
|
"mfa_delete": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"website": [],
|
"website": [],
|
||||||
"website_domain": null,
|
"website_domain": null,
|
||||||
"website_endpoint": null
|
"website_endpoint": null
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"acceleration_status": "",
|
|
||||||
"acl": null,
|
|
||||||
"arn": "arn:aws:s3:::bucket-martin-test-drift",
|
|
||||||
"bucket": "bucket-martin-test-drift",
|
|
||||||
"bucket_domain_name": "bucket-martin-test-drift.s3.amazonaws.com",
|
|
||||||
"bucket_prefix": null,
|
|
||||||
"bucket_regional_domain_name": "bucket-martin-test-drift.s3.eu-west-1.amazonaws.com",
|
|
||||||
"cors_rule": [],
|
|
||||||
"force_destroy": null,
|
|
||||||
"grant": [],
|
|
||||||
"hosted_zone_id": "Z1BKCTXD74EZPE",
|
|
||||||
"id": "bucket-martin-test-drift",
|
|
||||||
"lifecycle_rule": [],
|
|
||||||
"logging": [],
|
|
||||||
"object_lock_configuration": [],
|
|
||||||
"policy": null,
|
|
||||||
"region": "eu-west-1",
|
|
||||||
"replication_configuration": [],
|
|
||||||
"request_payer": "BucketOwner",
|
|
||||||
"server_side_encryption_configuration": [],
|
|
||||||
"tags": {},
|
|
||||||
"versioning": [
|
|
||||||
{
|
|
||||||
"enabled": false,
|
|
||||||
"mfa_delete": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"website": [],
|
|
||||||
"website_domain": null,
|
|
||||||
"website_endpoint": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"acceleration_status": "",
|
|
||||||
"acl": null,
|
|
||||||
"arn": "arn:aws:s3:::bucket-martin-test-drift3",
|
|
||||||
"bucket": "bucket-martin-test-drift3",
|
|
||||||
"bucket_domain_name": "bucket-martin-test-drift3.s3.amazonaws.com",
|
|
||||||
"bucket_prefix": null,
|
|
||||||
"bucket_regional_domain_name": "bucket-martin-test-drift3.s3.ap-northeast-1.amazonaws.com",
|
|
||||||
"cors_rule": [],
|
|
||||||
"force_destroy": null,
|
|
||||||
"grant": [],
|
|
||||||
"hosted_zone_id": "Z2M4EHUR26P7ZW",
|
|
||||||
"id": "bucket-martin-test-drift3",
|
|
||||||
"lifecycle_rule": [],
|
|
||||||
"logging": [],
|
|
||||||
"object_lock_configuration": [],
|
|
||||||
"policy": null,
|
|
||||||
"region": "ap-northeast-1",
|
|
||||||
"replication_configuration": [],
|
|
||||||
"request_payer": "BucketOwner",
|
|
||||||
"server_side_encryption_configuration": [],
|
|
||||||
"tags": {},
|
|
||||||
"versioning": [
|
|
||||||
{
|
|
||||||
"enabled": false,
|
|
||||||
"mfa_delete": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"website": [],
|
|
||||||
"website_domain": null,
|
|
||||||
"website_endpoint": null
|
|
||||||
}
|
|
||||||
]
|
]
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiaWQiOiJzdHJpbmciLCJsYW1iZGFfZnVuY3Rpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiZXZlbnRzIjpbInNldCIsInN0cmluZyJdLCJmaWx0ZXJfcHJlZml4Ijoic3RyaW5nIiwiZmlsdGVyX3N1ZmZpeCI6InN0cmluZyIsImlkIjoic3RyaW5nIiwibGFtYmRhX2Z1bmN0aW9uX2FybiI6InN0cmluZyJ9XV0sInF1ZXVlIjpbImxpc3QiLFsib2JqZWN0Iix7ImV2ZW50cyI6WyJzZXQiLCJzdHJpbmciXSwiZmlsdGVyX3ByZWZpeCI6InN0cmluZyIsImZpbHRlcl9zdWZmaXgiOiJzdHJpbmciLCJpZCI6InN0cmluZyIsInF1ZXVlX2FybiI6InN0cmluZyJ9XV0sInRvcGljIjpbImxpc3QiLFsib2JqZWN0Iix7ImV2ZW50cyI6WyJzZXQiLCJzdHJpbmciXSwiZmlsdGVyX3ByZWZpeCI6InN0cmluZyIsImZpbHRlcl9zdWZmaXgiOiJzdHJpbmciLCJpZCI6InN0cmluZyIsInRvcGljX2FybiI6InN0cmluZyJ9XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQiLCJpZCI6ImJ1Y2tldC1tYXJ0aW4tdGVzdC1kcmlmdCIsImxhbWJkYV9mdW5jdGlvbiI6W3siZXZlbnRzIjpbInMzOk9iamVjdENyZWF0ZWQ6KiJdLCJmaWx0ZXJfcHJlZml4IjoiQVdTTG9ncy8iLCJmaWx0ZXJfc3VmZml4IjoiLmxvZyIsImlkIjoidGYtczMtbGFtYmRhLTIwMjAxMTAzMTUzNDUyNTkyNzAwMDAwMDAxIiwibGFtYmRhX2Z1bmN0aW9uX2FybiI6ImFybjphd3M6bGFtYmRhOmV1LXdlc3QtMTo1MjY5NTQ5Mjk5MjM6ZnVuY3Rpb246ZXhhbXBsZV9sYW1iZGFfbmFtZTEifSx7ImV2ZW50cyI6WyJzMzpPYmplY3RDcmVhdGVkOioiXSwiZmlsdGVyX3ByZWZpeCI6Ik90aGVyTG9ncy8iLCJmaWx0ZXJfc3VmZml4IjoiLmxvZyIsImlkIjoidGYtczMtbGFtYmRhLTIwMjAxMTAzMTUzNDUyNTkyODAwMDAwMDAyIiwibGFtYmRhX2Z1bmN0aW9uX2FybiI6ImFybjphd3M6bGFtYmRhOmV1LXdlc3QtMTo1MjY5NTQ5Mjk5MjM6ZnVuY3Rpb246ZXhhbXBsZV9sYW1iZGFfbmFtZTIifV0sInF1ZXVlIjpbXSwidG9waWMiOltdfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"Typ": "WyJvYmplY3QiLHsiYnVja2V0Ijoic3RyaW5nIiwiaWQiOiJzdHJpbmciLCJsYW1iZGFfZnVuY3Rpb24iOlsibGlzdCIsWyJvYmplY3QiLHsiZXZlbnRzIjpbInNldCIsInN0cmluZyJdLCJmaWx0ZXJfcHJlZml4Ijoic3RyaW5nIiwiZmlsdGVyX3N1ZmZpeCI6InN0cmluZyIsImlkIjoic3RyaW5nIiwibGFtYmRhX2Z1bmN0aW9uX2FybiI6InN0cmluZyJ9XV0sInF1ZXVlIjpbImxpc3QiLFsib2JqZWN0Iix7ImV2ZW50cyI6WyJzZXQiLCJzdHJpbmciXSwiZmlsdGVyX3ByZWZpeCI6InN0cmluZyIsImZpbHRlcl9zdWZmaXgiOiJzdHJpbmciLCJpZCI6InN0cmluZyIsInF1ZXVlX2FybiI6InN0cmluZyJ9XV0sInRvcGljIjpbImxpc3QiLFsib2JqZWN0Iix7ImV2ZW50cyI6WyJzZXQiLCJzdHJpbmciXSwiZmlsdGVyX3ByZWZpeCI6InN0cmluZyIsImZpbHRlcl9zdWZmaXgiOiJzdHJpbmciLCJpZCI6InN0cmluZyIsInRvcGljX2FybiI6InN0cmluZyJ9XV19XQ==",
|
|
||||||
"Val": "eyJidWNrZXQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwiaWQiOiJidWNrZXQtbWFydGluLXRlc3QtZHJpZnQzIiwibGFtYmRhX2Z1bmN0aW9uIjpbeyJldmVudHMiOlsiczM6T2JqZWN0Q3JlYXRlZDoqIl0sImZpbHRlcl9wcmVmaXgiOiJBV1NMb2dzLyIsImZpbHRlcl9zdWZmaXgiOiIubG9nIiwiaWQiOiJ0Zi1zMy1sYW1iZGEtMjAyMDExMDMxNjUwNTI5NTgzMDAwMDAwMDEiLCJsYW1iZGFfZnVuY3Rpb25fYXJuIjoiYXJuOmF3czpsYW1iZGE6YXAtbm9ydGhlYXN0LTE6NTI2OTU0OTI5OTIzOmZ1bmN0aW9uOmV4YW1wbGVfbGFtYmRhX25hbWUxIn0seyJldmVudHMiOlsiczM6T2JqZWN0Q3JlYXRlZDoqIl0sImZpbHRlcl9wcmVmaXgiOiJPdGhlckxvZ3MvIiwiZmlsdGVyX3N1ZmZpeCI6Ii5sb2ciLCJpZCI6InRmLXMzLWxhbWJkYS0yMDIwMTEwMzE2NTA1Mjk1ODQwMDAwMDAwMiIsImxhbWJkYV9mdW5jdGlvbl9hcm4iOiJhcm46YXdzOmxhbWJkYTphcC1ub3J0aGVhc3QtMTo1MjY5NTQ5Mjk5MjM6ZnVuY3Rpb246ZXhhbXBsZV9sYW1iZGFfbmFtZTIifV0sInF1ZXVlIjpbXSwidG9waWMiOltdfQ==",
|
|
||||||
"Err": null
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue