77 application "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
88 "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
99 "strings"
10+ "sync"
1011 "time"
1112)
1213
@@ -34,9 +35,17 @@ func resourceArgoCDProjectCreate(d *schema.ResourceData, meta interface{}) error
3435 }
3536 server := meta .(ServerInterface )
3637 c := * server .ProjectClient
38+ projectName := objectMeta .Name
39+ if _ , ok := tokenMutexProjectMap [projectName ]; ! ok {
40+ tokenMutexProjectMap [projectName ] = & sync.RWMutex {}
41+ }
42+
43+ tokenMutexProjectMap [projectName ].RLock ()
3744 p , err := c .Get (context .Background (), & projectClient.ProjectQuery {
38- Name : objectMeta . Name ,
45+ Name : projectName ,
3946 })
47+ tokenMutexProjectMap [projectName ].RUnlock ()
48+
4049 if err != nil {
4150 switch strings .Contains (err .Error (), "NotFound" ) {
4251 case true :
@@ -52,6 +61,8 @@ func resourceArgoCDProjectCreate(d *schema.ResourceData, meta interface{}) error
5261 time .Sleep (time .Duration (* p .DeletionGracePeriodSeconds ))
5362 }
5463 }
64+
65+ tokenMutexProjectMap [projectName ].Lock ()
5566 p , err = c .Create (context .Background (), & projectClient.ProjectCreateRequest {
5667 Project : & application.AppProject {
5768 ObjectMeta : objectMeta ,
@@ -61,6 +72,8 @@ func resourceArgoCDProjectCreate(d *schema.ResourceData, meta interface{}) error
6172 // TODO: make that a resource flag with proper acceptance tests
6273 Upsert : false ,
6374 })
75+ tokenMutexProjectMap [projectName ].Unlock ()
76+
6477 if err != nil {
6578 return err
6679 }
@@ -74,9 +87,17 @@ func resourceArgoCDProjectCreate(d *schema.ResourceData, meta interface{}) error
7487func resourceArgoCDProjectRead (d * schema.ResourceData , meta interface {}) error {
7588 server := meta .(ServerInterface )
7689 c := * server .ProjectClient
90+ projectName := d .Id ()
91+ if _ , ok := tokenMutexProjectMap [projectName ]; ! ok {
92+ tokenMutexProjectMap [projectName ] = & sync.RWMutex {}
93+ }
94+
95+ tokenMutexProjectMap [projectName ].RLock ()
7796 p , err := c .Get (context .Background (), & projectClient.ProjectQuery {
78- Name : d . Id () ,
97+ Name : projectName ,
7998 })
99+ tokenMutexProjectMap [projectName ].RUnlock ()
100+
80101 if err != nil {
81102 switch strings .Contains (err .Error (), "NotFound" ) {
82103 case true :
@@ -98,14 +119,23 @@ func resourceArgoCDProjectUpdate(d *schema.ResourceData, meta interface{}) error
98119 }
99120 server := meta .(ServerInterface )
100121 c := * server .ProjectClient
122+ projectName := objectMeta .Name
123+ if _ , ok := tokenMutexProjectMap [projectName ]; ! ok {
124+ tokenMutexProjectMap [projectName ] = & sync.RWMutex {}
125+ }
101126 projectRequest := & projectClient.ProjectUpdateRequest {
102127 Project : & application.AppProject {
103128 ObjectMeta : objectMeta ,
104129 Spec : spec ,
105- }}
130+ },
131+ }
132+
133+ tokenMutexProjectMap [projectName ].RLock ()
106134 p , err := c .Get (context .Background (), & projectClient.ProjectQuery {
107135 Name : d .Id (),
108136 })
137+ tokenMutexProjectMap [projectName ].RUnlock ()
138+
109139 if p != nil {
110140 // Kubernetes API requires providing the up-to-date correct ResourceVersion for updates
111141 projectRequest .Project .ResourceVersion = p .ResourceVersion
@@ -123,7 +153,11 @@ func resourceArgoCDProjectUpdate(d *schema.ResourceData, meta interface{}) error
123153 projectRequest .Project .Spec .Roles [i ].JWTTokens = pr .JWTTokens
124154 }
125155 }
156+
157+ tokenMutexProjectMap [projectName ].Lock ()
126158 _ , err = c .Update (context .Background (), projectRequest )
159+ tokenMutexProjectMap [projectName ].Unlock ()
160+
127161 if err != nil {
128162 return err
129163 }
@@ -134,7 +168,12 @@ func resourceArgoCDProjectUpdate(d *schema.ResourceData, meta interface{}) error
134168func resourceArgoCDProjectDelete (d * schema.ResourceData , meta interface {}) error {
135169 server := meta .(ServerInterface )
136170 c := * server .ProjectClient
137- _ , err := c .Delete (context .Background (), & projectClient.ProjectQuery {Name : d .Id ()})
171+ projectName := d .Id ()
172+
173+ tokenMutexProjectMap [projectName ].Lock ()
174+ _ , err := c .Delete (context .Background (), & projectClient.ProjectQuery {Name : projectName })
175+ tokenMutexProjectMap [projectName ].Unlock ()
176+
138177 if err != nil {
139178 return err
140179 }
0 commit comments