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// FirewallRulesClient 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 FirewallRulesClient struct {
33	BaseClient
34}
35
36// NewFirewallRulesClient creates an instance of the FirewallRulesClient client.
37func NewFirewallRulesClient(subscriptionID string) FirewallRulesClient {
38	return NewFirewallRulesClientWithBaseURI(DefaultBaseURI, subscriptionID)
39}
40
41// NewFirewallRulesClientWithBaseURI creates an instance of the FirewallRulesClient client using a custom endpoint.
42// Use this when interacting with an Azure cloud that uses a non-standard base URI (sovereign clouds, Azure stack).
43func NewFirewallRulesClientWithBaseURI(baseURI string, subscriptionID string) FirewallRulesClient {
44	return FirewallRulesClient{NewWithBaseURI(baseURI, subscriptionID)}
45}
46
47// CreateOrUpdate creates a new firewall rule or updates an existing firewall rule.
48// Parameters:
49// resourceGroupName - the name of the resource group that contains the resource. You can obtain this value
50// from the Azure Resource Manager API or the portal.
51// serverName - the name of the server.
52// firewallRuleName - the name of the server firewall rule.
53// parameters - the required parameters for creating or updating a firewall rule.
54func (client FirewallRulesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string, parameters FirewallRule) (result FirewallRulesCreateOrUpdateFuture, err error) {
55	if tracing.IsEnabled() {
56		ctx = tracing.StartSpan(ctx, fqdn+"/FirewallRulesClient.CreateOrUpdate")
57		defer func() {
58			sc := -1
59			if result.Response() != nil {
60				sc = result.Response().StatusCode
61			}
62			tracing.EndSpan(ctx, sc, err)
63		}()
64	}
65	if err := validation.Validate([]validation.Validation{
66		{TargetValue: parameters,
67			Constraints: []validation.Constraint{{Target: "parameters.FirewallRuleProperties", Name: validation.Null, Rule: true,
68				Chain: []validation.Constraint{{Target: "parameters.FirewallRuleProperties.StartIPAddress", Name: validation.Null, Rule: true,
69					Chain: []validation.Constraint{{Target: "parameters.FirewallRuleProperties.StartIPAddress", Name: validation.Pattern, Rule: `^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`, Chain: nil}}},
70					{Target: "parameters.FirewallRuleProperties.EndIPAddress", Name: validation.Null, Rule: true,
71						Chain: []validation.Constraint{{Target: "parameters.FirewallRuleProperties.EndIPAddress", Name: validation.Pattern, Rule: `^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`, Chain: nil}}},
72				}}}}}); err != nil {
73		return result, validation.NewError("mysql.FirewallRulesClient", "CreateOrUpdate", err.Error())
74	}
75
76	req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, serverName, firewallRuleName, parameters)
77	if err != nil {
78		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "CreateOrUpdate", nil, "Failure preparing request")
79		return
80	}
81
82	result, err = client.CreateOrUpdateSender(req)
83	if err != nil {
84		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "CreateOrUpdate", nil, "Failure sending request")
85		return
86	}
87
88	return
89}
90
91// CreateOrUpdatePreparer prepares the CreateOrUpdate request.
92func (client FirewallRulesClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string, parameters FirewallRule) (*http.Request, error) {
93	pathParameters := map[string]interface{}{
94		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
95		"resourceGroupName": autorest.Encode("path", resourceGroupName),
96		"serverName":        autorest.Encode("path", serverName),
97		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
98	}
99
100	const APIVersion = "2017-12-01-preview"
101	queryParameters := map[string]interface{}{
102		"api-version": APIVersion,
103	}
104
105	preparer := autorest.CreatePreparer(
106		autorest.AsContentType("application/json; charset=utf-8"),
107		autorest.AsPut(),
108		autorest.WithBaseURL(client.BaseURI),
109		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
110		autorest.WithJSON(parameters),
111		autorest.WithQueryParameters(queryParameters))
112	return preparer.Prepare((&http.Request{}).WithContext(ctx))
113}
114
115// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
116// http.Response Body if it receives an error.
117func (client FirewallRulesClient) CreateOrUpdateSender(req *http.Request) (future FirewallRulesCreateOrUpdateFuture, err error) {
118	var resp *http.Response
119	resp, err = client.Send(req, azure.DoRetryWithRegistration(client.Client))
120	if err != nil {
121		return
122	}
123	var azf azure.Future
124	azf, err = azure.NewFutureFromResponse(resp)
125	future.FutureAPI = &azf
126	future.Result = func(client FirewallRulesClient) (fr FirewallRule, err error) {
127		var done bool
128		done, err = future.DoneWithContext(context.Background(), client)
129		if err != nil {
130			err = autorest.NewErrorWithError(err, "mysql.FirewallRulesCreateOrUpdateFuture", "Result", future.Response(), "Polling failure")
131			return
132		}
133		if !done {
134			err = azure.NewAsyncOpIncompleteError("mysql.FirewallRulesCreateOrUpdateFuture")
135			return
136		}
137		sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
138		if fr.Response.Response, err = future.GetResult(sender); err == nil && fr.Response.Response.StatusCode != http.StatusNoContent {
139			fr, err = client.CreateOrUpdateResponder(fr.Response.Response)
140			if err != nil {
141				err = autorest.NewErrorWithError(err, "mysql.FirewallRulesCreateOrUpdateFuture", "Result", fr.Response.Response, "Failure responding to request")
142			}
143		}
144		return
145	}
146	return
147}
148
149// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
150// closes the http.Response Body.
151func (client FirewallRulesClient) CreateOrUpdateResponder(resp *http.Response) (result FirewallRule, err error) {
152	err = autorest.Respond(
153		resp,
154		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated, http.StatusAccepted),
155		autorest.ByUnmarshallingJSON(&result),
156		autorest.ByClosing())
157	result.Response = autorest.Response{Response: resp}
158	return
159}
160
161// Delete deletes a server firewall rule.
162// Parameters:
163// resourceGroupName - the name of the resource group that contains the resource. You can obtain this value
164// from the Azure Resource Manager API or the portal.
165// serverName - the name of the server.
166// firewallRuleName - the name of the server firewall rule.
167func (client FirewallRulesClient) Delete(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (result FirewallRulesDeleteFuture, err error) {
168	if tracing.IsEnabled() {
169		ctx = tracing.StartSpan(ctx, fqdn+"/FirewallRulesClient.Delete")
170		defer func() {
171			sc := -1
172			if result.Response() != nil {
173				sc = result.Response().StatusCode
174			}
175			tracing.EndSpan(ctx, sc, err)
176		}()
177	}
178	req, err := client.DeletePreparer(ctx, resourceGroupName, serverName, firewallRuleName)
179	if err != nil {
180		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Delete", nil, "Failure preparing request")
181		return
182	}
183
184	result, err = client.DeleteSender(req)
185	if err != nil {
186		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Delete", nil, "Failure sending request")
187		return
188	}
189
190	return
191}
192
193// DeletePreparer prepares the Delete request.
194func (client FirewallRulesClient) DeletePreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (*http.Request, error) {
195	pathParameters := map[string]interface{}{
196		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
197		"resourceGroupName": autorest.Encode("path", resourceGroupName),
198		"serverName":        autorest.Encode("path", serverName),
199		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
200	}
201
202	const APIVersion = "2017-12-01-preview"
203	queryParameters := map[string]interface{}{
204		"api-version": APIVersion,
205	}
206
207	preparer := autorest.CreatePreparer(
208		autorest.AsDelete(),
209		autorest.WithBaseURL(client.BaseURI),
210		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
211		autorest.WithQueryParameters(queryParameters))
212	return preparer.Prepare((&http.Request{}).WithContext(ctx))
213}
214
215// DeleteSender sends the Delete request. The method will close the
216// http.Response Body if it receives an error.
217func (client FirewallRulesClient) DeleteSender(req *http.Request) (future FirewallRulesDeleteFuture, err error) {
218	var resp *http.Response
219	resp, err = client.Send(req, azure.DoRetryWithRegistration(client.Client))
220	if err != nil {
221		return
222	}
223	var azf azure.Future
224	azf, err = azure.NewFutureFromResponse(resp)
225	future.FutureAPI = &azf
226	future.Result = func(client FirewallRulesClient) (ar autorest.Response, err error) {
227		var done bool
228		done, err = future.DoneWithContext(context.Background(), client)
229		if err != nil {
230			err = autorest.NewErrorWithError(err, "mysql.FirewallRulesDeleteFuture", "Result", future.Response(), "Polling failure")
231			return
232		}
233		if !done {
234			err = azure.NewAsyncOpIncompleteError("mysql.FirewallRulesDeleteFuture")
235			return
236		}
237		ar.Response = future.Response()
238		return
239	}
240	return
241}
242
243// DeleteResponder handles the response to the Delete request. The method always
244// closes the http.Response Body.
245func (client FirewallRulesClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) {
246	err = autorest.Respond(
247		resp,
248		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent),
249		autorest.ByClosing())
250	result.Response = resp
251	return
252}
253
254// Get gets information about a server firewall rule.
255// Parameters:
256// resourceGroupName - the name of the resource group that contains the resource. You can obtain this value
257// from the Azure Resource Manager API or the portal.
258// serverName - the name of the server.
259// firewallRuleName - the name of the server firewall rule.
260func (client FirewallRulesClient) Get(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (result FirewallRule, err error) {
261	if tracing.IsEnabled() {
262		ctx = tracing.StartSpan(ctx, fqdn+"/FirewallRulesClient.Get")
263		defer func() {
264			sc := -1
265			if result.Response.Response != nil {
266				sc = result.Response.Response.StatusCode
267			}
268			tracing.EndSpan(ctx, sc, err)
269		}()
270	}
271	req, err := client.GetPreparer(ctx, resourceGroupName, serverName, firewallRuleName)
272	if err != nil {
273		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", nil, "Failure preparing request")
274		return
275	}
276
277	resp, err := client.GetSender(req)
278	if err != nil {
279		result.Response = autorest.Response{Response: resp}
280		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", resp, "Failure sending request")
281		return
282	}
283
284	result, err = client.GetResponder(resp)
285	if err != nil {
286		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", resp, "Failure responding to request")
287		return
288	}
289
290	return
291}
292
293// GetPreparer prepares the Get request.
294func (client FirewallRulesClient) GetPreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (*http.Request, error) {
295	pathParameters := map[string]interface{}{
296		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
297		"resourceGroupName": autorest.Encode("path", resourceGroupName),
298		"serverName":        autorest.Encode("path", serverName),
299		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
300	}
301
302	const APIVersion = "2017-12-01-preview"
303	queryParameters := map[string]interface{}{
304		"api-version": APIVersion,
305	}
306
307	preparer := autorest.CreatePreparer(
308		autorest.AsGet(),
309		autorest.WithBaseURL(client.BaseURI),
310		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
311		autorest.WithQueryParameters(queryParameters))
312	return preparer.Prepare((&http.Request{}).WithContext(ctx))
313}
314
315// GetSender sends the Get request. The method will close the
316// http.Response Body if it receives an error.
317func (client FirewallRulesClient) GetSender(req *http.Request) (*http.Response, error) {
318	return client.Send(req, azure.DoRetryWithRegistration(client.Client))
319}
320
321// GetResponder handles the response to the Get request. The method always
322// closes the http.Response Body.
323func (client FirewallRulesClient) GetResponder(resp *http.Response) (result FirewallRule, err error) {
324	err = autorest.Respond(
325		resp,
326		azure.WithErrorUnlessStatusCode(http.StatusOK),
327		autorest.ByUnmarshallingJSON(&result),
328		autorest.ByClosing())
329	result.Response = autorest.Response{Response: resp}
330	return
331}
332
333// ListByServer list all the firewall rules in a given server.
334// Parameters:
335// resourceGroupName - the name of the resource group that contains the resource. You can obtain this value
336// from the Azure Resource Manager API or the portal.
337// serverName - the name of the server.
338func (client FirewallRulesClient) ListByServer(ctx context.Context, resourceGroupName string, serverName string) (result FirewallRuleListResult, err error) {
339	if tracing.IsEnabled() {
340		ctx = tracing.StartSpan(ctx, fqdn+"/FirewallRulesClient.ListByServer")
341		defer func() {
342			sc := -1
343			if result.Response.Response != nil {
344				sc = result.Response.Response.StatusCode
345			}
346			tracing.EndSpan(ctx, sc, err)
347		}()
348	}
349	req, err := client.ListByServerPreparer(ctx, resourceGroupName, serverName)
350	if err != nil {
351		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", nil, "Failure preparing request")
352		return
353	}
354
355	resp, err := client.ListByServerSender(req)
356	if err != nil {
357		result.Response = autorest.Response{Response: resp}
358		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", resp, "Failure sending request")
359		return
360	}
361
362	result, err = client.ListByServerResponder(resp)
363	if err != nil {
364		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", resp, "Failure responding to request")
365		return
366	}
367
368	return
369}
370
371// ListByServerPreparer prepares the ListByServer request.
372func (client FirewallRulesClient) ListByServerPreparer(ctx context.Context, resourceGroupName string, serverName string) (*http.Request, error) {
373	pathParameters := map[string]interface{}{
374		"resourceGroupName": autorest.Encode("path", resourceGroupName),
375		"serverName":        autorest.Encode("path", serverName),
376		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
377	}
378
379	const APIVersion = "2017-12-01-preview"
380	queryParameters := map[string]interface{}{
381		"api-version": APIVersion,
382	}
383
384	preparer := autorest.CreatePreparer(
385		autorest.AsGet(),
386		autorest.WithBaseURL(client.BaseURI),
387		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBForMySQL/servers/{serverName}/firewallRules", pathParameters),
388		autorest.WithQueryParameters(queryParameters))
389	return preparer.Prepare((&http.Request{}).WithContext(ctx))
390}
391
392// ListByServerSender sends the ListByServer request. The method will close the
393// http.Response Body if it receives an error.
394func (client FirewallRulesClient) ListByServerSender(req *http.Request) (*http.Response, error) {
395	return client.Send(req, azure.DoRetryWithRegistration(client.Client))
396}
397
398// ListByServerResponder handles the response to the ListByServer request. The method always
399// closes the http.Response Body.
400func (client FirewallRulesClient) ListByServerResponder(resp *http.Response) (result FirewallRuleListResult, err error) {
401	err = autorest.Respond(
402		resp,
403		azure.WithErrorUnlessStatusCode(http.StatusOK),
404		autorest.ByUnmarshallingJSON(&result),
405		autorest.ByClosing())
406	result.Response = autorest.Response{Response: resp}
407	return
408}
409