Merge pull request #1020 from cloudskiff/fix_nil_source_crash
Fix crash in output when source is nilmain
commit
af5f839842
|
@ -39,7 +39,10 @@ func (c *Console) Write(analysis *analyser.Analysis) error {
|
||||||
groupedBySource := make(map[string][]*resource.Resource)
|
groupedBySource := make(map[string][]*resource.Resource)
|
||||||
|
|
||||||
for _, deletedResource := range analysis.Deleted() {
|
for _, deletedResource := range analysis.Deleted() {
|
||||||
key := deletedResource.Source.Source()
|
key := ""
|
||||||
|
if deletedResource.Source != nil {
|
||||||
|
key = deletedResource.Source.Source()
|
||||||
|
}
|
||||||
|
|
||||||
if _, exist := groupedBySource[key]; !exist {
|
if _, exist := groupedBySource[key]; !exist {
|
||||||
groupedBySource[key] = []*resource.Resource{deletedResource}
|
groupedBySource[key] = []*resource.Resource{deletedResource}
|
||||||
|
@ -57,12 +60,20 @@ func (c *Console) Write(analysis *analyser.Analysis) error {
|
||||||
fmt.Println("Found missing resources:")
|
fmt.Println("Found missing resources:")
|
||||||
|
|
||||||
for _, source := range sources {
|
for _, source := range sources {
|
||||||
fmt.Print(color.BlueString(" From %s\n", source))
|
indentBase := " "
|
||||||
|
if source != "" {
|
||||||
|
fmt.Print(color.BlueString("%sFrom %s\n", indentBase, source))
|
||||||
|
indentBase += indentBase
|
||||||
|
}
|
||||||
for _, deletedResource := range groupedBySource[source] {
|
for _, deletedResource := range groupedBySource[source] {
|
||||||
humanString := fmt.Sprintf(" - %s (%s)", deletedResource.ResourceId(), deletedResource.SourceString())
|
humanStringSource := deletedResource.ResourceType()
|
||||||
|
if deletedResource.SourceString() != "" {
|
||||||
|
humanStringSource = deletedResource.SourceString()
|
||||||
|
}
|
||||||
|
humanString := fmt.Sprintf("%s- %s (%s)", indentBase, deletedResource.ResourceId(), humanStringSource)
|
||||||
|
|
||||||
if humanAttrs := formatResourceAttributes(deletedResource); humanAttrs != "" {
|
if humanAttrs := formatResourceAttributes(deletedResource); humanAttrs != "" {
|
||||||
humanString += fmt.Sprintf("\n %s", humanAttrs)
|
humanString += fmt.Sprintf("\n%s %s", indentBase, humanAttrs)
|
||||||
}
|
}
|
||||||
fmt.Println(humanString)
|
fmt.Println(humanString)
|
||||||
}
|
}
|
||||||
|
@ -88,7 +99,10 @@ func (c *Console) Write(analysis *analyser.Analysis) error {
|
||||||
var sources []string
|
var sources []string
|
||||||
groupedBySource := make(map[string][]analyser.Difference)
|
groupedBySource := make(map[string][]analyser.Difference)
|
||||||
for _, difference := range analysis.Differences() {
|
for _, difference := range analysis.Differences() {
|
||||||
key := difference.Res.Source.Source()
|
key := ""
|
||||||
|
if difference.Res.Source != nil {
|
||||||
|
key = difference.Res.Source.Source()
|
||||||
|
}
|
||||||
if _, exist := groupedBySource[key]; !exist {
|
if _, exist := groupedBySource[key]; !exist {
|
||||||
groupedBySource[key] = []analyser.Difference{difference}
|
groupedBySource[key] = []analyser.Difference{difference}
|
||||||
continue
|
continue
|
||||||
|
@ -103,13 +117,21 @@ func (c *Console) Write(analysis *analyser.Analysis) error {
|
||||||
|
|
||||||
fmt.Println("Found changed resources:")
|
fmt.Println("Found changed resources:")
|
||||||
for _, source := range sources {
|
for _, source := range sources {
|
||||||
fmt.Print(color.BlueString(" From %s\n", source))
|
indentBase := " "
|
||||||
|
if source != "" {
|
||||||
|
fmt.Print(color.BlueString("%sFrom %s\n", indentBase, source))
|
||||||
|
indentBase += indentBase
|
||||||
|
}
|
||||||
for _, difference := range groupedBySource[source] {
|
for _, difference := range groupedBySource[source] {
|
||||||
humanString := fmt.Sprintf(" - %s (%s):", difference.Res.ResourceId(), difference.Res.SourceString())
|
humanStringSource := difference.Res.ResourceType()
|
||||||
whiteSpace := " "
|
if difference.Res.SourceString() != "" {
|
||||||
|
humanStringSource = difference.Res.SourceString()
|
||||||
|
}
|
||||||
|
humanString := fmt.Sprintf("%s- %s (%s):", indentBase, difference.Res.ResourceId(), humanStringSource)
|
||||||
|
whiteSpace := indentBase + " "
|
||||||
if humanAttrs := formatResourceAttributes(difference.Res); humanAttrs != "" {
|
if humanAttrs := formatResourceAttributes(difference.Res); humanAttrs != "" {
|
||||||
humanString += fmt.Sprintf("\n %s", humanAttrs)
|
humanString += fmt.Sprintf("\n%s%s", whiteSpace, humanAttrs)
|
||||||
whiteSpace = " "
|
whiteSpace += " "
|
||||||
}
|
}
|
||||||
fmt.Println(humanString)
|
fmt.Println(humanString)
|
||||||
for _, change := range difference.Changelog {
|
for _, change := range difference.Changelog {
|
||||||
|
|
|
@ -183,20 +183,6 @@ func TestHTML_Write(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}})
|
}})
|
||||||
a.AddDifference(analyser.Difference{
|
|
||||||
Res: &resource.Resource{
|
|
||||||
Id: "diff-id-3",
|
|
||||||
Type: "aws_diff_resource",
|
|
||||||
}, Changelog: []analyser.Change{
|
|
||||||
{
|
|
||||||
Change: diff.Change{
|
|
||||||
Type: diff.UPDATE,
|
|
||||||
Path: []string{"InstanceInitiatedShutdownBehavior"},
|
|
||||||
From: "",
|
|
||||||
To: nil,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}})
|
|
||||||
a.ProviderName = "AWS"
|
a.ProviderName = "AWS"
|
||||||
a.ProviderVersion = "3.19.0"
|
a.ProviderVersion = "3.19.0"
|
||||||
return a
|
return a
|
||||||
|
|
|
@ -38,11 +38,6 @@ func fakeAnalysis() *analyser.Analysis {
|
||||||
}, &resource.Resource{
|
}, &resource.Resource{
|
||||||
Id: "deleted-id-2",
|
Id: "deleted-id-2",
|
||||||
Type: "aws_deleted_resource",
|
Type: "aws_deleted_resource",
|
||||||
Source: &resource.TerraformStateSource{
|
|
||||||
State: "tfstate://delete_state.tfstate",
|
|
||||||
Module: "module",
|
|
||||||
Name: "name",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
a.AddManaged(
|
a.AddManaged(
|
||||||
|
@ -55,6 +50,23 @@ func fakeAnalysis() *analyser.Analysis {
|
||||||
Type: "aws_no_diff_resource",
|
Type: "aws_no_diff_resource",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
// Cover the case when a diff occur on a resource without a source
|
||||||
|
a.AddDifference(analyser.Difference{
|
||||||
|
Res: &resource.Resource{
|
||||||
|
Id: "diff-id-2",
|
||||||
|
Type: "aws_diff_resource",
|
||||||
|
},
|
||||||
|
Changelog: []analyser.Change{
|
||||||
|
{
|
||||||
|
Change: diff.Change{
|
||||||
|
Type: diff.UPDATE,
|
||||||
|
Path: []string{"updated", "field"},
|
||||||
|
From: "foobar",
|
||||||
|
To: "barfoo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
a.AddDifference(analyser.Difference{Res: &resource.Resource{
|
a.AddDifference(analyser.Difference{Res: &resource.Resource{
|
||||||
Id: "diff-id-1",
|
Id: "diff-id-1",
|
||||||
Type: "aws_diff_resource",
|
Type: "aws_diff_resource",
|
||||||
|
|
|
@ -515,6 +515,20 @@ input[type="search"], select {
|
||||||
</div>
|
</div>
|
||||||
<div role="rowgroup" class="table-body">
|
<div role="rowgroup" class="table-body">
|
||||||
|
|
||||||
|
<div role="row" data-kind="resource-changed" class="resource-item">
|
||||||
|
<div class="row">
|
||||||
|
<span role="cell">
|
||||||
|
<span data-type="resource-id">diff-id-2</span>
|
||||||
|
<span>(aws_diff_resource)</span>
|
||||||
|
<span style="display:none;" data-type="resource-type">aws_diff_resource</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<pre class="code-box">
|
||||||
|
<code class="code-box-line"> ~ updated.field: <span class="code-box-line-delete">"foobar"</span> => <span class="code-box-line-create">"barfoo"</span><br></code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div role="row" data-kind="resource-changed" class="resource-item">
|
<div role="row" data-kind="resource-changed" class="resource-item">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<span role="cell">
|
<span role="cell">
|
||||||
|
@ -573,20 +587,6 @@ input[type="search"], select {
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div role="row" data-kind="resource-changed" class="resource-item">
|
|
||||||
<div class="row">
|
|
||||||
<span role="cell">
|
|
||||||
<span data-type="resource-id">diff-id-3</span>
|
|
||||||
<span>(aws_diff_resource)</span>
|
|
||||||
<span style="display:none;" data-type="resource-type">aws_diff_resource</span>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<pre class="code-box">
|
|
||||||
<code class="code-box-line"> ~ InstanceInitiatedShutdownBehavior: <span class="code-box-line-delete">""</span> => <span class="code-box-line-create">null</span><br></code>
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="empty-panel is-hidden">
|
<div class="empty-panel is-hidden">
|
||||||
|
@ -617,10 +617,10 @@ input[type="search"], select {
|
||||||
<tr data-kind="resource-deleted" class="resource-item row">
|
<tr data-kind="resource-deleted" class="resource-item row">
|
||||||
<td>
|
<td>
|
||||||
<span data-type="resource-id">deleted-id-2</span>
|
<span data-type="resource-id">deleted-id-2</span>
|
||||||
<span>(module.aws_deleted_resource.name)</span>
|
<span>(aws_deleted_resource)</span>
|
||||||
<span data-type="resource-type" style="display:none;">aws_deleted_resource</span>
|
<span data-type="resource-type" style="display:none;">aws_deleted_resource</span>
|
||||||
</td>
|
</td>
|
||||||
<td data-type="resource-source">tfstate://delete_state.tfstate</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr data-kind="resource-deleted" class="resource-item row">
|
<tr data-kind="resource-deleted" class="resource-item row">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"summary": {
|
"summary": {
|
||||||
"total_resources": 6,
|
"total_resources": 6,
|
||||||
"total_changed": 1,
|
"total_changed": 2,
|
||||||
"total_unmanaged": 2,
|
"total_unmanaged": 2,
|
||||||
"total_missing": 2,
|
"total_missing": 2,
|
||||||
"total_managed": 2
|
"total_managed": 2
|
||||||
|
@ -38,15 +38,28 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "deleted-id-2",
|
"id": "deleted-id-2",
|
||||||
"type": "aws_deleted_resource",
|
"type": "aws_deleted_resource"
|
||||||
"source": {
|
|
||||||
"source": "tfstate://delete_state.tfstate",
|
|
||||||
"namespace": "module",
|
|
||||||
"internal_name": "name"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"differences": [
|
"differences": [
|
||||||
|
{
|
||||||
|
"res": {
|
||||||
|
"id": "diff-id-2",
|
||||||
|
"type": "aws_diff_resource"
|
||||||
|
},
|
||||||
|
"changelog": [
|
||||||
|
{
|
||||||
|
"type": "update",
|
||||||
|
"path": [
|
||||||
|
"updated",
|
||||||
|
"field"
|
||||||
|
],
|
||||||
|
"from": "foobar",
|
||||||
|
"to": "barfoo",
|
||||||
|
"computed": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"res": {
|
"res": {
|
||||||
"id": "diff-id-1",
|
"id": "diff-id-1",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Found missing resources:
|
Found missing resources:
|
||||||
|
- deleted-id-2 (aws_deleted_resource)
|
||||||
From tfstate://delete_state.tfstate
|
From tfstate://delete_state.tfstate
|
||||||
- deleted-id-1 (module.aws_deleted_resource.name)
|
- deleted-id-1 (module.aws_deleted_resource.name)
|
||||||
- deleted-id-2 (module.aws_deleted_resource.name)
|
|
||||||
From tfstate://test_state.tfstate
|
From tfstate://test_state.tfstate
|
||||||
- test-id-1 (module.aws_test_resource.name)
|
- test-id-1 (module.aws_test_resource.name)
|
||||||
- test-id-2 (module.aws_test_resource.name)
|
- test-id-2 (module.aws_test_resource.name)
|
||||||
|
@ -14,6 +14,8 @@ Found resources not covered by IaC:
|
||||||
- unmanaged-id-1
|
- unmanaged-id-1
|
||||||
- unmanaged-id-2
|
- unmanaged-id-2
|
||||||
Found changed resources:
|
Found changed resources:
|
||||||
|
- diff-id-2 (aws_diff_resource):
|
||||||
|
~ updated.field: "foobar" => "barfoo"
|
||||||
From tfstate://state.tfstate
|
From tfstate://state.tfstate
|
||||||
- diff-id-1 (module.aws_diff_resource.name):
|
- diff-id-1 (module.aws_diff_resource.name):
|
||||||
~ updated.field: "foobar" => "barfoo"
|
~ updated.field: "foobar" => "barfoo"
|
||||||
|
@ -22,6 +24,6 @@ Found changed resources:
|
||||||
Found 10 resource(s)
|
Found 10 resource(s)
|
||||||
- 20% coverage
|
- 20% coverage
|
||||||
- 2 resource(s) managed by terraform
|
- 2 resource(s) managed by terraform
|
||||||
- 1/2 resource(s) out of sync with Terraform state
|
- 2/2 resource(s) out of sync with Terraform state
|
||||||
- 4 resource(s) not managed by Terraform
|
- 4 resource(s) not managed by Terraform
|
||||||
- 4 resource(s) found in a Terraform state but missing on the cloud provider
|
- 4 resource(s) found in a Terraform state but missing on the cloud provider
|
||||||
|
|
|
@ -73,6 +73,9 @@ func (r *Resource) Src() Source {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Resource) SourceString() string {
|
func (r *Resource) SourceString() string {
|
||||||
|
if r.Source == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
if r.Source.Namespace() == "" {
|
if r.Source.Namespace() == "" {
|
||||||
return fmt.Sprintf("%s.%s", r.ResourceType(), r.Source.InternalName())
|
return fmt.Sprintf("%s.%s", r.ResourceType(), r.Source.InternalName())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue