1package mysql
2
3// Copyright (c) Microsoft and contributors.  All rights reserved.
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13//
14// See the License for the specific language governing permissions and
15// limitations under the License.
16//
17// Code generated by Microsoft (R) AutoRest Code Generator.
18// Changes may cause incorrect behavior and will be lost if the code is regenerated.
19
20import (
21	"context"
22	"github.com/Azure/go-autorest/autorest"
23	"github.com/Azure/go-autorest/autorest/azure"
24	"github.com/Azure/go-autorest/autorest/validation"
25	"github.com/Azure/go-autorest/tracing"
26	"net/http"
27)
28
29// VirtualNetworkRulesClient is the the Microsoft Azure management API provides create, read, update, and delete
30// functionality for Azure MySQL resources including servers, databases, firewall rules, VNET rules, log files and
31// configurations with new business model.
32type VirtualNetworkRulesClient struct {
33	BaseClient
34}
35
36// NewVirtualNetworkRulesClient creates an instance of the VirtualNetworkRulesClient client.
37func NewVirtualNetworkRulesClient(subscriptionID string) VirtualNetworkRulesClient {
38	return NewVirtualNetworkRulesClientWithBaseURI(DefaultBaseURI, subscriptionID)
39}
40
41// NewVirtualNetworkRulesClientWithBaseURI creates an instance of the VirtualNetworkRulesClient client using a custom
42// endpoint.  Use this when interacting with an Azure cloud that uses a non-standard base URI (sovereign clouds, Azure
43// stack).
44func NewVirtualNetworkRulesClientWithBaseURI(baseURI string, subscriptionID string) VirtualNetworkRulesClient {
45	return VirtualNetworkRulesClient{NewWithBaseURI(baseURI, subscriptionID)}
46}
47
48// CreateOrUpdate creates or updates an existing virtual network rule.
49// Parameters:
50// resourceGroupName - the name of the resource group. The name is case insensitive.
51// serverName - the name of the server.
52// virtualNetworkRuleName - the name of the virtual network rule.
53// parameters - the requested virtual Network Rule Resource state.
54func (client VirtualNetworkRulesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string, parameters VirtualNetworkRule) (result VirtualNetworkRulesCreateOrUpdateFuture, err error) {
55	if tracing.IsEnabled() {
56		ctx = tracing.StartSpan(ctx, fqdn+"/VirtualNetworkRulesClient.CreateOrUpdate")
57		defer func() {
58			sc := -1
59			if result.FutureAPI != nil && result.FutureAPI.Response() != nil {
60				sc = result.FutureAPI.Response().StatusCode
61			}
62			tracing.EndSpan(ctx, sc, err)
63		}()
64	}
65	if err := validation.Validate([]validation.Validation{
66		{TargetValue: resourceGroupName,
67			Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
68				{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
69				{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
70		{TargetValue: client.SubscriptionID,
71			Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}},
72		{TargetValue: parameters,
73			Constraints: []validation.Constraint{{Target: "parameters.VirtualNetworkRuleProperties", Name: validation.Null, Rule: false,
74				Chain: []validation.Constraint{{Target: "parameters.VirtualNetworkRuleProperties.VirtualNetworkSubnetID", Name: validation.Null, Rule: true, Chain: nil}}}}}}); err != nil {
75		return result, validation.NewError("mysql.VirtualNetworkRulesClient", "CreateOrUpdate", err.Error())
76	}
77
78	req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, serverName, virtualNetworkRuleName, parameters)
79	if err != nil {
80		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "CreateOrUpdate", nil, "Failure preparing request")
81		return
82	}
83
84	result, err = client.CreateOrUpdateSender(req)
85	if err != nil {
86		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "CreateOrUpdate", nil, "Failure sending request")
87		return
88	}
89
90	return
91}
92
93// CreateOrUpdatePreparer prepares the CreateOrUpdate request.
94func (client VirtualNetworkRulesClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string, parameters VirtualNetworkRule) (*http.Request, error) {
95	pathParameters := map[string]interface{}{
96		"resourceGroupName":      autorest.Encode("path", resourceGroupName),
97		"serverName":             autorest.Encode("path", serverName),
98		"subscriptionId":         autorest.Encode("path", client.SubscriptionID),
99		"virtualNetworkRuleName": autorest.Encode("path", virtualNetworkRuleName),
100	}
101
102	const APIVersion = "2017-12-01"
103	queryParameters := map[string]interface{}{
104		"api-version": APIVersion,
105	}
106
107	preparer := autorest.CreatePreparer(
108		autorest.AsContentType("application/json; charset=utf-8"),
109		autorest.AsPut(),
110		autorest.WithBaseURL(client.BaseURI),
111		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/virtualNetworkRules/{virtualNetworkRuleName}", pathParameters),
112		autorest.WithJSON(parameters),
113		autorest.WithQueryParameters(queryParameters))
114	return preparer.Prepare((&http.Request{}).WithContext(ctx))
115}
116
117// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
118// http.Response Body if it receives an error.
119func (client VirtualNetworkRulesClient) CreateOrUpdateSender(req *http.Request) (future VirtualNetworkRulesCreateOrUpdateFuture, err error) {
120	var resp *http.Response
121	resp, err = client.Send(req, azure.DoRetryWithRegistration(client.Client))
122	if err != nil {
123		return
124	}
125	var azf azure.Future
126	azf, err = azure.NewFutureFromResponse(resp)
127	future.FutureAPI = &azf
128	future.Result = func(client VirtualNetworkRulesClient) (vnr VirtualNetworkRule, err error) {
129		var done bool
130		done, err = future.DoneWithContext(context.Background(), client)
131		if err != nil {
132			err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesCreateOrUpdateFuture", "Result", future.Response(), "Polling failure")
133			return
134		}
135		if !done {
136			err = azure.NewAsyncOpIncompleteError("mysql.VirtualNetworkRulesCreateOrUpdateFuture")
137			return
138		}
139		sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
140		vnr.Response.Response, err = future.GetResult(sender)
141		if vnr.Response.Response == nil && err == nil {
142			err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesCreateOrUpdateFuture", "Result", nil, "received nil response and error")
143		}
144		if err == nil && vnr.Response.Response.StatusCode != http.StatusNoContent {
145			vnr, err = client.CreateOrUpdateResponder(vnr.Response.Response)
146			if err != nil {
147				err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesCreateOrUpdateFuture", "Result", vnr.Response.Response, "Failure responding to request")
148			}
149		}
150		return
151	}
152	return
153}
154
155// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
156// closes the http.Response Body.
157func (client VirtualNetworkRulesClient) CreateOrUpdateResponder(resp *http.Response) (result VirtualNetworkRule, err error) {
158	err = autorest.Respond(
159		resp,
160		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated, http.StatusAccepted),
161		autorest.ByUnmarshallingJSON(&result),
162		autorest.ByClosing())
163	result.Response = autorest.Response{Response: resp}
164	return
165}
166
167// Delete deletes the virtual network rule with the given name.
168// Parameters:
169// resourceGroupName - the name of the resource group. The name is case insensitive.
170// serverName - the name of the server.
171// virtualNetworkRuleName - the name of the virtual network rule.
172func (client VirtualNetworkRulesClient) Delete(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string) (result VirtualNetworkRulesDeleteFuture, err error) {
173	if tracing.IsEnabled() {
174		ctx = tracing.StartSpan(ctx, fqdn+"/VirtualNetworkRulesClient.Delete")
175		defer func() {
176			sc := -1
177			if result.FutureAPI != nil && result.FutureAPI.Response() != nil {
178				sc = result.FutureAPI.Response().StatusCode
179			}
180			tracing.EndSpan(ctx, sc, err)
181		}()
182	}
183	if err := validation.Validate([]validation.Validation{
184		{TargetValue: resourceGroupName,
185			Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
186				{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
187				{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
188		{TargetValue: client.SubscriptionID,
189			Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
190		return result, validation.NewError("mysql.VirtualNetworkRulesClient", "Delete", err.Error())
191	}
192
193	req, err := client.DeletePreparer(ctx, resourceGroupName, serverName, virtualNetworkRuleName)
194	if err != nil {
195		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "Delete", nil, "Failure preparing request")
196		return
197	}
198
199	result, err = client.DeleteSender(req)
200	if err != nil {
201		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "Delete", nil, "Failure sending request")
202		return
203	}
204
205	return
206}
207
208// DeletePreparer prepares the Delete request.
209func (client VirtualNetworkRulesClient) DeletePreparer(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string) (*http.Request, error) {
210	pathParameters := map[string]interface{}{
211		"resourceGroupName":      autorest.Encode("path", resourceGroupName),
212		"serverName":             autorest.Encode("path", serverName),
213		"subscriptionId":         autorest.Encode("path", client.SubscriptionID),
214		"virtualNetworkRuleName": autorest.Encode("path", virtualNetworkRuleName),
215	}
216
217	const APIVersion = "2017-12-01"
218	queryParameters := map[string]interface{}{
219		"api-version": APIVersion,
220	}
221
222	preparer := autorest.CreatePreparer(
223		autorest.AsDelete(),
224		autorest.WithBaseURL(client.BaseURI),
225		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/virtualNetworkRules/{virtualNetworkRuleName}", pathParameters),
226		autorest.WithQueryParameters(queryParameters))
227	return preparer.Prepare((&http.Request{}).WithContext(ctx))
228}
229
230// DeleteSender sends the Delete request. The method will close the
231// http.Response Body if it receives an error.
232func (client VirtualNetworkRulesClient) DeleteSender(req *http.Request) (future VirtualNetworkRulesDeleteFuture, err error) {
233	var resp *http.Response
234	resp, err = client.Send(req, azure.DoRetryWithRegistration(client.Client))
235	if err != nil {
236		return
237	}
238	var azf azure.Future
239	azf, err = azure.NewFutureFromResponse(resp)
240	future.FutureAPI = &azf
241	future.Result = func(client VirtualNetworkRulesClient) (ar autorest.Response, err error) {
242		var done bool
243		done, err = future.DoneWithContext(context.Background(), client)
244		if err != nil {
245			err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesDeleteFuture", "Result", future.Response(), "Polling failure")
246			return
247		}
248		if !done {
249			err = azure.NewAsyncOpIncompleteError("mysql.VirtualNetworkRulesDeleteFuture")
250			return
251		}
252		ar.Response = future.Response()
253		return
254	}
255	return
256}
257
258// DeleteResponder handles the response to the Delete request. The method always
259// closes the http.Response Body.
260func (client VirtualNetworkRulesClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) {
261	err = autorest.Respond(
262		resp,
263		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent),
264		autorest.ByClosing())
265	result.Response = resp
266	return
267}
268
269// Get gets a virtual network rule.
270// Parameters:
271// resourceGroupName - the name of the resource group. The name is case insensitive.
272// serverName - the name of the server.
273// virtualNetworkRuleName - the name of the virtual network rule.
274func (client VirtualNetworkRulesClient) Get(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string) (result VirtualNetworkRule, err error) {
275	if tracing.IsEnabled() {
276		ctx = tracing.StartSpan(ctx, fqdn+"/VirtualNetworkRulesClient.Get")
277		defer func() {
278			sc := -1
279			if result.Response.Response != nil {
280				sc = result.Response.Response.StatusCode
281			}
282			tracing.EndSpan(ctx, sc, err)
283		}()
284	}
285	if err := validation.Validate([]validation.Validation{
286		{TargetValue: resourceGroupName,
287			Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
288				{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
289				{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
290		{TargetValue: client.SubscriptionID,
291			Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
292		return result, validation.NewError("mysql.VirtualNetworkRulesClient", "Get", err.Error())
293	}
294
295	req, err := client.GetPreparer(ctx, resourceGroupName, serverName, virtualNetworkRuleName)
296	if err != nil {
297		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "Get", nil, "Failure preparing request")
298		return
299	}
300
301	resp, err := client.GetSender(req)
302	if err != nil {
303		result.Response = autorest.Response{Response: resp}
304		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "Get", resp, "Failure sending request")
305		return
306	}
307
308	result, err = client.GetResponder(resp)
309	if err != nil {
310		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "Get", resp, "Failure responding to request")
311		return
312	}
313
314	return
315}
316
317// GetPreparer prepares the Get request.
318func (client VirtualNetworkRulesClient) GetPreparer(ctx context.Context, resourceGroupName string, serverName string, virtualNetworkRuleName string) (*http.Request, error) {
319	pathParameters := map[string]interface{}{
320		"resourceGroupName":      autorest.Encode("path", resourceGroupName),
321		"serverName":             autorest.Encode("path", serverName),
322		"subscriptionId":         autorest.Encode("path", client.SubscriptionID),
323		"virtualNetworkRuleName": autorest.Encode("path", virtualNetworkRuleName),
324	}
325
326	const APIVersion = "2017-12-01"
327	queryParameters := map[string]interface{}{
328		"api-version": APIVersion,
329	}
330
331	preparer := autorest.CreatePreparer(
332		autorest.AsGet(),
333		autorest.WithBaseURL(client.BaseURI),
334		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/virtualNetworkRules/{virtualNetworkRuleName}", pathParameters),
335		autorest.WithQueryParameters(queryParameters))
336	return preparer.Prepare((&http.Request{}).WithContext(ctx))
337}
338
339// GetSender sends the Get request. The method will close the
340// http.Response Body if it receives an error.
341func (client VirtualNetworkRulesClient) GetSender(req *http.Request) (*http.Response, error) {
342	return client.Send(req, azure.DoRetryWithRegistration(client.Client))
343}
344
345// GetResponder handles the response to the Get request. The method always
346// closes the http.Response Body.
347func (client VirtualNetworkRulesClient) GetResponder(resp *http.Response) (result VirtualNetworkRule, err error) {
348	err = autorest.Respond(
349		resp,
350		azure.WithErrorUnlessStatusCode(http.StatusOK),
351		autorest.ByUnmarshallingJSON(&result),
352		autorest.ByClosing())
353	result.Response = autorest.Response{Response: resp}
354	return
355}
356
357// ListByServer gets a list of virtual network rules in a server.
358// Parameters:
359// resourceGroupName - the name of the resource group. The name is case insensitive.
360// serverName - the name of the server.
361func (client VirtualNetworkRulesClient) ListByServer(ctx context.Context, resourceGroupName string, serverName string) (result VirtualNetworkRuleListResultPage, err error) {
362	if tracing.IsEnabled() {
363		ctx = tracing.StartSpan(ctx, fqdn+"/VirtualNetworkRulesClient.ListByServer")
364		defer func() {
365			sc := -1
366			if result.vnrlr.Response.Response != nil {
367				sc = result.vnrlr.Response.Response.StatusCode
368			}
369			tracing.EndSpan(ctx, sc, err)
370		}()
371	}
372	if err := validation.Validate([]validation.Validation{
373		{TargetValue: resourceGroupName,
374			Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
375				{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
376				{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
377		{TargetValue: client.SubscriptionID,
378			Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
379		return result, validation.NewError("mysql.VirtualNetworkRulesClient", "ListByServer", err.Error())
380	}
381
382	result.fn = client.listByServerNextResults
383	req, err := client.ListByServerPreparer(ctx, resourceGroupName, serverName)
384	if err != nil {
385		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "ListByServer", nil, "Failure preparing request")
386		return
387	}
388
389	resp, err := client.ListByServerSender(req)
390	if err != nil {
391		result.vnrlr.Response = autorest.Response{Response: resp}
392		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "ListByServer", resp, "Failure sending request")
393		return
394	}
395
396	result.vnrlr, err = client.ListByServerResponder(resp)
397	if err != nil {
398		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "ListByServer", resp, "Failure responding to request")
399		return
400	}
401	if result.vnrlr.hasNextLink() && result.vnrlr.IsEmpty() {
402		err = result.NextWithContext(ctx)
403		return
404	}
405
406	return
407}
408
409// ListByServerPreparer prepares the ListByServer request.
410func (client VirtualNetworkRulesClient) ListByServerPreparer(ctx context.Context, resourceGroupName string, serverName string) (*http.Request, error) {
411	pathParameters := map[string]interface{}{
412		"resourceGroupName": autorest.Encode("path", resourceGroupName),
413		"serverName":        autorest.Encode("path", serverName),
414		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
415	}
416
417	const APIVersion = "2017-12-01"
418	queryParameters := map[string]interface{}{
419		"api-version": APIVersion,
420	}
421
422	preparer := autorest.CreatePreparer(
423		autorest.AsGet(),
424		autorest.WithBaseURL(client.BaseURI),
425		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/virtualNetworkRules", pathParameters),
426		autorest.WithQueryParameters(queryParameters))
427	return preparer.Prepare((&http.Request{}).WithContext(ctx))
428}
429
430// ListByServerSender sends the ListByServer request. The method will close the
431// http.Response Body if it receives an error.
432func (client VirtualNetworkRulesClient) ListByServerSender(req *http.Request) (*http.Response, error) {
433	return client.Send(req, azure.DoRetryWithRegistration(client.Client))
434}
435
436// ListByServerResponder handles the response to the ListByServer request. The method always
437// closes the http.Response Body.
438func (client VirtualNetworkRulesClient) ListByServerResponder(resp *http.Response) (result VirtualNetworkRuleListResult, err error) {
439	err = autorest.Respond(
440		resp,
441		azure.WithErrorUnlessStatusCode(http.StatusOK),
442		autorest.ByUnmarshallingJSON(&result),
443		autorest.ByClosing())
444	result.Response = autorest.Response{Response: resp}
445	return
446}
447
448// listByServerNextResults retrieves the next set of results, if any.
449func (client VirtualNetworkRulesClient) listByServerNextResults(ctx context.Context, lastResults VirtualNetworkRuleListResult) (result VirtualNetworkRuleListResult, err error) {
450	req, err := lastResults.virtualNetworkRuleListResultPreparer(ctx)
451	if err != nil {
452		return result, autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "listByServerNextResults", nil, "Failure preparing next results request")
453	}
454	if req == nil {
455		return
456	}
457	resp, err := client.ListByServerSender(req)
458	if err != nil {
459		result.Response = autorest.Response{Response: resp}
460		return result, autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "listByServerNextResults", resp, "Failure sending next results request")
461	}
462	result, err = client.ListByServerResponder(resp)
463	if err != nil {
464		err = autorest.NewErrorWithError(err, "mysql.VirtualNetworkRulesClient", "listByServerNextResults", resp, "Failure responding to next results request")
465	}
466	return
467}
468
469// ListByServerComplete enumerates all values, automatically crossing page boundaries as required.
470func (client VirtualNetworkRulesClient) ListByServerComplete(ctx context.Context, resourceGroupName string, serverName string) (result VirtualNetworkRuleListResultIterator, err error) {
471	if tracing.IsEnabled() {
472		ctx = tracing.StartSpan(ctx, fqdn+"/VirtualNetworkRulesClient.ListByServer")
473		defer func() {
474			sc := -1
475			if result.Response().Response.Response != nil {
476				sc = result.page.Response().Response.Response.StatusCode
477			}
478			tracing.EndSpan(ctx, sc, err)
479		}()
480	}
481	result.page, err = client.ListByServer(ctx, resourceGroupName, serverName)
482	return
483}
484