@@ -8,18 +8,25 @@ import (
8
8
9
9
"github.com/hashicorp/terraform-plugin-log/tflog"
10
10
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
11
12
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12
13
"github.com/jfrog/terraform-provider-shared/util"
13
14
"github.com/jfrog/terraform-provider-shared/util/sdk"
14
15
"github.com/jfrog/terraform-provider-shared/validator"
15
16
)
16
17
18
+ const repositoryEndpoint = "/artifactory/api/repositories/{key}"
19
+
17
20
type Repository struct {
18
21
Key string `json:"key"`
19
22
ProjectKey string `json:"projectKey"`
20
23
}
21
24
22
25
func projectRepositoryResource () * schema.Resource {
26
+ var projectRepositoryID = func (projectKey , repoKey string ) string {
27
+ return fmt .Sprintf ("%s-%s" , projectKey , repoKey )
28
+ }
29
+
23
30
var projectRepositorySchema = map [string ]* schema.Schema {
24
31
"project_key" : {
25
32
Type : schema .TypeString ,
@@ -37,17 +44,28 @@ func projectRepositoryResource() *schema.Resource {
37
44
},
38
45
}
39
46
47
+ var packProjectRepository = func (repo Repository , data * schema.ResourceData ) error {
48
+ setValue := sdk .MkLens (data )
49
+
50
+ setValue ("project_key" , repo .ProjectKey )
51
+ errors := setValue ("key" , repo .Key )
52
+ if len (errors ) > 0 {
53
+ return fmt .Errorf ("failed to pack project repository %q" , errors )
54
+ }
55
+
56
+ data .SetId (projectRepositoryID (repo .ProjectKey , repo .Key ))
57
+
58
+ return nil
59
+ }
60
+
40
61
var readProjectRepository = func (ctx context.Context , data * schema.ResourceData , m interface {}) diag.Diagnostics {
41
62
repoKey := data .Get ("key" ).(string )
42
63
43
64
var repo Repository
44
-
45
- var projectError ProjectErrorsResponse
46
65
resp , err := m .(util.ProvderMetadata ).Client .R ().
47
66
SetResult (& repo ).
48
67
SetPathParam ("key" , repoKey ).
49
- SetError (& projectError ).
50
- Get ("/artifactory/api/repositories/{key}" )
68
+ Get (repositoryEndpoint )
51
69
52
70
if err != nil {
53
71
return diag .FromErr (err )
@@ -57,22 +75,18 @@ func projectRepositoryResource() *schema.Resource {
57
75
return nil
58
76
}
59
77
if resp .IsError () {
60
- return diag .Errorf ("%s" , projectError .String ())
78
+ return diag .Errorf ("%s" , resp .String ())
61
79
}
62
80
63
81
if repo .ProjectKey == "" {
64
- tflog .Info (ctx , "no project_key for repo" , map [string ]any {"repoKey" : repoKey })
82
+ tflog .Warn (ctx , "no project_key for repo" , map [string ]any {"repoKey" : repoKey })
65
83
data .SetId ("" )
66
84
return nil
67
85
}
68
86
69
- setValue := sdk .MkLens (data )
70
-
71
- setValue ("project_key" , repo .ProjectKey )
72
- errors := setValue ("key" , repo .Key )
73
-
74
- if len (errors ) > 0 {
75
- return diag .Errorf ("failed to pack project repository %q" , errors )
87
+ err = packProjectRepository (repo , data )
88
+ if err != nil {
89
+ return diag .FromErr (err )
76
90
}
77
91
78
92
return nil
@@ -98,9 +112,37 @@ func projectRepositoryResource() *schema.Resource {
98
112
return diag .Errorf ("%s" , projectError .String ())
99
113
}
100
114
101
- data .SetId (fmt .Sprintf ("%s-%s" , projectKey , repoKey ))
115
+ retryError := retry .RetryContext (ctx , data .Timeout (schema .TimeoutCreate ), func () * retry.RetryError {
116
+ var repo Repository
117
+ resp , err := m .(util.ProvderMetadata ).Client .R ().
118
+ SetResult (& repo ).
119
+ SetPathParam ("key" , repoKey ).
120
+ Get (repositoryEndpoint )
121
+
122
+ if err != nil {
123
+ return retry .NonRetryableError (fmt .Errorf ("error getting repository: %s" , err ))
124
+ }
125
+ if resp .IsError () {
126
+ return retry .NonRetryableError (fmt .Errorf ("error getting repository: %s" , resp .String ()))
127
+ }
128
+
129
+ if repo .ProjectKey == "" {
130
+ return retry .RetryableError (fmt .Errorf ("expected repository to be assigned to project but currently not" ))
131
+ }
132
+
133
+ err = packProjectRepository (repo , data )
134
+ if err != nil {
135
+ return retry .NonRetryableError (err )
136
+ }
137
+
138
+ return nil
139
+ })
102
140
103
- return readProjectRepository (ctx , data , m )
141
+ if retryError != nil {
142
+ return diag .FromErr (retryError )
143
+ }
144
+
145
+ return nil
104
146
}
105
147
106
148
var deleteProjectRepository = func (ctx context.Context , data * schema.ResourceData , m interface {}) diag.Diagnostics {
@@ -132,7 +174,7 @@ func projectRepositoryResource() *schema.Resource {
132
174
133
175
d .Set ("project_key" , parts [0 ])
134
176
d .Set ("key" , parts [1 ])
135
- d .SetId (fmt . Sprintf ( "%s-%s" , parts [0 ], parts [1 ]))
177
+ d .SetId (projectRepositoryID ( parts [0 ], parts [1 ]))
136
178
137
179
return []* schema.ResourceData {d }, nil
138
180
}
0 commit comments