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	"net/http"
26)
27
28// FirewallRulesClient is the the Microsoft Azure management API provides create, read, update, and delete
29// functionality for Azure MySQL resources including servers, databases, firewall rules, log files and configurations
30// with new business model.
31type FirewallRulesClient struct {
32	BaseClient
33}
34
35// NewFirewallRulesClient creates an instance of the FirewallRulesClient client.
36func NewFirewallRulesClient(subscriptionID string) FirewallRulesClient {
37	return NewFirewallRulesClientWithBaseURI(DefaultBaseURI, subscriptionID)
38}
39
40// NewFirewallRulesClientWithBaseURI creates an instance of the FirewallRulesClient client.
41func NewFirewallRulesClientWithBaseURI(baseURI string, subscriptionID string) FirewallRulesClient {
42	return FirewallRulesClient{NewWithBaseURI(baseURI, subscriptionID)}
43}
44
45// CreateOrUpdate creates a new firewall rule or updates an existing firewall rule.
46//
47// resourceGroupName is the name of the resource group that contains the resource. You can obtain this value from
48// the Azure Resource Manager API or the portal. serverName is the name of the server. firewallRuleName is the name
49// of the server firewall rule. parameters is the required parameters for creating or updating a firewall rule.
50func (client FirewallRulesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string, parameters FirewallRule) (result FirewallRulesCreateOrUpdateFuture, err error) {
51	if err := validation.Validate([]validation.Validation{
52		{TargetValue: parameters,
53			Constraints: []validation.Constraint{{Target: "parameters.FirewallRuleProperties", Name: validation.Null, Rule: true,
54				Chain: []validation.Constraint{{Target: "parameters.FirewallRuleProperties.StartIPAddress", Name: validation.Null, Rule: true,
55					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}}},
56					{Target: "parameters.FirewallRuleProperties.EndIPAddress", Name: validation.Null, Rule: true,
57						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}}},
58				}}}}}); err != nil {
59		return result, validation.NewError("mysql.FirewallRulesClient", "CreateOrUpdate", err.Error())
60	}
61
62	req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, serverName, firewallRuleName, parameters)
63	if err != nil {
64		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "CreateOrUpdate", nil, "Failure preparing request")
65		return
66	}
67
68	result, err = client.CreateOrUpdateSender(req)
69	if err != nil {
70		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "CreateOrUpdate", result.Response(), "Failure sending request")
71		return
72	}
73
74	return
75}
76
77// CreateOrUpdatePreparer prepares the CreateOrUpdate request.
78func (client FirewallRulesClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string, parameters FirewallRule) (*http.Request, error) {
79	pathParameters := map[string]interface{}{
80		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
81		"resourceGroupName": autorest.Encode("path", resourceGroupName),
82		"serverName":        autorest.Encode("path", serverName),
83		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
84	}
85
86	const APIVersion = "2017-12-01-preview"
87	queryParameters := map[string]interface{}{
88		"api-version": APIVersion,
89	}
90
91	preparer := autorest.CreatePreparer(
92		autorest.AsContentType("application/json; charset=utf-8"),
93		autorest.AsPut(),
94		autorest.WithBaseURL(client.BaseURI),
95		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBforMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
96		autorest.WithJSON(parameters),
97		autorest.WithQueryParameters(queryParameters))
98	return preparer.Prepare((&http.Request{}).WithContext(ctx))
99}
100
101// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
102// http.Response Body if it receives an error.
103func (client FirewallRulesClient) CreateOrUpdateSender(req *http.Request) (future FirewallRulesCreateOrUpdateFuture, err error) {
104	sender := autorest.DecorateSender(client, azure.DoRetryWithRegistration(client.Client))
105	future.Future = azure.NewFuture(req)
106	future.req = req
107	_, err = future.Done(sender)
108	if err != nil {
109		return
110	}
111	err = autorest.Respond(future.Response(),
112		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated, http.StatusAccepted))
113	return
114}
115
116// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
117// closes the http.Response Body.
118func (client FirewallRulesClient) CreateOrUpdateResponder(resp *http.Response) (result FirewallRule, err error) {
119	err = autorest.Respond(
120		resp,
121		client.ByInspecting(),
122		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated, http.StatusAccepted),
123		autorest.ByUnmarshallingJSON(&result),
124		autorest.ByClosing())
125	result.Response = autorest.Response{Response: resp}
126	return
127}
128
129// Delete deletes a server firewall rule.
130//
131// resourceGroupName is the name of the resource group that contains the resource. You can obtain this value from
132// the Azure Resource Manager API or the portal. serverName is the name of the server. firewallRuleName is the name
133// of the server firewall rule.
134func (client FirewallRulesClient) Delete(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (result FirewallRulesDeleteFuture, err error) {
135	req, err := client.DeletePreparer(ctx, resourceGroupName, serverName, firewallRuleName)
136	if err != nil {
137		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Delete", nil, "Failure preparing request")
138		return
139	}
140
141	result, err = client.DeleteSender(req)
142	if err != nil {
143		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Delete", result.Response(), "Failure sending request")
144		return
145	}
146
147	return
148}
149
150// DeletePreparer prepares the Delete request.
151func (client FirewallRulesClient) DeletePreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (*http.Request, error) {
152	pathParameters := map[string]interface{}{
153		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
154		"resourceGroupName": autorest.Encode("path", resourceGroupName),
155		"serverName":        autorest.Encode("path", serverName),
156		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
157	}
158
159	const APIVersion = "2017-12-01-preview"
160	queryParameters := map[string]interface{}{
161		"api-version": APIVersion,
162	}
163
164	preparer := autorest.CreatePreparer(
165		autorest.AsDelete(),
166		autorest.WithBaseURL(client.BaseURI),
167		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBforMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
168		autorest.WithQueryParameters(queryParameters))
169	return preparer.Prepare((&http.Request{}).WithContext(ctx))
170}
171
172// DeleteSender sends the Delete request. The method will close the
173// http.Response Body if it receives an error.
174func (client FirewallRulesClient) DeleteSender(req *http.Request) (future FirewallRulesDeleteFuture, err error) {
175	sender := autorest.DecorateSender(client, azure.DoRetryWithRegistration(client.Client))
176	future.Future = azure.NewFuture(req)
177	future.req = req
178	_, err = future.Done(sender)
179	if err != nil {
180		return
181	}
182	err = autorest.Respond(future.Response(),
183		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent))
184	return
185}
186
187// DeleteResponder handles the response to the Delete request. The method always
188// closes the http.Response Body.
189func (client FirewallRulesClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) {
190	err = autorest.Respond(
191		resp,
192		client.ByInspecting(),
193		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent),
194		autorest.ByClosing())
195	result.Response = resp
196	return
197}
198
199// Get gets information about a server firewall rule.
200//
201// resourceGroupName is the name of the resource group that contains the resource. You can obtain this value from
202// the Azure Resource Manager API or the portal. serverName is the name of the server. firewallRuleName is the name
203// of the server firewall rule.
204func (client FirewallRulesClient) Get(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (result FirewallRule, err error) {
205	req, err := client.GetPreparer(ctx, resourceGroupName, serverName, firewallRuleName)
206	if err != nil {
207		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", nil, "Failure preparing request")
208		return
209	}
210
211	resp, err := client.GetSender(req)
212	if err != nil {
213		result.Response = autorest.Response{Response: resp}
214		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", resp, "Failure sending request")
215		return
216	}
217
218	result, err = client.GetResponder(resp)
219	if err != nil {
220		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "Get", resp, "Failure responding to request")
221	}
222
223	return
224}
225
226// GetPreparer prepares the Get request.
227func (client FirewallRulesClient) GetPreparer(ctx context.Context, resourceGroupName string, serverName string, firewallRuleName string) (*http.Request, error) {
228	pathParameters := map[string]interface{}{
229		"firewallRuleName":  autorest.Encode("path", firewallRuleName),
230		"resourceGroupName": autorest.Encode("path", resourceGroupName),
231		"serverName":        autorest.Encode("path", serverName),
232		"subscriptionId":    autorest.Encode("path", client.SubscriptionID),
233	}
234
235	const APIVersion = "2017-12-01-preview"
236	queryParameters := map[string]interface{}{
237		"api-version": APIVersion,
238	}
239
240	preparer := autorest.CreatePreparer(
241		autorest.AsGet(),
242		autorest.WithBaseURL(client.BaseURI),
243		autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DBforMySQL/servers/{serverName}/firewallRules/{firewallRuleName}", pathParameters),
244		autorest.WithQueryParameters(queryParameters))
245	return preparer.Prepare((&http.Request{}).WithContext(ctx))
246}
247
248// GetSender sends the Get request. The method will close the
249// http.Response Body if it receives an error.
250func (client FirewallRulesClient) GetSender(req *http.Request) (*http.Response, error) {
251	return autorest.SendWithSender(client, req,
252		azure.DoRetryWithRegistration(client.Client))
253}
254
255// GetResponder handles the response to the Get request. The method always
256// closes the http.Response Body.
257func (client FirewallRulesClient) GetResponder(resp *http.Response) (result FirewallRule, err error) {
258	err = autorest.Respond(
259		resp,
260		client.ByInspecting(),
261		azure.WithErrorUnlessStatusCode(http.StatusOK),
262		autorest.ByUnmarshallingJSON(&result),
263		autorest.ByClosing())
264	result.Response = autorest.Response{Response: resp}
265	return
266}
267
268// ListByServer list all the firewall rules in a given server.
269//
270// resourceGroupName is the name of the resource group that contains the resource. You can obtain this value from
271// the Azure Resource Manager API or the portal. serverName is the name of the server.
272func (client FirewallRulesClient) ListByServer(ctx context.Context, resourceGroupName string, serverName string) (result FirewallRuleListResult, err error) {
273	req, err := client.ListByServerPreparer(ctx, resourceGroupName, serverName)
274	if err != nil {
275		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", nil, "Failure preparing request")
276		return
277	}
278
279	resp, err := client.ListByServerSender(req)
280	if err != nil {
281		result.Response = autorest.Response{Response: resp}
282		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", resp, "Failure sending request")
283		return
284	}
285
286	result, err = client.ListByServerResponder(resp)
287	if err != nil {
288		err = autorest.NewErrorWithError(err, "mysql.FirewallRulesClient", "ListByServer", resp, "Failure responding to request")
289	}
290
291	return
292}
293
294// ListByServerPreparer prepares the ListByServer request.
295func (client FirewallRulesClient) ListByServerPreparer(ctx context.Context, resourceGroupName string, serverName string) (*http.Request, error) {
296	pathParameters := map[string]interface{}{
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", pathParameters),
311		autorest.WithQueryParameters(queryParameters))
312	return preparer.Prepare((&http.Request{}).WithContext(ctx))
313}
314
315// ListByServerSender sends the ListByServer request. The method will close the
316// http.Response Body if it receives an error.
317func (client FirewallRulesClient) ListByServerSender(req *http.Request) (*http.Response, error) {
318	return autorest.SendWithSender(client, req,
319		azure.DoRetryWithRegistration(client.Client))
320}
321
322// ListByServerResponder handles the response to the ListByServer request. The method always
323// closes the http.Response Body.
324func (client FirewallRulesClient) ListByServerResponder(resp *http.Response) (result FirewallRuleListResult, err error) {
325	err = autorest.Respond(
326		resp,
327		client.ByInspecting(),
328		azure.WithErrorUnlessStatusCode(http.StatusOK),
329		autorest.ByUnmarshallingJSON(&result),
330		autorest.ByClosing())
331	result.Response = autorest.Response{Response: resp}
332	return
333}
334