Skip to content

Commit fc0455f

Browse files
nicolai86stack72
authored andcommitted
provider/scaleway: fix scaleway_image datasource returning unknown images (hashicorp#9899)
* provider/scaleway: expose scaleway_image lookup error * provider/scaleway: fix image lookup error fixes hashicorp#9472
1 parent f9d5c72 commit fc0455f

3 files changed

Lines changed: 43 additions & 68 deletions

File tree

builtin/providers/scaleway/data_source_scaleway_bootscript_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ func testAccCheckBootscriptID(n string) resource.TestCheckFunc {
5454
if rs.Primary.ID == "" {
5555
return fmt.Errorf("bootscript data source ID not set")
5656
}
57+
58+
scaleway := testAccProvider.Meta().(*Client).scaleway
59+
_, err := scaleway.GetBootscript(rs.Primary.ID)
60+
if err != nil {
61+
return err
62+
}
63+
5764
return nil
5865
}
5966
}

builtin/providers/scaleway/data_source_scaleway_image.go

Lines changed: 23 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package scaleway
22

33
import (
44
"fmt"
5-
"log"
6-
"regexp"
75

86
"github.com/hashicorp/terraform/helper/schema"
97
"github.com/scaleway/scaleway-cli/pkg/api"
@@ -47,87 +45,45 @@ func dataSourceScalewayImage() *schema.Resource {
4745
}
4846
}
4947

50-
func scalewayImageAttributes(d *schema.ResourceData, img imageMatch) error {
51-
d.Set("architecture", img.imageDefinition.Arch)
52-
d.Set("organization", img.marketImage.Organization)
53-
d.Set("public", img.marketImage.Public)
54-
d.Set("creation_date", img.marketImage.CreationDate)
55-
d.Set("name", img.marketImage.Name)
56-
d.SetId(img.imageDefinition.ID)
48+
func scalewayImageAttributes(d *schema.ResourceData, img *api.ScalewayImage) error {
49+
d.Set("architecture", img.Arch)
50+
d.Set("organization", img.Organization)
51+
d.Set("public", img.Public)
52+
d.Set("creation_date", img.CreationDate)
53+
d.Set("name", img.Name)
54+
d.SetId(img.Identifier)
5755

5856
return nil
5957
}
6058

61-
type imageMatch struct {
62-
marketImage api.MarketImage
63-
imageDefinition api.MarketLocalImageDefinition
64-
}
65-
6659
func dataSourceScalewayImageRead(d *schema.ResourceData, meta interface{}) error {
6760
scaleway := meta.(*Client).scaleway
6861

69-
images, err := scaleway.GetImages()
70-
log.Printf("[DEBUG] %#v", images)
71-
if err != nil {
72-
return err
73-
}
74-
75-
var isNameMatch = func(api.MarketImage) bool { return true }
76-
var isArchMatch = func(api.MarketLocalImageDefinition) bool { return true }
77-
62+
var needle string
7863
if name, ok := d.GetOk("name"); ok {
79-
isNameMatch = func(img api.MarketImage) bool {
80-
return img.Name == name.(string)
81-
}
64+
needle = name.(string)
8265
} else if nameFilter, ok := d.GetOk("name_filter"); ok {
83-
exp, err := regexp.Compile(nameFilter.(string))
84-
if err != nil {
85-
return err
86-
}
87-
88-
isNameMatch = func(img api.MarketImage) bool {
89-
return exp.MatchString(img.Name)
90-
}
91-
}
92-
93-
var architecture = d.Get("architecture").(string)
94-
if architecture != "" {
95-
isArchMatch = func(img api.MarketLocalImageDefinition) bool {
96-
return img.Arch == architecture
97-
}
66+
needle = nameFilter.(string)
9867
}
9968

100-
var matches []imageMatch
101-
for _, img := range *images {
102-
if !isNameMatch(img) {
103-
continue
104-
}
105-
106-
var imageDefinition *api.MarketLocalImageDefinition
107-
for _, version := range img.Versions {
108-
for _, def := range version.LocalImages {
109-
if isArchMatch(def) {
110-
imageDefinition = &def
111-
break
112-
}
113-
}
114-
}
115-
116-
if imageDefinition == nil {
117-
continue
118-
}
119-
matches = append(matches, imageMatch{
120-
marketImage: img,
121-
imageDefinition: *imageDefinition,
122-
})
69+
images, err := scaleway.ResolveImage(needle)
70+
if err != nil {
71+
return err
12372
}
73+
images = api.FilterImagesByArch(images, d.Get("architecture").(string))
74+
images = api.FilterImagesByRegion(images, scaleway.Region)
12475

125-
if len(matches) > 1 {
76+
if len(images) > 1 {
12677
return fmt.Errorf("The query returned more than one result. Please refine your query.")
12778
}
128-
if len(matches) == 0 {
79+
if len(images) == 0 {
12980
return fmt.Errorf("The query returned no result. Please refine your query.")
13081
}
13182

132-
return scalewayImageAttributes(d, matches[0])
83+
img, err := scaleway.GetImage(images[0].Identifier)
84+
if err != nil {
85+
return err
86+
}
87+
88+
return scalewayImageAttributes(d, img)
13389
}

builtin/providers/scaleway/data_source_scaleway_image_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ func TestAccScalewayDataSourceImage_Basic(t *testing.T) {
1919
testAccCheckImageID("data.scaleway_image.ubuntu"),
2020
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "architecture", "arm"),
2121
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "public", "true"),
22+
resource.TestCheckResourceAttrSet("data.scaleway_image.ubuntu", "organization"),
23+
resource.TestCheckResourceAttrSet("data.scaleway_image.ubuntu", "creation_date"),
2224
),
2325
},
2426
},
@@ -34,9 +36,11 @@ func TestAccScalewayDataSourceImage_Filtered(t *testing.T) {
3436
Config: testAccCheckScalewayImageFilterConfig,
3537
Check: resource.ComposeTestCheckFunc(
3638
testAccCheckImageID("data.scaleway_image.ubuntu"),
37-
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "name", "Ubuntu Precise"),
39+
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "name", "Ubuntu Precise (12.04)"),
3840
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "architecture", "arm"),
3941
resource.TestCheckResourceAttr("data.scaleway_image.ubuntu", "public", "true"),
42+
resource.TestCheckResourceAttrSet("data.scaleway_image.ubuntu", "organization"),
43+
resource.TestCheckResourceAttrSet("data.scaleway_image.ubuntu", "creation_date"),
4044
),
4145
},
4246
},
@@ -53,6 +57,14 @@ func testAccCheckImageID(n string) resource.TestCheckFunc {
5357
if rs.Primary.ID == "" {
5458
return fmt.Errorf("image data source ID not set")
5559
}
60+
61+
scaleway := testAccProvider.Meta().(*Client).scaleway
62+
_, err := scaleway.GetImage(rs.Primary.ID)
63+
64+
if err != nil {
65+
return err
66+
}
67+
5668
return nil
5769
}
5870
}

0 commit comments

Comments
 (0)