@@ -52,6 +52,7 @@ type MicrocksClient interface {
5252 GetTestResult (testResultID string ) (* TestResultSummary , error )
5353 UploadArtifact (specificationFilePath string , mainArtifact bool ) (string , error )
5454 DownloadArtifact (artifactURL string , mainArtifact bool , secret string ) (string , error )
55+ DeleteService (service string , version string ) error
5556}
5657
5758// TestResultSummary represents a simple view on Microcks TestResult
@@ -170,6 +171,101 @@ func NewClient(opts ClientOptions) (MicrocksClient, error) {
170171 return & c , nil
171172}
172173
174+ type serviceSummary struct {
175+ ID string `json:"id"`
176+ Name string `json:"name"`
177+ Version string `json:"version"`
178+ }
179+
180+ func (c * microcksClient ) DeleteService (service string , version string ) error {
181+ // First, search for the service ID
182+ searchRel := & url.URL {Path : "services/search" }
183+ searchU := c .APIURL .ResolveReference (searchRel )
184+
185+ q := searchU .Query ()
186+ q .Set ("name" , service )
187+ q .Set ("version" , version )
188+ // We also set queryMap JSON string just in case Microcks uses a custom deserializer,
189+ // but standard Spring Boot uses direct query params.
190+ queryMap := map [string ]string {
191+ "name" : service ,
192+ "version" : version ,
193+ }
194+ queryMapBytes , _ := json .Marshal (queryMap )
195+ q .Set ("queryMap" , string (queryMapBytes ))
196+ searchU .RawQuery = q .Encode ()
197+
198+ searchReq , err := http .NewRequest ("GET" , searchU .String (), nil )
199+ if err != nil {
200+ return err
201+ }
202+ searchReq .Header .Set ("Authorization" , "Bearer " + c .AuthToken )
203+ searchReq .Header .Set ("Accept" , "application/json" )
204+
205+ config .DumpRequestIfRequired ("Microcks search service" , searchReq , true )
206+
207+ searchResp , err := c .httpClient .Do (searchReq )
208+ if err != nil {
209+ return err
210+ }
211+ defer searchResp .Body .Close ()
212+
213+ config .DumpResponseIfRequired ("Microcks search service" , searchResp , true )
214+
215+ if searchResp .StatusCode != 200 {
216+ body , _ := io .ReadAll (searchResp .Body )
217+ return fmt .Errorf ("failed to search service: %s" , string (body ))
218+ }
219+
220+ body , _ := io .ReadAll (searchResp .Body )
221+ var services []serviceSummary
222+ if err := json .Unmarshal (body , & services ); err != nil {
223+ return fmt .Errorf ("failed to parse search response: %v" , err )
224+ }
225+
226+ var serviceID string
227+ for _ , s := range services {
228+ if s .Name == service && s .Version == version {
229+ serviceID = s .ID
230+ break
231+ }
232+ }
233+
234+ if serviceID == "" {
235+ return fmt .Errorf ("service '%s:%s' not found" , service , version )
236+ }
237+
238+ // Now delete using the ID
239+ deleteRel := & url.URL {Path : "services/" + serviceID }
240+ deleteU := c .APIURL .ResolveReference (deleteRel )
241+
242+ req , err := http .NewRequest ("DELETE" , deleteU .String (), nil )
243+ if err != nil {
244+ return err
245+ }
246+
247+ req .Header .Set ("Authorization" , "Bearer " + c .AuthToken )
248+ req .Header .Set ("Accept" , "application/json" )
249+
250+ config .DumpRequestIfRequired ("Microcks delete service" , req , true )
251+
252+ resp , err := c .httpClient .Do (req )
253+ if err != nil {
254+ return err
255+ }
256+ defer resp .Body .Close ()
257+
258+ config .DumpResponseIfRequired ("Microcks delete service" , resp , true )
259+
260+ body , _ = io .ReadAll (resp .Body )
261+
262+ if resp .StatusCode != 200 && resp .StatusCode != 204 {
263+ return fmt .Errorf ("delete failed: %s" , string (body ))
264+ }
265+
266+ return nil
267+ }
268+
173269// NewMicrocksClient builds a new headless MicrocksClient without any authtoken and all for general purposes
174270func NewMicrocksClient (apiURL string ) MicrocksClient {
175271 mc := microcksClient {}
0 commit comments