• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

.github/H30-Oct-2019-7753

documentation/H30-Oct-2019-9757

profiles/H30-Oct-2019-173,523142,877

services/H30-Oct-2019-4,999,5963,596,309

storage/H30-Oct-2019-43,55039,415

tools/H30-Oct-2019-10,6157,459

version/H30-Oct-2019-222

.gitattributesH A D30-Oct-201985 32

.gitignoreH A D30-Oct-2019348 3527

CHANGELOG.mdH A D30-Oct-201928 KiB1,110879

CODEOWNERSH A D30-Oct-2019472 1312

CONTRIBUTING.mdH A D30-Oct-2019895 1811

Gopkg.lockH A D30-Oct-20194.9 KiB172154

Gopkg.tomlH A D30-Oct-20191.1 KiB5747

LICENSEH A D30-Oct-201911.1 KiB203169

NOTICEH A D30-Oct-2019157 64

README.mdH A D30-Oct-201923 KiB556412

azure-pipelines.ymlH A D30-Oct-20192.6 KiB7268

doc.goH A D30-Oct-2019965 271

findTestedPackages.shH A D30-Oct-201958 11

rungas.shH A D30-Oct-2019588 1513

swagger_to_sdk_config.jsonH A D30-Oct-2019842 3130

README.md

1# Azure SDK for Go
2
3[![godoc](https://godoc.org/github.com/Azure/azure-sdk-for-go?status.svg)](https://godoc.org/github.com/Azure/azure-sdk-for-go)
4
5[![Build Status](https://travis-ci.org/Azure/azure-sdk-for-go.svg?branch=master)](https://travis-ci.org/Azure/azure-sdk-for-go)
6
7[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/Azure.azure-sdk-for-go?branchName=latest)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=640&branchName=latest)
8
9[![Go Report Card](https://goreportcard.com/badge/github.com/Azure/azure-sdk-for-go)](https://goreportcard.com/report/github.com/Azure/azure-sdk-for-go)
10
11azure-sdk-for-go provides Go packages for managing and using Azure services.
12It officially supports the last two major releases of Go.  Older versions of
13Go will be kept running in CI until they no longer work due to changes in any
14of the SDK's external dependencies.  The CHANGELOG will be updated when a
15version of Go is removed from CI.
16
17To be notified about updates and changes, subscribe to the [Azure update
18feed](https://azure.microsoft.com/updates/).
19
20Users may prefer to jump right in to our samples repo at
21[github.com/Azure-Samples/azure-sdk-for-go-samples][samples_repo].
22
23Questions and feedback? Chat with us in the **[#Azure SDK
24channel](https://gophers.slack.com/messages/CA7HK8EEP)** on the [Gophers
25Slack](https://gophers.slack.com/). Sign up
26[here](https://invite.slack.golangbridge.org) first if necessary.
27
28
29## Package Updates
30
31Most packages in the SDK are generated from [Azure API specs][azure_rest_specs]
32using [Azure/autorest.go][] and [Azure/autorest][]. These generated packages
33depend on the HTTP client implemented at [Azure/go-autorest][].
34
35[azure_rest_specs]: https://github.com/Azure/azure-rest-api-specs
36[azure/autorest]: https://github.com/Azure/autorest
37[azure/autorest.go]: https://github.com/Azure/autorest.go
38[azure/go-autorest]: https://github.com/Azure/go-autorest
39
40The SDK codebase adheres to [semantic versioning](https://semver.org) and thus
41avoids breaking changes other than at major (x.0.0) releases. Because Azure's
42APIs are updated frequently, we release a **new major version at the end of
43each month** with a full changelog. For more details and background see [SDK Update
44Practices](https://github.com/Azure/azure-sdk-for-go/wiki/SDK-Update-Practices).
45
46To more reliably manage dependencies like the Azure SDK in your applications we
47recommend [golang/dep](https://github.com/golang/dep).
48
49Packages that are still in public preview can be found under the ./services/preview
50directory. Please be aware that since these packages are in preview they are subject
51to change, including breaking changes outside of a major semver bump.
52
53## Other Azure Go Packages
54
55Azure provides several other packages for using services from Go, listed below.
56If a package you need isn't available please open an issue and let us know.
57
58| Service              | Import Path/Repo                                                                                   |
59| -------------------- | -------------------------------------------------------------------------------------------------- |
60| Storage - Blobs      | [github.com/Azure/azure-storage-blob-go](https://github.com/Azure/azure-storage-blob-go)           |
61| Storage - Files      | [github.com/Azure/azure-storage-file-go](https://github.com/Azure/azure-storage-file-go)           |
62| Storage - Queues     | [github.com/Azure/azure-storage-queue-go](https://github.com/Azure/azure-storage-queue-go)         |
63| Service Bus          | [github.com/Azure/azure-service-bus-go](https://github.com/Azure/azure-service-bus-go)             |
64| Event Hubs           | [github.com/Azure/azure-event-hubs-go](https://github.com/Azure/azure-event-hubs-go)               |
65| Application Insights | [github.com/Microsoft/ApplicationInsights-go](https://github.com/Microsoft/ApplicationInsights-go) |
66
67# Install and Use:
68
69## Install
70
71```sh
72$ go get -u github.com/Azure/azure-sdk-for-go/...
73```
74
75or if you use dep, within your repo run:
76
77```sh
78$ dep ensure -add github.com/Azure/azure-sdk-for-go
79```
80
81If you need to install Go, follow [the official instructions](https://golang.org/dl/).
82
83## Use
84
85For many more scenarios and examples see
86[Azure-Samples/azure-sdk-for-go-samples][samples_repo].
87
88Apply the following general steps to use packages in this repo. For more on
89authentication and the `Authorizer` interface see [the next
90section](#authentication).
91
921. Import a package from the [services][services_dir] directory.
932. Create and authenticate a client with a `New*Client` func, e.g.
94   `c := compute.NewVirtualMachinesClient(...)`.
953. Invoke API methods using the client, e.g.
96   `res, err := c.CreateOrUpdate(...)`.
974. Handle responses and errors.
98
99[services_dir]: https://github.com/Azure/azure-sdk-for-go/tree/master/services
100
101For example, to create a new virtual network (substitute your own values for
102strings in angle brackets):
103
104```go
105package main
106
107import (
108	"context"
109	"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
110
111	"github.com/Azure/go-autorest/autorest/azure/auth"
112	"github.com/Azure/go-autorest/autorest/to"
113)
114
115func main() {
116	// create a VirtualNetworks client
117	vnetClient := network.NewVirtualNetworksClient("<subscriptionID>")
118
119	// create an authorizer from env vars or Azure Managed Service Idenity
120	authorizer, err := auth.NewAuthorizerFromEnvironment()
121	if err == nil {
122		vnetClient.Authorizer = authorizer
123	}
124
125	// call the VirtualNetworks CreateOrUpdate API
126	vnetClient.CreateOrUpdate(context.Background(),
127		"<resourceGroupName>",
128		"<vnetName>",
129		network.VirtualNetwork{
130			Location: to.StringPtr("<azureRegion>"),
131			VirtualNetworkPropertiesFormat: &network.VirtualNetworkPropertiesFormat{
132				AddressSpace: &network.AddressSpace{
133					AddressPrefixes: &[]string{"10.0.0.0/8"},
134				},
135				Subnets: &[]network.Subnet{
136					{
137						Name: to.StringPtr("<subnet1Name>"),
138						SubnetPropertiesFormat: &network.SubnetPropertiesFormat{
139							AddressPrefix: to.StringPtr("10.0.0.0/16"),
140						},
141					},
142					{
143						Name: to.StringPtr("<subnet2Name>"),
144						SubnetPropertiesFormat: &network.SubnetPropertiesFormat{
145							AddressPrefix: to.StringPtr("10.1.0.0/16"),
146						},
147					},
148				},
149			},
150		})
151}
152```
153
154## Authentication
155
156Typical SDK operations must be authenticated and authorized. The _Authorizer_
157interface allows use of any auth style in requests, such as inserting an OAuth2
158Authorization header and bearer token received from Azure AD.
159
160The SDK itself provides a simple way to get an authorizer which first checks
161for OAuth client credentials in environment variables and then falls back to
162Azure's [Managed Service Identity]() when available, e.g. when on an Azure
163VM. The following snippet from [the previous section](#use) demonstrates
164this helper.
165
166```go
167import github.com/Azure/go-autorest/autorest/azure/auth
168
169// create a VirtualNetworks client
170vnetClient := network.NewVirtualNetworksClient("<subscriptionID>")
171
172// create an authorizer from env vars or Azure Managed Service Idenity
173authorizer, err := auth.NewAuthorizerFromEnvironment()
174if err == nil {
175    vnetClient.Authorizer = authorizer
176}
177
178// call the VirtualNetworks CreateOrUpdate API
179vnetClient.CreateOrUpdate(context.Background(),
180// ...
181```
182
183The following environment variables help determine authentication configuration:
184
185- `AZURE_ENVIRONMENT`: Specifies the Azure Environment to use. If not set, it
186  defaults to `AzurePublicCloud`. Not applicable to authentication with Managed
187  Service Identity (MSI).
188- `AZURE_AD_RESOURCE`: Specifies the AAD resource ID to use. If not set, it
189  defaults to `ResourceManagerEndpoint` for operations with Azure Resource
190  Manager. You can also choose an alternate resource programatically with
191  `auth.NewAuthorizerFromEnvironmentWithResource(resource string)`.
192
193### More Authentication Details
194
195The previous is the first and most recommended of several authentication
196options offered by the SDK because it allows seamless use of both service
197principals and [Azure Managed Service Identity][]. Other options are listed
198below.
199
200> Note: If you need to create a new service principal, run `az ad sp create-for-rbac -n "<app_name>"` in the
201> [azure-cli](https://github.com/Azure/azure-cli). See [these
202> docs](https://docs.microsoft.com/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest)
203> for more info. Copy the new principal's ID, secret, and tenant ID for use in
204> your app, or consider the `--sdk-auth` parameter for serialized output.
205
206[azure managed service identity]: https://docs.microsoft.com/en-us/azure/active-directory/msi-overview
207
208- The `auth.NewAuthorizerFromEnvironment()` described above creates an authorizer
209  from the first available of the following configuration:
210
211      1. **Client Credentials**: Azure AD Application ID and Secret.
212
213          - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
214          - `AZURE_CLIENT_ID`: Specifies the app client ID to use.
215          - `AZURE_CLIENT_SECRET`: Specifies the app secret to use.
216
217      2. **Client Certificate**: Azure AD Application ID and X.509 Certificate.
218
219          - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
220          - `AZURE_CLIENT_ID`: Specifies the app client ID to use.
221          - `AZURE_CERTIFICATE_PATH`: Specifies the certificate Path to use.
222          - `AZURE_CERTIFICATE_PASSWORD`: Specifies the certificate password to use.
223
224      3. **Resource Owner Password**: Azure AD User and Password. This grant type is *not
225         recommended*, use device login instead if you need interactive login.
226
227          - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
228          - `AZURE_CLIENT_ID`: Specifies the app client ID to use.
229          - `AZURE_USERNAME`: Specifies the username to use.
230          - `AZURE_PASSWORD`: Specifies the password to use.
231
232      4. **Azure Managed Service Identity**: Delegate credential management to the
233         platform. Requires that code is running in Azure, e.g. on a VM. All
234         configuration is handled by Azure. See [Azure Managed Service
235         Identity](https://docs.microsoft.com/en-us/azure/active-directory/msi-overview)
236         for more details.
237
238- The `auth.NewAuthorizerFromFile()` method creates an authorizer using
239  credentials from an auth file created by the [Azure CLI][]. Follow these
240  steps to utilize:
241
242  1. Create a service principal and output an auth file using `az ad sp create-for-rbac --sdk-auth > client_credentials.json`.
243  2. Set environment variable `AZURE_AUTH_LOCATION` to the path of the saved
244     output file.
245  3. Use the authorizer returned by `auth.NewAuthorizerFromFile()` in your
246     client as described above.
247
248- The `auth.NewAuthorizerFromCLI()` method creates an authorizer which
249  uses [Azure CLI][] to obtain its credentials. To use this method follow
250  these steps:
251
252  1. Install [Azure CLI v2.0.12](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) or later. Upgrade earlier versions.
253  2. Use `az login` to sign in to Azure.
254
255  If you receive an error, use `az account get-access-token` to verify access.
256
257  If Azure CLI is not installed to the default directory, you may receive an error
258  reporting that `az` cannot be found.
259  Use the `AzureCLIPath` environment variable to define the Azure CLI installation folder.
260
261  If you are signed in to Azure CLI using multiple accounts or your account has
262  access to multiple subscriptions, you need to specify the specific subscription
263  to be used. To do so, use:
264
265  ```
266  az account set --subscription <subscription-id>
267  ```
268
269  To verify the current account settings, use:
270
271  ```
272  az account list
273  ```
274
275[azure cli]: https://github.com/Azure/azure-cli
276
277- Finally, you can use OAuth's [Device Flow][] by calling
278  `auth.NewDeviceFlowConfig()` and extracting the Authorizer as follows:
279
280  ```go
281  config := auth.NewDeviceFlowConfig(clientID, tenantID)
282  a, err = config.Authorizer()
283  ```
284
285[device flow]: https://oauth.net/2/device-flow/
286
287# Versioning
288
289azure-sdk-for-go provides at least a basic Go binding for every Azure API. To
290provide maximum flexibility to users, the SDK even includes previous versions of
291Azure APIs which are still in use. This enables us to support users of the
292most updated Azure datacenters, regional datacenters with earlier APIs, and
293even on-premises installations of Azure Stack.
294
295**SDK versions** apply globally and are tracked by git
296[tags](https://github.com/Azure/azure-sdk-for-go/tags). These are in x.y.z form
297and generally adhere to [semantic versioning](https://semver.org) specifications.
298
299**Service API versions** are generally represented by a date string and are
300tracked by offering separate packages for each version. For example, to choose the
301latest API versions for Compute and Network, use the following imports:
302
303```go
304import (
305    "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute"
306    "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
307)
308```
309
310Occasionally service-side changes require major changes to existing versions.
311These cases are noted in the changelog, and for this reason `Service API versions`
312cannot be used alone to ensure backwards compatibility.
313
314All available services and versions are listed under the `services/` path in
315this repo and in [GoDoc][services_godoc]. Run `find ./services -type d -mindepth 3` to list all available service packages.
316
317[services_godoc]: https://godoc.org/github.com/Azure/azure-sdk-for-go/services
318
319### Profiles
320
321Azure **API profiles** specify subsets of Azure APIs and versions. Profiles can provide:
322
323- **stability** for your application by locking to specific API versions; and/or
324- **compatibility** for your application with Azure Stack and regional Azure datacenters.
325
326In the Go SDK, profiles are available under the `profiles/` path and their
327component API versions are aliases to the true service package under
328`services/`. You can use them as follows:
329
330```go
331import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/compute/mgmt/compute"
332import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/network/mgmt/network"
333import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/storage/mgmt/storage"
334```
335
336The following profiles are available for hybrid Azure and Azure Stack environments.
337- 2017-03-09
338- 2018-03-01
339
340In addition to versioned profiles, we also provide two special profiles
341`latest` and `preview`. The `latest` profile contains the latest API version
342of each service, excluding any preview versions and/or content.  The `preview`
343profile is similar to the `latest` profile but includes preview API versions.
344
345The `latest` and `preview` profiles can help you stay up to date with API
346updates as you build applications. Since they are by definition not stable,
347however, they **should not** be used in production apps. Instead, choose the
348latest specific API version (or an older one if necessary) from the `services/`
349path.
350
351As an example, to automatically use the most recent Compute APIs, use one of
352the following imports:
353
354```go
355import "github.com/Azure/azure-sdk-for-go/profiles/latest/compute/mgmt/compute"
356import "github.com/Azure/azure-sdk-for-go/profiles/preview/compute/mgmt/compute"
357```
358
359### Avoiding Breaking Changes
360
361To avoid breaking changes, when specifying imports you should specify a `Service API Version` or `Profile`, as well as lock (using [dep](https://github.com/golang/dep) and soon with [Go Modules](https://github.com/golang/go/wiki/Modules)) to a specific SDK version.
362
363For example, in your source code imports, use a `Service API Version` (`2017-12-01`):
364
365```go
366import "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute"
367```
368
369or `Profile` version (`2017-03-09`):
370
371```go
372import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/compute/mgmt/compute"
373```
374
375As well as, for dep, a `Gopkg.toml` file with:
376
377```toml
378[[constraint]]
379  name = "github.com/Azure/azure-sdk-for-go"
380  version = "21.0.0"
381```
382
383Combined, these techniques will ensure that breaking changes should not occur. If you are extra sensitive to changes, adding an additional [version pin](https://golang.github.io/dep/docs/Gopkg.toml.html#version-rules) in your SDK Version should satisfy your needs:
384
385```toml
386[[constraint]]
387  name = "github.com/Azure/azure-sdk-for-go"
388  version = "=21.3.0"
389```
390
391## Inspecting and Debugging
392
393### Built-in Basic Request/Response Logging
394
395Starting with `go-autorest v10.15.0` you can enable basic logging of requests and responses through setting environment variables.
396Setting `AZURE_GO_SDK_LOG_LEVEL` to `INFO` will log request/response without their bodies. To include the bodies set the log level to `DEBUG`.
397
398By default the logger writes to strerr, however it can also write to stdout or a file
399if specified in `AZURE_GO_SDK_LOG_FILE`. Note that if the specified file already exists it will be truncated.
400
401**IMPORTANT:** by default the logger will redact the Authorization and Ocp-Apim-Subscription-Key
402headers. Any other secrets will _not_ be redacted.
403
404### Writing Custom Request/Response Inspectors
405
406All clients implement some handy hooks to help inspect the underlying requests being made to Azure.
407
408- `RequestInspector`: View and manipulate the go `http.Request` before it's sent
409- `ResponseInspector`: View the `http.Response` received
410
411Here is an example of how these can be used with `net/http/httputil` to see requests and responses.
412
413```go
414vnetClient := network.NewVirtualNetworksClient("<subscriptionID>")
415vnetClient.RequestInspector = LogRequest()
416vnetClient.ResponseInspector = LogResponse()
417
418...
419
420func LogRequest() autorest.PrepareDecorator {
421	return func(p autorest.Preparer) autorest.Preparer {
422		return autorest.PreparerFunc(func(r *http.Request) (*http.Request, error) {
423			r, err := p.Prepare(r)
424			if err != nil {
425				log.Println(err)
426			}
427			dump, _ := httputil.DumpRequestOut(r, true)
428			log.Println(string(dump))
429			return r, err
430		})
431	}
432}
433
434func LogResponse() autorest.RespondDecorator {
435	return func(p autorest.Responder) autorest.Responder {
436		return autorest.ResponderFunc(func(r *http.Response) error {
437			err := p.Respond(r)
438			if err != nil {
439				log.Println(err)
440			}
441			dump, _ := httputil.DumpResponse(r, true)
442			log.Println(string(dump))
443			return err
444		})
445	}
446}
447```
448
449## Tracing and Metrics
450
451All packages and the runtime are instrumented using [OpenCensus](https://opencensus.io/).
452
453### Enable
454
455By default, no tracing provider will be compiled into your program, and the legacy approach of setting `AZURE_SDK_TRACING_ENABLED` environment variable will no longer take effect.
456
457To enable tracing, you must now add the following include to your source file.
458
459``` go
460    include _ "github.com/Azure/go-autorest/tracing/opencensus"
461```
462
463To hook up a tracer simply call `tracing.Register()` passing in a type that satisfies the `tracing.Tracer` interface.
464
465**Note**: In future major releases of the SDK, tracing may become enabled by default.
466
467### Usage
468
469Once enabled, all SDK calls will emit traces and metrics and the traces will correlate the SDK calls with the raw http calls made to Azure API's. To consume those traces, if are not doing it yet, you need to register an exporter of your choice such as [Azure App Insights](https://docs.microsoft.com/en-us/azure/application-insights/opencensus-local-forwarder) or [Zipkin](https://opencensus.io/quickstart/go/tracing/#exporting-traces).
470
471To correlate the SDK calls between them and with the rest of your code, pass in a context that has a span initiated using the [opencensus-go library](https://github.com/census-instrumentation/opencensus-go) using the `trace.Startspan(ctx context.Context, name string, o ...StartOption)` function. Here is an example:
472
473```go
474func doAzureCalls() {
475    // The resulting context will be initialized with a root span as the context passed to
476    // trace.StartSpan() has no existing span.
477    ctx, span := trace.StartSpan(context.Background(),"doAzureCalls", trace.WithSampler(trace.AlwaysSample()))
478    defer span.End()
479
480    // The traces from the SDK calls will be correlated under the span inside the context that is passed in.
481    zone, _ := zonesClient.CreateOrUpdate(ctx, rg, zoneName, dns.Zone{Location: to.StringPtr("global")}, "", "")
482    zone, _ = zonesClient.Get(ctx, rg, *zone.Name)
483    for i := 0; i < rrCount; i++ {
484        rr, _ := recordsClient.CreateOrUpdate(ctx, rg, zoneName, fmt.Sprintf("rr%d", i), dns.CNAME, rdSet{
485            RecordSetProperties: &dns.RecordSetProperties{
486                TTL: to.Int64Ptr(3600),
487                CnameRecord: &dns.CnameRecord{
488                    Cname: to.StringPtr("vladdbCname"),
489                },
490            },
491        },
492            "",
493            "",
494        )
495    }
496}
497```
498
499## Request Retry Policy
500
501The SDK provides a baked in retry policy for failed requests with default values that can be configured.
502Each [client](https://godoc.org/github.com/Azure/go-autorest/autorest#Client) object contains the follow fields.
503- `RetryAttempts` - the number of times to retry a failed request
504- `RetryDuration` - the duration to wait between retries
505
506For async operations the follow values are also used.
507- `PollingDelay` - the duration to wait between polling requests
508- `PollingDuration` - the total time to poll an async request before timing out
509
510Please see the [documentation](https://godoc.org/github.com/Azure/go-autorest/autorest#pkg-constants) for the default values used.
511
512Changing one or more values will affect all subsequet API calls.
513
514The default policy is to call `autorest.DoRetryForStatusCodes()` from an API's `Sender` method.  Example:
515```go
516func (client OperationsClient) ListSender(req *http.Request) (*http.Response, error) {
517	sd := autorest.GetSendDecorators(req.Context(), autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
518	return autorest.SendWithSender(client, req, sd...)
519}
520```
521
522Details on how `autorest.DoRetryforStatusCodes()` works can be found in the [documentation](https://godoc.org/github.com/Azure/go-autorest/autorest#DoRetryForStatusCodes).
523
524The slice of `SendDecorators` used in a `Sender` method can be customized per API call by smuggling them in the context.  Here's an example.
525
526```go
527ctx := context.Background()
528autorest.WithSendDecorators(ctx, []autorest.SendDecorator{
529	autorest.DoRetryForStatusCodesWithCap(client.RetryAttempts,
530		client.RetryDuration, time.Duration(0),
531        autorest.StatusCodesForRetry...)})
532client.List(ctx)
533```
534
535This will replace the default slice of `SendDecorators` with the provided slice.
536
537The `PollingDelay` and `PollingDuration` values are used exclusively by [WaitForCompletionRef()](https://godoc.org/github.com/Azure/go-autorest/autorest/azure#Future.WaitForCompletionRef) when blocking on an async call until it completes.
538
539# Resources
540
541- SDK docs are at [godoc.org](https://godoc.org/github.com/Azure/azure-sdk-for-go/).
542- SDK samples are at [Azure-Samples/azure-sdk-for-go-samples](https://github.com/Azure-Samples/azure-sdk-for-go-samples).
543- SDK notifications are published via the [Azure update feed](https://azure.microsoft.com/updates/).
544- Azure API docs are at [docs.microsoft.com/rest/api](https://docs.microsoft.com/rest/api/).
545- General Azure docs are at [docs.microsoft.com/azure](https://docs.microsoft.com/azure).
546
547## License
548
549Apache 2.0, see [LICENSE](./LICENSE).
550
551## Contribute
552
553See [CONTRIBUTING.md](./CONTRIBUTING.md).
554
555[samples_repo]: https://github.com/Azure-Samples/azure-sdk-for-go-samples
556