From 25ef017b885579d30e896ebcc466b24160ea6d51 Mon Sep 17 00:00:00 2001 From: anx-release Date: Mon, 25 Nov 2024 15:18:10 +0000 Subject: [PATCH] deploy: d39253e6bd9d7d7f4bdca045a5877bca31e6d18a --- .nojekyll | 0 CNAME | 1 + chroma/style.css | 87 +++++ e5e/README.md/index.html | 136 +++++++ e5e/README.md@v1.2.0/index.html | 123 ++++++ e5e/README.md@v1.2.1/index.html | 136 +++++++ e5e/index.html | 136 +++++++ e5e/v2/README.md/index.html | 119 ++++++ .../SIANXSVC-1214-replace-codecov/index.html | 119 ++++++ e5e/v2/README.md@main/index.html | 119 ++++++ e5e/v2/README.md@v2.0.0/index.html | 119 ++++++ e5e/v2/README.md@v2.0.1/index.html | 119 ++++++ e5e/v2/README.md@v2.1.0/index.html | 119 ++++++ e5e/v2/index.html | 119 ++++++ go-anxcloud/README.md/index.html | 367 ++++++++++++++++++ .../make-vm-nics-updatable/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@SYSENG-1741/index.html | 367 ++++++++++++++++++ .../index.html | 367 ++++++++++++++++++ .../virtualmachine/index.html | 367 ++++++++++++++++++ .../README.md@decode-prefix-vlans/index.html | 367 ++++++++++++++++++ .../onsi/ginkgo/v2-2.22.0/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@lbaasv2-cs/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@main/index.html | 367 ++++++++++++++++++ .../README.md@mgmt-bindings/index.html | 367 ++++++++++++++++++ .../cancel-object-channel/index.html | 307 +++++++++++++++ .../ipam-generic-client/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.1.0/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.2.0/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.0/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.1/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.10/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.11/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.12/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.13/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.14/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.15/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.16/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.17/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.18/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.19/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.2/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.20/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.21/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.22/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.23/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.24/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.25/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.26/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.27/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.28/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.3/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.4/index.html | 242 ++++++++++++ go-anxcloud/README.md@v0.3.5/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.6/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.7/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.8/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.3.9/index.html | 306 +++++++++++++++ go-anxcloud/README.md@v0.4.0/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.1/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.2/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.3/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.4/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.5/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.4.6/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.5.0/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.5.1/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.5.2/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.5.3/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.6.0/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.6.1/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.6.2/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.6.3/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.6.4/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.0/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.1/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.2/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.3/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.4/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.5/index.html | 367 ++++++++++++++++++ go-anxcloud/README.md@v0.7.6/index.html | 367 ++++++++++++++++++ go-anxcloud/index.html | 367 ++++++++++++++++++ go-cloudlog/README.md/index.html | 111 ++++++ go-cloudlog/README.md@v2.0.0/index.html | 111 ++++++ go-cloudlog/index.html | 111 ++++++ go-cloudlog/v2/README.md/index.html | 108 ++++++ go-cloudlog/v2/README.md@master/index.html | 107 +++++ go-cloudlog/v2/README.md@v2.0.1/index.html | 108 ++++++ go-cloudlog/v2/README.md@v2.0.2/index.html | 108 ++++++ go-cloudlog/v2/index.html | 108 ++++++ index.html | 65 ++++ static/Anexia_Logo_RGB.svg | 1 + static/fonts/fira-sans-v11-latin-700.eot | Bin 0 -> 28346 bytes static/fonts/fira-sans-v11-latin-700.svg | 328 ++++++++++++++++ static/fonts/fira-sans-v11-latin-700.ttf | Bin 0 -> 64312 bytes static/fonts/fira-sans-v11-latin-700.woff | Bin 0 -> 29368 bytes static/fonts/fira-sans-v11-latin-700.woff2 | Bin 0 -> 23868 bytes static/fonts/fira-sans-v11-latin-italic.eot | Bin 0 -> 28226 bytes static/fonts/fira-sans-v11-latin-italic.svg | 340 ++++++++++++++++ static/fonts/fira-sans-v11-latin-italic.ttf | Bin 0 -> 60592 bytes static/fonts/fira-sans-v11-latin-italic.woff | Bin 0 -> 29176 bytes static/fonts/fira-sans-v11-latin-italic.woff2 | Bin 0 -> 23720 bytes static/fonts/fira-sans-v11-latin-regular.eot | Bin 0 -> 27135 bytes static/fonts/fira-sans-v11-latin-regular.svg | 330 ++++++++++++++++ static/fonts/fira-sans-v11-latin-regular.ttf | Bin 0 -> 59324 bytes static/fonts/fira-sans-v11-latin-regular.woff | Bin 0 -> 28024 bytes .../fonts/fira-sans-v11-latin-regular.woff2 | Bin 0 -> 22748 bytes static/style.css | 353 +++++++++++++++++ 107 files changed, 25931 insertions(+) create mode 100644 .nojekyll create mode 100644 CNAME create mode 100644 chroma/style.css create mode 100644 e5e/README.md/index.html create mode 100644 e5e/README.md@v1.2.0/index.html create mode 100644 e5e/README.md@v1.2.1/index.html create mode 100644 e5e/index.html create mode 100644 e5e/v2/README.md/index.html create mode 100644 e5e/v2/README.md@chore/SIANXSVC-1214-replace-codecov/index.html create mode 100644 e5e/v2/README.md@main/index.html create mode 100644 e5e/v2/README.md@v2.0.0/index.html create mode 100644 e5e/v2/README.md@v2.0.1/index.html create mode 100644 e5e/v2/README.md@v2.1.0/index.html create mode 100644 e5e/v2/index.html create mode 100644 go-anxcloud/README.md/index.html create mode 100644 go-anxcloud/README.md@SYSENG-1670/make-vm-nics-updatable/index.html create mode 100644 go-anxcloud/README.md@SYSENG-1741/index.html create mode 100644 go-anxcloud/README.md@SYSENG-1822-fix-ResourceWithTag/index.html create mode 100644 go-anxcloud/README.md@SYSENG-679/virtualmachine/index.html create mode 100644 go-anxcloud/README.md@decode-prefix-vlans/index.html create mode 100644 go-anxcloud/README.md@dependabot/go_modules/github.com/onsi/ginkgo/v2-2.22.0/index.html create mode 100644 go-anxcloud/README.md@lbaasv2-cs/index.html create mode 100644 go-anxcloud/README.md@main/index.html create mode 100644 go-anxcloud/README.md@mgmt-bindings/index.html create mode 100644 go-anxcloud/README.md@syseng-728/cancel-object-channel/index.html create mode 100644 go-anxcloud/README.md@syseng-923/ipam-generic-client/index.html create mode 100644 go-anxcloud/README.md@v0.1.0/index.html create mode 100644 go-anxcloud/README.md@v0.2.0/index.html create mode 100644 go-anxcloud/README.md@v0.3.0/index.html create mode 100644 go-anxcloud/README.md@v0.3.1/index.html create mode 100644 go-anxcloud/README.md@v0.3.10/index.html create mode 100644 go-anxcloud/README.md@v0.3.11/index.html create mode 100644 go-anxcloud/README.md@v0.3.12/index.html create mode 100644 go-anxcloud/README.md@v0.3.13/index.html create mode 100644 go-anxcloud/README.md@v0.3.14/index.html create mode 100644 go-anxcloud/README.md@v0.3.15/index.html create mode 100644 go-anxcloud/README.md@v0.3.16/index.html create mode 100644 go-anxcloud/README.md@v0.3.17/index.html create mode 100644 go-anxcloud/README.md@v0.3.18/index.html create mode 100644 go-anxcloud/README.md@v0.3.19/index.html create mode 100644 go-anxcloud/README.md@v0.3.2/index.html create mode 100644 go-anxcloud/README.md@v0.3.20/index.html create mode 100644 go-anxcloud/README.md@v0.3.21/index.html create mode 100644 go-anxcloud/README.md@v0.3.22/index.html create mode 100644 go-anxcloud/README.md@v0.3.23/index.html create mode 100644 go-anxcloud/README.md@v0.3.24/index.html create mode 100644 go-anxcloud/README.md@v0.3.25/index.html create mode 100644 go-anxcloud/README.md@v0.3.26/index.html create mode 100644 go-anxcloud/README.md@v0.3.27/index.html create mode 100644 go-anxcloud/README.md@v0.3.28/index.html create mode 100644 go-anxcloud/README.md@v0.3.3/index.html create mode 100644 go-anxcloud/README.md@v0.3.4/index.html create mode 100644 go-anxcloud/README.md@v0.3.5/index.html create mode 100644 go-anxcloud/README.md@v0.3.6/index.html create mode 100644 go-anxcloud/README.md@v0.3.7/index.html create mode 100644 go-anxcloud/README.md@v0.3.8/index.html create mode 100644 go-anxcloud/README.md@v0.3.9/index.html create mode 100644 go-anxcloud/README.md@v0.4.0/index.html create mode 100644 go-anxcloud/README.md@v0.4.1/index.html create mode 100644 go-anxcloud/README.md@v0.4.2/index.html create mode 100644 go-anxcloud/README.md@v0.4.3/index.html create mode 100644 go-anxcloud/README.md@v0.4.4/index.html create mode 100644 go-anxcloud/README.md@v0.4.5/index.html create mode 100644 go-anxcloud/README.md@v0.4.6/index.html create mode 100644 go-anxcloud/README.md@v0.5.0/index.html create mode 100644 go-anxcloud/README.md@v0.5.1/index.html create mode 100644 go-anxcloud/README.md@v0.5.2/index.html create mode 100644 go-anxcloud/README.md@v0.5.3/index.html create mode 100644 go-anxcloud/README.md@v0.6.0/index.html create mode 100644 go-anxcloud/README.md@v0.6.1/index.html create mode 100644 go-anxcloud/README.md@v0.6.2/index.html create mode 100644 go-anxcloud/README.md@v0.6.3/index.html create mode 100644 go-anxcloud/README.md@v0.6.4/index.html create mode 100644 go-anxcloud/README.md@v0.7.0/index.html create mode 100644 go-anxcloud/README.md@v0.7.1/index.html create mode 100644 go-anxcloud/README.md@v0.7.2/index.html create mode 100644 go-anxcloud/README.md@v0.7.3/index.html create mode 100644 go-anxcloud/README.md@v0.7.4/index.html create mode 100644 go-anxcloud/README.md@v0.7.5/index.html create mode 100644 go-anxcloud/README.md@v0.7.6/index.html create mode 100644 go-anxcloud/index.html create mode 100644 go-cloudlog/README.md/index.html create mode 100644 go-cloudlog/README.md@v2.0.0/index.html create mode 100644 go-cloudlog/index.html create mode 100644 go-cloudlog/v2/README.md/index.html create mode 100644 go-cloudlog/v2/README.md@master/index.html create mode 100644 go-cloudlog/v2/README.md@v2.0.1/index.html create mode 100644 go-cloudlog/v2/README.md@v2.0.2/index.html create mode 100644 go-cloudlog/v2/index.html create mode 100644 index.html create mode 100644 static/Anexia_Logo_RGB.svg create mode 100644 static/fonts/fira-sans-v11-latin-700.eot create mode 100644 static/fonts/fira-sans-v11-latin-700.svg create mode 100644 static/fonts/fira-sans-v11-latin-700.ttf create mode 100644 static/fonts/fira-sans-v11-latin-700.woff create mode 100644 static/fonts/fira-sans-v11-latin-700.woff2 create mode 100644 static/fonts/fira-sans-v11-latin-italic.eot create mode 100644 static/fonts/fira-sans-v11-latin-italic.svg create mode 100644 static/fonts/fira-sans-v11-latin-italic.ttf create mode 100644 static/fonts/fira-sans-v11-latin-italic.woff create mode 100644 static/fonts/fira-sans-v11-latin-italic.woff2 create mode 100644 static/fonts/fira-sans-v11-latin-regular.eot create mode 100644 static/fonts/fira-sans-v11-latin-regular.svg create mode 100644 static/fonts/fira-sans-v11-latin-regular.ttf create mode 100644 static/fonts/fira-sans-v11-latin-regular.woff create mode 100644 static/fonts/fira-sans-v11-latin-regular.woff2 create mode 100644 static/style.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..4307d5835c --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +go.anx.io diff --git a/chroma/style.css b/chroma/style.css new file mode 100644 index 0000000000..b275a7e4f6 --- /dev/null +++ b/chroma/style.css @@ -0,0 +1,87 @@ +/* Background */ .bg { ; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4 } +/* PreWrapper */ .chroma { ; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; } +/* LineNumbers targeted by URL anchor */ .chroma .ln:target { background-color: #e5e5e5 } +/* LineNumbersTable targeted by URL anchor */ .chroma .lnt:target { background-color: #e5e5e5 } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { } +/* CodeLine */ .chroma .cl { } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #e5e5e5 } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #008000; font-weight: bold } +/* KeywordConstant */ .chroma .kc { color: #008000; font-weight: bold } +/* KeywordDeclaration */ .chroma .kd { color: #008000; font-weight: bold } +/* KeywordNamespace */ .chroma .kn { color: #008000; font-weight: bold } +/* KeywordPseudo */ .chroma .kp { color: #008000 } +/* KeywordReserved */ .chroma .kr { color: #008000; font-weight: bold } +/* KeywordType */ .chroma .kt { color: #b00040 } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #7d9029 } +/* NameBuiltin */ .chroma .nb { color: #008000 } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { color: #0000ff; font-weight: bold } +/* NameConstant */ .chroma .no { color: #880000 } +/* NameDecorator */ .chroma .nd { color: #aa22ff } +/* NameEntity */ .chroma .ni { color: #999999; font-weight: bold } +/* NameException */ .chroma .ne { color: #d2413a; font-weight: bold } +/* NameFunction */ .chroma .nf { color: #0000ff } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { color: #a0a000 } +/* NameNamespace */ .chroma .nn { color: #0000ff; font-weight: bold } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { color: #008000; font-weight: bold } +/* NameVariable */ .chroma .nv { color: #19177c } +/* NameVariableClass */ .chroma .vc { } +/* NameVariableGlobal */ .chroma .vg { } +/* NameVariableInstance */ .chroma .vi { } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #ba2121 } +/* LiteralStringAffix */ .chroma .sa { color: #ba2121 } +/* LiteralStringBacktick */ .chroma .sb { color: #ba2121 } +/* LiteralStringChar */ .chroma .sc { color: #ba2121 } +/* LiteralStringDelimiter */ .chroma .dl { color: #ba2121 } +/* LiteralStringDoc */ .chroma .sd { color: #ba2121; font-style: italic } +/* LiteralStringDouble */ .chroma .s2 { color: #ba2121 } +/* LiteralStringEscape */ .chroma .se { color: #bb6622; font-weight: bold } +/* LiteralStringHeredoc */ .chroma .sh { color: #ba2121 } +/* LiteralStringInterpol */ .chroma .si { color: #bb6688; font-weight: bold } +/* LiteralStringOther */ .chroma .sx { color: #008000 } +/* LiteralStringRegex */ .chroma .sr { color: #bb6688 } +/* LiteralStringSingle */ .chroma .s1 { color: #ba2121 } +/* LiteralStringSymbol */ .chroma .ss { color: #19177c } +/* LiteralNumber */ .chroma .m { color: #666666 } +/* LiteralNumberBin */ .chroma .mb { color: #666666 } +/* LiteralNumberFloat */ .chroma .mf { color: #666666 } +/* LiteralNumberHex */ .chroma .mh { color: #666666 } +/* LiteralNumberInteger */ .chroma .mi { color: #666666 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #666666 } +/* LiteralNumberOct */ .chroma .mo { color: #666666 } +/* Operator */ .chroma .o { color: #666666 } +/* OperatorWord */ .chroma .ow { color: #aa22ff; font-weight: bold } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #408080; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #408080; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #408080; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #408080; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #408080; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #bc7a00 } +/* CommentPreprocFile */ .chroma .cpf { color: #bc7a00 } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #a00000 } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericError */ .chroma .gr { color: #ff0000 } +/* GenericHeading */ .chroma .gh { color: #000080; font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #00a000 } +/* GenericOutput */ .chroma .go { color: #888888 } +/* GenericPrompt */ .chroma .gp { color: #000080; font-weight: bold } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #800080; font-weight: bold } +/* GenericTraceback */ .chroma .gt { color: #0044dd } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { color: #bbbbbb } diff --git a/e5e/README.md/index.html b/e5e/README.md/index.html new file mode 100644 index 0000000000..82500e1bb1 --- /dev/null +++ b/e5e/README.md/index.html @@ -0,0 +1,136 @@ + + + + go.anx.io/e5e - go-e5e + + + + + + + + + +
+

go.anx.io/e5e


+ + + + The highest tagged major version is v2. + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"runtime"
+ 5	
+ 6	"go.anx.io/e5e"
+ 7)
+ 8
+ 9type SumEventData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14type SumEvent struct {
+15	e5e.Event
+16	Data SumEventData `json:"data,omitempty"`
+17}
+18
+19// Using a custom `e5e.Context` class is optional and only needed to access the `Data` attribute on the
+20// context. This attribute may be used to get the return value of an authorizer function, for example. If access
+21// to the `Data` attribute is not needed, the `e5e.Context` type can be used on the entrypoint directly.
+22
+23type SumContextData struct {
+24	AuthKey string `json:"auth_key"`
+25}
+26
+27type SumContext struct {
+28	e5e.Context
+29	Data SumContextData `json:"data,omitempty"`
+30}
+31
+32type entrypoints struct{}
+33
+34func (f *entrypoints) MyEntrypoint(event SumEvent, context SumContext) (e5e.Result, error) {
+35	return e5e.Result{
+36		Status: 200,
+37		ResponseHeaders: map[string]string{
+38			"x-custom-response-header": "This is a custom response header",
+39		},
+40		Data: map[string]interface{}{
+41			"sum": event.Data.A + event.Data.B,
+42			"version": runtime.Version(),
+43		},
+44	}, nil
+45}
+46
+47func main() {
+48	e5e.Start(&entrypoints{})
+49}
+

List of developers

+ + +
+ + + \ No newline at end of file diff --git a/e5e/README.md@v1.2.0/index.html b/e5e/README.md@v1.2.0/index.html new file mode 100644 index 0000000000..41b04b7283 --- /dev/null +++ b/e5e/README.md@v1.2.0/index.html @@ -0,0 +1,123 @@ + + + + go.anx.io/e5e - go-e5e + + + + + + + + + +
+

go.anx.io/e5e


+ + + + The highest tagged major version is v2. + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"runtime"
+ 5	
+ 6	"go.anx.io/e5e"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14type SumEvent struct {
+15	e5e.Event
+16	Data SumData `json:"data"`
+17}
+18
+19type entrypoints struct{}
+20
+21func (f *entrypoints) MyEntrypoint(event SumEvent, context e5e.Context) (e5e.Result, error) {
+22	return e5e.Result{
+23		Status: 200,
+24		ResponseHeaders: map[string]string{
+25			"x-custom-response-header": "This is a custom response header",
+26		},
+27		Data: map[string]interface{}{
+28			"sum": event.Data.A + event.Data.B,
+29			"version": runtime.Version(),
+30		},
+31	}, nil
+32}
+33
+34func main() {
+35	e5e.Start(&entrypoints{})
+36}
+

List of developers

+ + +
+ + + \ No newline at end of file diff --git a/e5e/README.md@v1.2.1/index.html b/e5e/README.md@v1.2.1/index.html new file mode 100644 index 0000000000..82500e1bb1 --- /dev/null +++ b/e5e/README.md@v1.2.1/index.html @@ -0,0 +1,136 @@ + + + + go.anx.io/e5e - go-e5e + + + + + + + + + +
+

go.anx.io/e5e


+ + + + The highest tagged major version is v2. + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"runtime"
+ 5	
+ 6	"go.anx.io/e5e"
+ 7)
+ 8
+ 9type SumEventData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14type SumEvent struct {
+15	e5e.Event
+16	Data SumEventData `json:"data,omitempty"`
+17}
+18
+19// Using a custom `e5e.Context` class is optional and only needed to access the `Data` attribute on the
+20// context. This attribute may be used to get the return value of an authorizer function, for example. If access
+21// to the `Data` attribute is not needed, the `e5e.Context` type can be used on the entrypoint directly.
+22
+23type SumContextData struct {
+24	AuthKey string `json:"auth_key"`
+25}
+26
+27type SumContext struct {
+28	e5e.Context
+29	Data SumContextData `json:"data,omitempty"`
+30}
+31
+32type entrypoints struct{}
+33
+34func (f *entrypoints) MyEntrypoint(event SumEvent, context SumContext) (e5e.Result, error) {
+35	return e5e.Result{
+36		Status: 200,
+37		ResponseHeaders: map[string]string{
+38			"x-custom-response-header": "This is a custom response header",
+39		},
+40		Data: map[string]interface{}{
+41			"sum": event.Data.A + event.Data.B,
+42			"version": runtime.Version(),
+43		},
+44	}, nil
+45}
+46
+47func main() {
+48	e5e.Start(&entrypoints{})
+49}
+

List of developers

+ + +
+ + + \ No newline at end of file diff --git a/e5e/index.html b/e5e/index.html new file mode 100644 index 0000000000..82500e1bb1 --- /dev/null +++ b/e5e/index.html @@ -0,0 +1,136 @@ + + + + go.anx.io/e5e - go-e5e + + + + + + + + + +
+

go.anx.io/e5e


+ + + + The highest tagged major version is v2. + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"runtime"
+ 5	
+ 6	"go.anx.io/e5e"
+ 7)
+ 8
+ 9type SumEventData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14type SumEvent struct {
+15	e5e.Event
+16	Data SumEventData `json:"data,omitempty"`
+17}
+18
+19// Using a custom `e5e.Context` class is optional and only needed to access the `Data` attribute on the
+20// context. This attribute may be used to get the return value of an authorizer function, for example. If access
+21// to the `Data` attribute is not needed, the `e5e.Context` type can be used on the entrypoint directly.
+22
+23type SumContextData struct {
+24	AuthKey string `json:"auth_key"`
+25}
+26
+27type SumContext struct {
+28	e5e.Context
+29	Data SumContextData `json:"data,omitempty"`
+30}
+31
+32type entrypoints struct{}
+33
+34func (f *entrypoints) MyEntrypoint(event SumEvent, context SumContext) (e5e.Result, error) {
+35	return e5e.Result{
+36		Status: 200,
+37		ResponseHeaders: map[string]string{
+38			"x-custom-response-header": "This is a custom response header",
+39		},
+40		Data: map[string]interface{}{
+41			"sum": event.Data.A + event.Data.B,
+42			"version": runtime.Version(),
+43		},
+44	}, nil
+45}
+46
+47func main() {
+48	e5e.Start(&entrypoints{})
+49}
+

List of developers

+ + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md/index.html b/e5e/v2/README.md/index.html new file mode 100644 index 0000000000..4a6294613c --- /dev/null +++ b/e5e/v2/README.md/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md@chore/SIANXSVC-1214-replace-codecov/index.html b/e5e/v2/README.md@chore/SIANXSVC-1214-replace-codecov/index.html new file mode 100644 index 0000000000..016b3d19f1 --- /dev/null +++ b/e5e/v2/README.md@chore/SIANXSVC-1214-replace-codecov/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +Test Coverage +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md@main/index.html b/e5e/v2/README.md@main/index.html new file mode 100644 index 0000000000..621063b81a --- /dev/null +++ b/e5e/v2/README.md@main/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +Test Coverage +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md@v2.0.0/index.html b/e5e/v2/README.md@v2.0.0/index.html new file mode 100644 index 0000000000..be76241b48 --- /dev/null +++ b/e5e/v2/README.md@v2.0.0/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md@v2.0.1/index.html b/e5e/v2/README.md@v2.0.1/index.html new file mode 100644 index 0000000000..1ea45074d2 --- /dev/null +++ b/e5e/v2/README.md@v2.0.1/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/README.md@v2.1.0/index.html b/e5e/v2/README.md@v2.1.0/index.html new file mode 100644 index 0000000000..4a6294613c --- /dev/null +++ b/e5e/v2/README.md@v2.1.0/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/e5e/v2/index.html b/e5e/v2/index.html new file mode 100644 index 0000000000..4a6294613c --- /dev/null +++ b/e5e/v2/index.html @@ -0,0 +1,119 @@ + + + + go.anx.io/e5e/v2 - go-e5e + + + + + + + + + +
+

go.anx.io/e5e/v2


+ + +
+
+

go-e5e

+

PkgGoDev +Build Status +codecov +Go Report Card

+

go-e5e is a support library to help Go developers build Anexia e5e functions.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u go.anx.io/e5e/v2
+

Getting started

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	
+ 6	"go.anx.io/e5e/v2"
+ 7)
+ 8
+ 9type SumData struct {
+10	A int `json:"a"`
+11	B int `json:"b"`
+12}
+13
+14func Sum(ctx context.Context, r e5e.Request[SumData, any]) (*e5e.Result, error) {
+15	result := r.Data().A + r.Data().B
+16	return &e5e.Result{
+17		Status: 200,
+18		ResponseHeaders: map[string]string{
+19			"x-custom-response-header": "This is a custom response header",
+20		},
+21		Data: result,
+22	}, nil
+23}
+24
+25func main() {
+26	e5e.AddHandlerFunc("Sum", Sum)
+27	e5e.Start(context.Background())
+28}
+29
+

List of developers

+ + + + + +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md/index.html b/go-anxcloud/README.md/index.html new file mode 100644 index 0000000000..e58d10053c --- /dev/null +++ b/go-anxcloud/README.md/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@SYSENG-1670/make-vm-nics-updatable/index.html b/go-anxcloud/README.md@SYSENG-1670/make-vm-nics-updatable/index.html new file mode 100644 index 0000000000..b0a9c441da --- /dev/null +++ b/go-anxcloud/README.md@SYSENG-1670/make-vm-nics-updatable/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@SYSENG-1741/index.html b/go-anxcloud/README.md@SYSENG-1741/index.html new file mode 100644 index 0000000000..c80f7c13ac --- /dev/null +++ b/go-anxcloud/README.md@SYSENG-1741/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@SYSENG-1822-fix-ResourceWithTag/index.html b/go-anxcloud/README.md@SYSENG-1822-fix-ResourceWithTag/index.html new file mode 100644 index 0000000000..fccf6469d3 --- /dev/null +++ b/go-anxcloud/README.md@SYSENG-1822-fix-ResourceWithTag/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@SYSENG-679/virtualmachine/index.html b/go-anxcloud/README.md@SYSENG-679/virtualmachine/index.html new file mode 100644 index 0000000000..4655b0b10c --- /dev/null +++ b/go-anxcloud/README.md@SYSENG-679/virtualmachine/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@decode-prefix-vlans/index.html b/go-anxcloud/README.md@decode-prefix-vlans/index.html new file mode 100644 index 0000000000..b1c12610e3 --- /dev/null +++ b/go-anxcloud/README.md@decode-prefix-vlans/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@dependabot/go_modules/github.com/onsi/ginkgo/v2-2.22.0/index.html b/go-anxcloud/README.md@dependabot/go_modules/github.com/onsi/ginkgo/v2-2.22.0/index.html new file mode 100644 index 0000000000..4677de095d --- /dev/null +++ b/go-anxcloud/README.md@dependabot/go_modules/github.com/onsi/ginkgo/v2-2.22.0/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@lbaasv2-cs/index.html b/go-anxcloud/README.md@lbaasv2-cs/index.html new file mode 100644 index 0000000000..471fa6958a --- /dev/null +++ b/go-anxcloud/README.md@lbaasv2-cs/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@main/index.html b/go-anxcloud/README.md@main/index.html new file mode 100644 index 0000000000..f30a5a9581 --- /dev/null +++ b/go-anxcloud/README.md@main/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@mgmt-bindings/index.html b/go-anxcloud/README.md@mgmt-bindings/index.html new file mode 100644 index 0000000000..7e932ad9a7 --- /dev/null +++ b/go-anxcloud/README.md@mgmt-bindings/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@syseng-728/cancel-object-channel/index.html b/go-anxcloud/README.md@syseng-728/cancel-object-channel/index.html new file mode 100644 index 0000000000..19d046bbbf --- /dev/null +++ b/go-anxcloud/README.md@syseng-728/cancel-object-channel/index.html @@ -0,0 +1,307 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@syseng-923/ipam-generic-client/index.html b/go-anxcloud/README.md@syseng-923/ipam-generic-client/index.html new file mode 100644 index 0000000000..3c0dd92908 --- /dev/null +++ b/go-anxcloud/README.md@syseng-923/ipam-generic-client/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.1.0/index.html b/go-anxcloud/README.md@v0.1.0/index.html new file mode 100644 index 0000000000..dc107c7ee2 --- /dev/null +++ b/go-anxcloud/README.md@v0.1.0/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.2.0/index.html b/go-anxcloud/README.md@v0.2.0/index.html new file mode 100644 index 0000000000..eb323b65e8 --- /dev/null +++ b/go-anxcloud/README.md@v0.2.0/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.0/index.html b/go-anxcloud/README.md@v0.3.0/index.html new file mode 100644 index 0000000000..3a151f63bc --- /dev/null +++ b/go-anxcloud/README.md@v0.3.0/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.1/index.html b/go-anxcloud/README.md@v0.3.1/index.html new file mode 100644 index 0000000000..60e880c684 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.1/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.10/index.html b/go-anxcloud/README.md@v0.3.10/index.html new file mode 100644 index 0000000000..75293302ef --- /dev/null +++ b/go-anxcloud/README.md@v0.3.10/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.11/index.html b/go-anxcloud/README.md@v0.3.11/index.html new file mode 100644 index 0000000000..099efb02da --- /dev/null +++ b/go-anxcloud/README.md@v0.3.11/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.12/index.html b/go-anxcloud/README.md@v0.3.12/index.html new file mode 100644 index 0000000000..621484f871 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.12/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.13/index.html b/go-anxcloud/README.md@v0.3.13/index.html new file mode 100644 index 0000000000..ac654c54b9 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.13/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.14/index.html b/go-anxcloud/README.md@v0.3.14/index.html new file mode 100644 index 0000000000..c3cb517cd2 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.14/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.15/index.html b/go-anxcloud/README.md@v0.3.15/index.html new file mode 100644 index 0000000000..a5592877b6 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.15/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.16/index.html b/go-anxcloud/README.md@v0.3.16/index.html new file mode 100644 index 0000000000..c79a17654d --- /dev/null +++ b/go-anxcloud/README.md@v0.3.16/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.17/index.html b/go-anxcloud/README.md@v0.3.17/index.html new file mode 100644 index 0000000000..6ecb78622a --- /dev/null +++ b/go-anxcloud/README.md@v0.3.17/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.18/index.html b/go-anxcloud/README.md@v0.3.18/index.html new file mode 100644 index 0000000000..84e579cce7 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.18/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.19/index.html b/go-anxcloud/README.md@v0.3.19/index.html new file mode 100644 index 0000000000..c3a69d0f91 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.19/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.2/index.html b/go-anxcloud/README.md@v0.3.2/index.html new file mode 100644 index 0000000000..81b56c88da --- /dev/null +++ b/go-anxcloud/README.md@v0.3.2/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.20/index.html b/go-anxcloud/README.md@v0.3.20/index.html new file mode 100644 index 0000000000..1fc68fdd30 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.20/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.21/index.html b/go-anxcloud/README.md@v0.3.21/index.html new file mode 100644 index 0000000000..59f34851da --- /dev/null +++ b/go-anxcloud/README.md@v0.3.21/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.22/index.html b/go-anxcloud/README.md@v0.3.22/index.html new file mode 100644 index 0000000000..e6155fce35 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.22/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.23/index.html b/go-anxcloud/README.md@v0.3.23/index.html new file mode 100644 index 0000000000..bb44754d37 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.23/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.24/index.html b/go-anxcloud/README.md@v0.3.24/index.html new file mode 100644 index 0000000000..cd8bfe7213 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.24/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.25/index.html b/go-anxcloud/README.md@v0.3.25/index.html new file mode 100644 index 0000000000..2e61eaac9b --- /dev/null +++ b/go-anxcloud/README.md@v0.3.25/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.26/index.html b/go-anxcloud/README.md@v0.3.26/index.html new file mode 100644 index 0000000000..fe9f2c0ebf --- /dev/null +++ b/go-anxcloud/README.md@v0.3.26/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.27/index.html b/go-anxcloud/README.md@v0.3.27/index.html new file mode 100644 index 0000000000..6b8fb4fdb6 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.27/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.28/index.html b/go-anxcloud/README.md@v0.3.28/index.html new file mode 100644 index 0000000000..615b29f4b9 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.28/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.3/index.html b/go-anxcloud/README.md@v0.3.3/index.html new file mode 100644 index 0000000000..fec5498921 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.3/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.4/index.html b/go-anxcloud/README.md@v0.3.4/index.html new file mode 100644 index 0000000000..0b15ee3520 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.4/index.html @@ -0,0 +1,242 @@ + + + + go.anx.io/go-anxcloud - anxcloud + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

anxcloud

+

go client for anexia engine

+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.5/index.html b/go-anxcloud/README.md@v0.3.5/index.html new file mode 100644 index 0000000000..661b95fe0c --- /dev/null +++ b/go-anxcloud/README.md@v0.3.5/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.6/index.html b/go-anxcloud/README.md@v0.3.6/index.html new file mode 100644 index 0000000000..d796530755 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.6/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.7/index.html b/go-anxcloud/README.md@v0.3.7/index.html new file mode 100644 index 0000000000..031e5aca8d --- /dev/null +++ b/go-anxcloud/README.md@v0.3.7/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.8/index.html b/go-anxcloud/README.md@v0.3.8/index.html new file mode 100644 index 0000000000..1b0b969471 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.8/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.3.9/index.html b/go-anxcloud/README.md@v0.3.9/index.html new file mode 100644 index 0000000000..3c26ded488 --- /dev/null +++ b/go-anxcloud/README.md@v0.3.9/index.html @@ -0,0 +1,306 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia multi purpose API.

+

Installing

+

To use the SDK, just add github.com/anexia-it/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the API. See here for more info. +I you crave for an example, take a look at the terraform provider for this project

+

Example

+

The following code shows how to create a VM. To be able to do that you need to set the environment variable ANEXIA_TOKEN to your access token. +Afterwards you can run the following.

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "github.com/anexia-it/go-anxcloud/pkg"
+ 9	"github.com/anexia-it/go-anxcloud/pkg/client"
+10	"github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client from environment variables, do not unset env afterwards.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.0/index.html b/go-anxcloud/README.md@v0.4.0/index.html new file mode 100644 index 0000000000..c97a1c43fc --- /dev/null +++ b/go-anxcloud/README.md@v0.4.0/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.1/index.html b/go-anxcloud/README.md@v0.4.1/index.html new file mode 100644 index 0000000000..cbc70d7374 --- /dev/null +++ b/go-anxcloud/README.md@v0.4.1/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.2/index.html b/go-anxcloud/README.md@v0.4.2/index.html new file mode 100644 index 0000000000..c8f8b19df1 --- /dev/null +++ b/go-anxcloud/README.md@v0.4.2/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.3/index.html b/go-anxcloud/README.md@v0.4.3/index.html new file mode 100644 index 0000000000..f9498bbf90 --- /dev/null +++ b/go-anxcloud/README.md@v0.4.3/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.4/index.html b/go-anxcloud/README.md@v0.4.4/index.html new file mode 100644 index 0000000000..d75cf0edce --- /dev/null +++ b/go-anxcloud/README.md@v0.4.4/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.5/index.html b/go-anxcloud/README.md@v0.4.5/index.html new file mode 100644 index 0000000000..2ccf8656e7 --- /dev/null +++ b/go-anxcloud/README.md@v0.4.5/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.4.6/index.html b/go-anxcloud/README.md@v0.4.6/index.html new file mode 100644 index 0000000000..3597f449db --- /dev/null +++ b/go-anxcloud/README.md@v0.4.6/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.5.0/index.html b/go-anxcloud/README.md@v0.5.0/index.html new file mode 100644 index 0000000000..ee495846ff --- /dev/null +++ b/go-anxcloud/README.md@v0.5.0/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.5.1/index.html b/go-anxcloud/README.md@v0.5.1/index.html new file mode 100644 index 0000000000..8445dccba9 --- /dev/null +++ b/go-anxcloud/README.md@v0.5.1/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.5.2/index.html b/go-anxcloud/README.md@v0.5.2/index.html new file mode 100644 index 0000000000..e12107ac37 --- /dev/null +++ b/go-anxcloud/README.md@v0.5.2/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.5.3/index.html b/go-anxcloud/README.md@v0.5.3/index.html new file mode 100644 index 0000000000..a4f1058bc7 --- /dev/null +++ b/go-anxcloud/README.md@v0.5.3/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.6.0/index.html b/go-anxcloud/README.md@v0.6.0/index.html new file mode 100644 index 0000000000..297e4e723c --- /dev/null +++ b/go-anxcloud/README.md@v0.6.0/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.6.1/index.html b/go-anxcloud/README.md@v0.6.1/index.html new file mode 100644 index 0000000000..c6a131ae7f --- /dev/null +++ b/go-anxcloud/README.md@v0.6.1/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.6.2/index.html b/go-anxcloud/README.md@v0.6.2/index.html new file mode 100644 index 0000000000..ff7ae34adc --- /dev/null +++ b/go-anxcloud/README.md@v0.6.2/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.6.3/index.html b/go-anxcloud/README.md@v0.6.3/index.html new file mode 100644 index 0000000000..992c6acf1b --- /dev/null +++ b/go-anxcloud/README.md@v0.6.3/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.6.4/index.html b/go-anxcloud/README.md@v0.6.4/index.html new file mode 100644 index 0000000000..4fcb797457 --- /dev/null +++ b/go-anxcloud/README.md@v0.6.4/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.0/index.html b/go-anxcloud/README.md@v0.7.0/index.html new file mode 100644 index 0000000000..c1e685c6ec --- /dev/null +++ b/go-anxcloud/README.md@v0.7.0/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.1/index.html b/go-anxcloud/README.md@v0.7.1/index.html new file mode 100644 index 0000000000..5d569faaf2 --- /dev/null +++ b/go-anxcloud/README.md@v0.7.1/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.2/index.html b/go-anxcloud/README.md@v0.7.2/index.html new file mode 100644 index 0000000000..975acbb224 --- /dev/null +++ b/go-anxcloud/README.md@v0.7.2/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.3/index.html b/go-anxcloud/README.md@v0.7.3/index.html new file mode 100644 index 0000000000..b711db287a --- /dev/null +++ b/go-anxcloud/README.md@v0.7.3/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.4/index.html b/go-anxcloud/README.md@v0.7.4/index.html new file mode 100644 index 0000000000..18aba73689 --- /dev/null +++ b/go-anxcloud/README.md@v0.7.4/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.5/index.html b/go-anxcloud/README.md@v0.7.5/index.html new file mode 100644 index 0000000000..0032fc7c51 --- /dev/null +++ b/go-anxcloud/README.md@v0.7.5/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/README.md@v0.7.6/index.html b/go-anxcloud/README.md@v0.7.6/index.html new file mode 100644 index 0000000000..e58d10053c --- /dev/null +++ b/go-anxcloud/README.md@v0.7.6/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-anxcloud/index.html b/go-anxcloud/index.html new file mode 100644 index 0000000000..e58d10053c --- /dev/null +++ b/go-anxcloud/index.html @@ -0,0 +1,367 @@ + + + + go.anx.io/go-anxcloud - Go Client for the Anexia API + + + + + + + + + +
+

go.anx.io/go-anxcloud


+ + +
+
+

Documentation +codecov

+

Go Client for the Anexia API

+

Go SDK for interacting with the Anexia Engine API.

+

Installing

+

To use the SDK, just add go.anx.io/go-anxcloud <version> to your Go module.

+

Getting started

+

Before using the SDK you should familiarize yourself with the Anexia Engine API.

+

The library is used in our terraform provider, check it out if you want some examples how to use it.

+

Example

+

Below is a short example using the new generic client in this package. Not all APIs can already be used with it, but we are working on that. +Find more examples in the docs (linked to docs for +main branch, not the latest (or any) release).

+
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"log"
+ 6
+ 7	"go.anx.io/go-anxcloud/pkg/api"
+ 8	apiTypes "go.anx.io/go-anxcloud/pkg/api/types"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10
+11	// apis usable with the generic client have their own package in a location analog to this
+12	lbaasv1 "go.anx.io/go-anxcloud/pkg/apis/lbaas/v1"
+13)
+14
+15func main() {
+16	apiClient, err := api.NewAPI(
+17		api.WithClientOptions(
+18			// Get auth token from ANEXIA_TOKEN environment variable.
+19			// The boolean parameter specifies if the environment variable should be unset.
+20			client.TokenFromEnv(false),
+21		),
+22	)
+23	if err != nil {
+24		log.Fatalf("Error creating ANX API client: %v", err)
+25	}
+26
+27	// let's list LBaaS backends of a known LoadBalancer
+28	frontend := lbaasv1.Frontend{
+29		LoadBalancer: &lbaasv1.LoadBalancer{Identifier: "285b954fdf2a449c8fdae01cc6074025"},
+30	}
+31
+32	var frontends apiTypes.ObjectChannel
+33	err = apiClient.List(context.TODO(), &frontend,
+34		// Listing can be done with either a page iterator or a channel, we use a channel here.
+35		api.ObjectChannel(&frontends),
+36
+37		// Most APIs only give a very small subset when listing resources, add this flag to
+38		// get all attributes, at the cost of doing lots of API requests.
+39		api.FullObjects(true),
+40	)
+41	if err != nil {
+42		log.Fatalf("Error listing backends for LoadBalancer '%v': %v", frontend.LoadBalancer.Identifier, err)
+43	}
+44
+45	for retriever := range frontends {
+46		// reinitialise frontend every loop to reset pointers and avoid potential overwriting of data in the next loop
+47		var frontend lbaasv1.Frontend
+48		if err := retriever(&frontend); err != nil {
+49			log.Fatalf("Error retrieving Frontend: %v", err)
+50		}
+51
+52		log.Printf("Got Frontend named '%v' with mode '%v'", frontend.Name, frontend.Mode)
+53	}
+54}
+

This new generic client will one day be the only client in go-anxcloud. The legacy API-specific clients are deprecated and will be removed in the +go-anxcloud release following the one with all APIs go-anxcloud supports usable with the generic client (so if the generic client in 0.5.0 supports +at least everything there is another client for in go-anxcloud, 0.6.0 will drop the API-specific clients).

+ +
 1package main
+ 2
+ 3import (
+ 4	"context"
+ 5	"fmt"
+ 6	"time"
+ 7
+ 8	anexia "go.anx.io/go-anxcloud/pkg"
+ 9	"go.anx.io/go-anxcloud/pkg/client"
+10	"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
+11)
+12
+13func main() {
+14	vlan := "<ID of the VLAN the VM should have access to>"
+15	location := "<ID of the location the VM should be in>"
+16
+17	// Create client using the auth token in environment variable ANEXIA_TOKEN and do not unset the environment variable.
+18	c, err := client.New(client.AuthFromEnv(false))
+19	if err != nil {
+20		panic(fmt.Sprintf("could not create client: %v", err))
+21	}
+22
+23	// Get some API.
+24	provisioning := anexia.NewAPI(c).VSphere().Provisioning()
+25
+26	// Time out after 30 minutes. Yes it really takes that long sometimes.
+27	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
+28	// Look for a free ip in the given VLAN. This IP is not reserved for you so better be quick.
+29	ips, err := provisioning.IPs().GetFree(ctx, location, vlan)
+30	defer cancel()
+31	if err != nil {
+32		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+33	}
+34	if len(ips) < 1 {
+35		panic(fmt.Sprintf("no IPs left for testing in vlan"))
+36	}
+37
+38	// Create a NIC for the VM and connect it to the VLAN.
+39	networkInterfaces := []vm.Network{{NICType: "vmxnet3", IPs: []string{ips[0].Identifier}, VLAN: vlan}}
+40	// Create the definition of the new VM. The ID you see here is Flatcar.
+41	definition := vm.NewAPI(c).NewDefinition(location, "template", "44b38284-6adb-430e-b4a4-1553e29f352f", "developersfirstvm", 2, 2048, 10, networkInterfaces)
+42	definition.SSH = "<your SSH pub key>"
+43
+44	// Provision the VM.
+45	provisionResponse, err := provisioning.VM().Provision(ctx, definition)
+46	if err != nil {
+47		panic(fmt.Sprintf("provisioning vm failed: %v", err))
+48	}
+49
+50	// Wait for the VM to be ready.
+51	_, err = provisioning.Progress().AwaitCompletion(ctx, provisionResponse.Identifier)
+52	if err != nil {
+53		panic(fmt.Sprintf("waiting for VM provisioning failed: %v", err))
+54	}
+55}
+
+ +
+ + + \ No newline at end of file diff --git a/go-cloudlog/README.md/index.html b/go-cloudlog/README.md/index.html new file mode 100644 index 0000000000..fde0941f7f --- /dev/null +++ b/go-cloudlog/README.md/index.html @@ -0,0 +1,111 @@ + + + + go.anx.io/go-cloudlog - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog


+ + + + The highest tagged major version is v2. + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/README.md@v2.0.0/index.html b/go-cloudlog/README.md@v2.0.0/index.html new file mode 100644 index 0000000000..fde0941f7f --- /dev/null +++ b/go-cloudlog/README.md@v2.0.0/index.html @@ -0,0 +1,111 @@ + + + + go.anx.io/go-cloudlog - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog


+ + + + The highest tagged major version is v2. + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/index.html b/go-cloudlog/index.html new file mode 100644 index 0000000000..fde0941f7f --- /dev/null +++ b/go-cloudlog/index.html @@ -0,0 +1,111 @@ + + + + go.anx.io/go-cloudlog - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog


+ + + + The highest tagged major version is v2. + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/v2/README.md/index.html b/go-cloudlog/v2/README.md/index.html new file mode 100644 index 0000000000..c29805fe22 --- /dev/null +++ b/go-cloudlog/v2/README.md/index.html @@ -0,0 +1,108 @@ + + + + go.anx.io/go-cloudlog/v2 - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog/v2


+ + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/v2/README.md@master/index.html b/go-cloudlog/v2/README.md@master/index.html new file mode 100644 index 0000000000..e8917db3fe --- /dev/null +++ b/go-cloudlog/v2/README.md@master/index.html @@ -0,0 +1,107 @@ + + + + go.anx.io/go-cloudlog/v2 - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog/v2


+ + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/v2/README.md@v2.0.1/index.html b/go-cloudlog/v2/README.md@v2.0.1/index.html new file mode 100644 index 0000000000..33538099bc --- /dev/null +++ b/go-cloudlog/v2/README.md@v2.0.1/index.html @@ -0,0 +1,108 @@ + + + + go.anx.io/go-cloudlog/v2 - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog/v2


+ + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/v2/README.md@v2.0.2/index.html b/go-cloudlog/v2/README.md@v2.0.2/index.html new file mode 100644 index 0000000000..c29805fe22 --- /dev/null +++ b/go-cloudlog/v2/README.md@v2.0.2/index.html @@ -0,0 +1,108 @@ + + + + go.anx.io/go-cloudlog/v2 - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog/v2


+ + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/go-cloudlog/v2/index.html b/go-cloudlog/v2/index.html new file mode 100644 index 0000000000..c29805fe22 --- /dev/null +++ b/go-cloudlog/v2/index.html @@ -0,0 +1,108 @@ + + + + go.anx.io/go-cloudlog/v2 - go-cloudlog + + + + + + + + + +
+

go.anx.io/go-cloudlog/v2


+ + +
+
+

go-cloudlog

+

GoDoc +Build Status +codecov +Go Report Card

+

go-cloudlog is a client library for Anexia CloudLog.

+

Currently it only provides to push events to CloudLog.

+

Install

+

With a correctly configured Go toolchain:

+
1go get -u github.com/anexia-it/go-cloudlog
+

Quickstart

+
 1package main
+ 2
+ 3import cloudlog "github.com/anexia-it/go-cloudlog"
+ 4
+ 5func main() {
+ 6
+ 7  // Init CloudLog client
+ 8  client, err := cloudlog.NewCloudLog("index", "token")
+ 9  if err != nil {
+10    panic(err)
+11  }
+12
+13  // Push simple message
+14  client.PushEvent("My first CloudLog event")
+15
+16  // Push document as map
+17  logger.PushEvent(map[string]interface{}{
+18	"timestamp": time.Now(),
+19	"user":      "test",
+20	"severity":  1,
+21	"message":   "My first CloudLog event",
+22  })
+23
+24  // Push document as map
+25  type Document struct {
+26	Timestamp uint64 `cloudlog:"timestamp"`
+27	User      string `cloudlog:"user"`
+28	Severity  int    `cloudlog:"severity"`
+29	Message   string `cloudlog:"message"`
+30  }
+31  logger.PushEvent(&Document{
+32 	Timestamp: 1495171849463,
+33	User:      "test",
+34	Severity:  1,
+35	Message:   "My first CloudLog event",
+36  })
+37}
+
+
+ + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000..17f0332668 --- /dev/null +++ b/index.html @@ -0,0 +1,65 @@ + + + + + go.anx.io - go packages by Anexia + + + + + + + + +
+

+ go.anx.io - go packages by Anexia +

+
+
+

Hello world!

+

This website lists a collection of our Go packages, making them available via our vanity URL.

+

There might be more packages not added to this website, looking at our GitHub +is a good way to find all of them (the link filters for things written in Go).

+ +
+

go.anx.io/go-anxcloud

+ + Go Client for the Anexia API + + +
+ +
+

go.anx.io/e5e

+ + Support library to help Go developers build Anexia e5e functions + + +
+
+
+ + + \ No newline at end of file diff --git a/static/Anexia_Logo_RGB.svg b/static/Anexia_Logo_RGB.svg new file mode 100644 index 0000000000..843cc251dd --- /dev/null +++ b/static/Anexia_Logo_RGB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/fonts/fira-sans-v11-latin-700.eot b/static/fonts/fira-sans-v11-latin-700.eot new file mode 100644 index 0000000000000000000000000000000000000000..37b7a5e31fe09b96daa7eb4bfa7f6ecceaa9431b GIT binary patch literal 28346 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-700.svg b/static/fonts/fira-sans-v11-latin-700.svg new file mode 100644 index 0000000000..eb522e3218 --- /dev/null +++ b/static/fonts/fira-sans-v11-latin-700.svg @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/fonts/fira-sans-v11-latin-700.ttf b/static/fonts/fira-sans-v11-latin-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4227efcc7c07558200c1af05b6ee294e208623ad GIT binary patch literal 64312 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�Irgk!j`LZaz_T)< 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-700.woff2 b/static/fonts/fira-sans-v11-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..74096323d8dbeb05b473a5b488d3e1727c8d6bf8 GIT binary patch literal 23868 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

$Dj| zMObKQc7~sGa=11w9@xz8op-Bnne4+<#7Fd_^@4E^u93RjL7$>GTAW^LsO@aurRP<| zj`13+T^xabO>wl=c0?30*%)MJ7Y^kvJBTy1LO3@zTDG_{*GD5*%I`Nm@{RMh&R8rgA^t6A*$?hSYBxHd)x^q=i8oP2I zqr*TP12cg^RAR1LF2eq18BoCWL5<^tQs4~P@3kK;z%}6&nP{Kqqrg69Al9%B) ztYlhb$YAgHY1*WVlUjsw8;J=6<83HkPhkOLP|^*vhM;03xcnfc1?cgD=U64g&`vR- zY-3bu8eN<)7j+NmHQ<90I7PjgHilITCE};8{lXy8>Pe*_8=HYJf&pnzi^3?RQ%d-R zCORaJ0z{|FB*=tvw2cLIDuLab3RyAykZx+jA~R)k5aY2VI(<2Q>c^)>=CCV z6ctmR`kGOErtgkbC$X?34ZxivJ9qFrAYRFvr3wAH+*@~)s8W&PR4=5Wc?O>Xcz3uq z+oj?#P75foa3933^iYNe{x}_yAaB{7rrI@Z+>YECF936b8c)iH3qvqK?eJ%ZKJwaJ z6wtp7#g|vTJ42mc89NxhkTMD-EpQ#^-6p7HJ1pt21;?oa4C-#p`|LikSxTV`_6{^K z4$@$Pz-e1qrlzCec!Wx$3F8dMOdt)_=sCU5^a23vu0F0rg+vfJ@tGy;O}pU^{IpG# zEy%DrNB~N(OxzKp4jMwTUD24zX>82Av+3O{56}P$Gps5XO{LX=V67o+SbC97L#baO zuj->Bq*ak_%Y{O!HX{`7GYuGYgj!URU58@0! z0cPxqTVFc}iju0{VK~x)8oLW{ra&0DQ_GOOvCFs7%{Iz}XwZaA^OW^n3Jg3YeCvbt zT>5La#f4TFobAQS)^3$2%`6AbS`2ZEr};@-_AIiY%w3hBSQJ*v@{47-&*Uy&;?jA( z@~ZE=uW@eILDiHXmGAWcSy2}#& zeFyk-WYP%dDP)&WNn{c83NcorRJ&EPlSkF|Cjd$kFAz2n9??>O0@mj>8)FR9vkfS~ zUspLTf-eA({lp2R(Wtq*Y<Tz^gmc_gLZ{*5lAsOGi3nbOer!5A96_krVM}_KL zoHcuxSpi5R_E0{TlWc~zA#7+pJ4NRNgvwH>NJ8xO9$#_1LFM<*n2np>YR%6Rp6Q1- zB&JuU4@N2AAmW{r3JC!d?>2c6_|`)ozS-B1jM@qmeKC+j#(FbWk3IgSuUCq-J;c7# zXE+)DaS*cHHO{2F@B9m_Lz{lt)reQ&4AMc~&B!yz6u<_q1c*!a>ymeE)XmQ1*v{rO zx&yu2G$kvxHH(S9c?2_YK80|{1}KUfxVXK9<1`xjhLKY{#uW^X1Y;ltk5Dq8(l`+S zA(kw^4&%2zk}TDw69`=;bOGJzuZSdg-Av_|$h&w*HiMP^pVaqX#%JkaGZ1~xLrO6; z-aekg?lQuY1Oh_|3y$C|^`I{_?9FKjK_box568vN2b#vlEEtN^Ood9tRY)ODmyTIqTc&0r(Qv#>uQXsi!rRTo7@lHn&OJT!Ztpk~x>FOh;Ikix zDjkW~Nqq1FS;M1ld}a(r?(UNe+!fs+zkr29a|d87Des0Z;3FZz7yC+dSOLf)6po^& z7*d-^1n7*$cQp)>1VOWG&AF2Td^zJHP;{5C6@*s}zPSraTw>bDs?ijaLFepB$ubO- zER|6hR}LCXq*6>msz-BzbQz(GOqj0fzPU7c0Z^uj<(mIEWL!ha#ymPY7_wH(1~KJ% zXJaQ#06$Y|dKN*QglULNFp*QkZkW!}CHXzc`#|ZCJtqk9R+F ztU+Q`LSYqH^$M00xQc>k9GX*s*3J?K=mDcW`@dvjs#q>{4oG54PdN%l43IcSDN4nA zZgt)Bj0SCk5ksK$5Q5tK*DwTYZhi*&( zp8FAEJA;N;y0jC8Sl>OgEMFm8Rn7k;sV@WJu=3-~i?Y4yV5!t3Md=! zm?oKkOf^%0a(b1`29nvSw*x#+k;DTqF&#<@n-Z&&Pes=w4;WUVNDs}9cvxbfUChQ3 z+NEo^wrcCN@0Uf@${FP?raA*NsUM6tr`XbrAf}i&n_Q6edu@b)jA*)~S6t@>@PLlC zG!v}kdr;z0gLBze;OYR`rj+!M6@NA2iq=0j1;TIY8|tlpPJEstPil|ooxFQu6H?v| zpo5;uedn2%kP)%62OFlXVa_Z$+426xJj?+>xD4 z6hx^VFsHg4DrDrv1fR74sx{J#Eqzz^;^_H=y0$FD0A@u!8V6MfeSFztPjFjpU=}1W z@%_4~7>b{(Q12X~5|^JOL_a@E0tc0`cFc|-sjk$eZ{=-AqW20)v#`VmuE)i&7pAt+ z0^yx9C5zBpKd~a}5t>3uE?z7>Kj>PzTL%_(4~;r@PmG;g}n#Vx1K`g9cWf{HI-!FuW$g-1#zDg?q_5|*4m)*n~ z93R~vLonON97Z6r8p^Hl2xo6G5)2a)X{z{vjTm5HlY>g(HWSc#;b{L3Lyks>u(rOZ zcaEVI(m4QHKle4k!rS(GiDC2*|?~9Sqcj`%oJV{JPcK z(fph_M2|2qIUCqfUDC9Z>IGk*0tJ2AW3nhE$^ek!nY#28!_g*CB6n?{v**yOKtXdE zU*Inv^ofrf8dzshj46X0#aTPIim7h&d6>ATya_fCxyJ3Pqev>^yQZS2&~UDg1(YUI+e zEo3s}9B!H93d?${LiT6yTCK5tb|pR=^{>a+(9k;5PO`IiS89Z1c@aWwBS@q=(u^UV zQsk)c7p!yduS5lD%rMHA3lRvr{Zqp_bKZvYg9_n6|49#;0~7#LH(-|7kwALbrsuFQ z6twtrQ1FO^`x2YK!c?j0zjzp}3=oCBWc9 zoGPq@NI8)~Lv-|fUA+~*)Dj0IL90Tf-Q^{+gYV_QP;+o8CBVB;(t%70>M>|ALh|#@ zww&Oc#vlP=(3sXObI>Ne20*d(f>%}vp^_0g!E!c3a`}o~Z#v7QUUecAb4F{2o)q}Z znrrMul*2k;)L#an4|@Lz5AppBhh@V_CBWQV6aizW4NgH35Hyz}Fn9J4Akp2$Ocq%3 z!7DC2)*_E%oY@m`KERSNf_X#b9YU|V5f=?(Krxk8VQG<7svc%guVL6F_=iA65zg@x zFfs#HS%k0cM-}>t77YFs={I+~?GVY>2v>-2U^?<-M`)#6y)IfN* zFe5NSXg*{PfNdhW=FIM~UZ!BCu#-w)0|hilKR_}yXr>+PA~1y_x$ORpSD6TH8BkOw zGE~B?D%wNoa(E6-jSciv%Pn$Zf*|6e<$`V@)PhSUxbz;H8+bG3RP?X_38aw?R9eOe z3xl@WOWYe;xiRTtq9r*8Vzw(7MJH&|1(yYcpAx^SZNd^}EVWg-ZuH97Wr}s?^{dWp=l1|cx&u9ED>$dUS>CuB^sr6a z4fG*tdP`{jR1yRv5ixEU$jjZPGD^&P8qx!@;Sa!mZ{b++f!(8z<*}GKh69bM3~a@b z6d@590KsG!UuMCM>M?Z7iVu|y0CITb?dnno93Fn9f8UgSNx7(2|V52o36vEcBBACOU^6_tmsLe^mnvcghuJR3h~FnCg8duHDft^DR@ zM_`;Qifb&>;`hzTc&Qn}niT>pe8aKFMC!x+4(@2Wt7CE$WQB^dJP%j~vm5(#9+4er zV!Rw+8RjT$0=Z*4sS`-;uFeM_$cTg^v-fkd-QyrYv8?*6db0~jOh%=Q5ykrYEM*u7 z(ySo9v~mvl*=Zt*@+%nvt)p(aN&L>RgMe;8L3#%lfas(12aze~i${rt^4kf5$2M-{ z#audP`*QBnrRm4VdOavM5<7U;!Q>Z8Hfb!XVcAK6lrrxM;NYS^ea14lAa4VV_sf#! zbxb`dycHnw0WY$UH`EcR(Y~t(YZe+C!d`Y~`vNBgi30j*vI0@#=)rIdnE?>;bk2xo zMfngra*08cLH2S+^)}H}K_t6{qC6nYh;}BD8buz0uiUdm2xv1}e+47e3mbyA5}Ade zrNS6CLEd8)sxlDhDHxMCLFWcaPCI_4nnMIu2YxeNdc28*OAa40V)jG|>MoAbz^Tlr za+PI^JdIoJ)D90S;lRNEV}vXL4O%2nLJ%{A2TngR!Rm7_EL?TLqri^iLAnM z{t8!JgxW2Yi$zlPhA3;5F97=!BXL=KzZ0)ALdR+M_J5*x2imlB%LWKYKn9G{76Fq@ z)us2!n;98^`iqAn1(9(hg!=d*s5fcmkAj+Kya6k!*UHEJuSfJMrwc88#B9nZ**zw$}_Z3 zcW{aA{LQsSg#5+H&G-G_j-v*-Y_uUWFC!gOQ#_az^VcF+C^-XgQ4}-Z49;3p`dylV zC<|a0;wPlIE-;&ZKD`;`O8QW4g)YaH)efFjkjKpn}>vBbv!Xg8NVbeN0CP zIrDTXsl-scW&lDGWGtu02fh{vG5aslO7kVx7JAtQM1_3L#qmrdxES0alhR>&*i_}i z7n8QTNMJ5^|eeUmnc{G z=z|Fc0kL}U$@%D|3db*um?E&_Pg5j%nlSQD^SuKSIXMmh(6ws48#M|Dts$i)WH3L^ zpH~3+rxg0bj~@n5Y`nmc2h46b0{|_3L}V@KF+g4*YDKU>us87?EndO|EbIq@9y9m{=NT($LwIk`1n@JV=lO4$Rw;48w{whm8Vk>#o;Tn(fQsZh^Cw;y-n;yLYKjgYFoLgC1(_ewrX{GPM~Yi(O9DQH1n z*80^B--;OVR7%nxvVKeFsA$-w;vJAZ35bvWkz6O~C(W{xpgu3Nj29|eWjqTnN0unH z*1im?>3+t#6p)h61aMJ-N=uyYHJqB_27BcY__|VSb+-$}K4l|(>l9lEICs?~BDe)q zm~Dwc&OuGdUih!0=b4cX26Dg{8`Fu@A&*T#f<~9&#kT3U$~=(TGMkMY01LtBTOMbQ z_;sq4;Y$V{dgUPK`-=2w^BXl_3r{^|@o&)xu?nU;W%Cdrgk8Zf?nuDI;)Os30mLFP zcwCx;J5U^BX?>M*UXg?*trSdVN*(D+LBu^+%nTVd-zI#O$-+cZ5y>muKN{xACgM9$ z?wZD}4WCqkQ1p$3Wz7jeps3^&P + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/fonts/fira-sans-v11-latin-italic.ttf b/static/fonts/fira-sans-v11-latin-italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3695261979182a27fc025d603fc5f9803eae889d GIT binary patch literal 60592 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 z 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-italic.woff b/static/fonts/fira-sans-v11-latin-italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..7e1d9ef761d3b4ca72cfe773a7cd37ba35896aec GIT binary patch literal 29176 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-italic.woff2 b/static/fonts/fira-sans-v11-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..069b9402b0d380f403d203064f2d19b3915027db GIT binary patch literal 23720 zcmV(_K-9l?Pew8T0RR9109>d55dZ)H0PVy809--<0RR9100000000000000000000 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

I$+WiU>E|hQ3V(^ zk<6bUr)@TzXIu?JUj>J-7)ewLi57~GsEV=Kp`|=AgiYI2Ku;^x-{5rN4V?U>P2*Ah zO7Nk|{Q`4F>v^vU#$p87DC zdQ2Qcd9k!=P~9_o@4;<2<0uNusDYjYzz+@>Nq=lRc(t4~{klXhd09`4b2Lx z{2JM_Y!Ud+2hGG^RMFfEDt*D8{#AY!$VFw=Gg*StVRpj1luRvrMNg%uxPnj=5tG9g zdvZY!d?TtrkKbZ!R?iH9-|>bQw%lT5X>c$v$4thBmbTN`kIM~56Z>K-VPtdz7GKIR z2>e%TKOO*%U~UbNSX}8E2EWNR(u^NcUhKlTR*8UzS^7f39@idWsGly>8oG`bLyLny zHu8q$1%s|b8^^&`kl%|>Xdl@xs7l6>T6fV@zfTin&)i@IseT0bR(%|!0R7oHX&x!`ku7s(dclOCw}R&=Ch`;^N2E=i0m{N z?Ur}Ol~sSckw~nQD+`Z>1jmy(X;Z>w$GV|VBoEte*p+O>*i#;ZB{wavK(5(#qTVK^ zyoJw7#DG3Qg^M4jR)52i4GFbmOCcr;Kw)0A*Jg!@ue{)oF5xdo#XU*D;^z9DZD4sn z8-K|{Dt(uQSt`19rBbhEGQvY!$$+sA6*m0s74OP$c-1DkY5ZY-Fbk7}5$(~@v3Nb` zmF%P*lKQOhSXWFmi#|z>lM9MkNMx;$4yOblqdkoxZGHS_98AR zL3a6N{p40Fp^DLsHjDPBV|HiJNfkzhmhGUP2@yYKu^a|L7Yu`s&oob&)KfIEt+y^G zF?zqguXv~`Xm4HJxakgZbP4XTI3)ZEXE4KAulEx@m^1Z&BlL(8+|xZNG{oqrI%qjA zyBRe3Yh=1f*i@`Iu5rd=FwK8fS!{g#S{Aml$)@^)pq#GJH^x`MHU<2vS1?b|+#R0H zBQ+00|Fub~g34|bu*PCImwU&bASwO|%i3y$*P6!_Jvkbhx9u90tL}xE7;mZB)=xm1PQhMhB_pj}+=)fdHu*GT5yRpG)C8dCp_3jzgO~J9RM^uvN``$IN_J*nwfSZ~4Yg zAw=fXj9tVB+mCsAXzp0jc;FK3{R=za`m1rVg)N~X>@R(QEz=!s@MI7JKv7H}b_YL&s4)?W$t?J8B@)sx{HFEz5;^>33bH;;=IfrY4MCHNf zOCz4J;Y+%Qi0CPEUvw;$pqmH7|I#J;nZ*4(;mHAKn zLW|$$*<~CpPpa8lS`};^q+b1qrG20^XQZ+Er0#6>B09Ci&Tk~~qZGcSb}v;YuxIAo zg?I@3_Ny}SfBRPz0PW_*{XM=&AHiuK!HE%;fDx86OY}eTq%mPPjMN+gKp+8|U4Cu6 zL6$OmlH983@hPSC)S9?lvqaoKN(DVq1-x;L)J*IY?1~2UiotY{l7V%cTInPqrf%Av zjCwuzXh!vs#$@VzPR}Z$1H0c zMKpB^3gGyB?jwtt&aC>F_2|sk^BgfdpXwz0(z)n5QUt@40W(K%t_6~r6rx1hzVrqK z=7b0)4L4RZpi%fwVC%-QQzW=4VcaN^p)*}I3b9;Nc*=NpbXo&`FY5fbn^i+xQj`r>oe5^@y%=`S4M%I@H_!IS(Y`KOoX|d~~ zgNemm{G=$a7h`APQa3MJC#|d8AVkK+al}0@>%J=E{U@vpu8=(>|MKu3|NZPvGlBAj zo0ZXV0@gqE_|k_YJ>W{mTQ3&Y4%>V3mMv8edCuK zl`(&P@%Avqb6*@I4=BP>WP^!&P}nbC9a9HA9asFB=woNbHs^cPe8Uf=2h}Ju%NABe ztao6E>lqy_4EoFEwf7oKYhn(0OZol7>|Y{2p+Z@E@+Rq<`R|Di79ng-Humi%?*Gu* z3Aed;Mf_-R*tr$0XwL^F^df6TIjaHNTneAX>eCS^3#RQ5x|55~ine4;qE^~l6<|68 zcxUB40gsluRAEfmqrH?+0L~x;WHtv{lVmBGe)?Sc69FOZifpGOdyKfAO9PVfyp{)%BFC{{`0 z&v3^AH&{^ogMa8WlCP6NW2Jx7I6Rd8cIzcROUOjXU!lv0d}TSE-(HUeBq+A)KfAO; z*~k}0ZWE~$^{UueoH3(pwWD-~n_@%`jnj}8A?wKBNFi0?e@!W#kCUxRt_PQY1uAp} zXwzx!dk=o=B>-4T#gnvNX-0zi2*3m9VQ01sHBQ(57idP{WQmR2Orpp~qE(4kBu{Q1 zh(1W}NUy2xSgzujR}!)R6$Wk!W2-PM_tD&GML${SG8tt_S2dFOE3ukL>)6#F$}6%d zYBm^ueOKf*l%P3Ld77IloG`~O-=46%1JDuLha|OaTc3Ydk*08rNRhnkVOKKEa z0mSPGo`MZf3bFd|3ePOlKg8xI3ZGqJ?r&+J4+)I%yg#k=v`;KE*X&m_mGtE(tfBs6 z0$!O7jLx@AUCj|a>H!S!8Ni7-1U8(6d63?(r)!|OUmo3w&fzzJ!i(oBpfSkMfXdL6 z`l6pC?2jRkW}7xVwst z>_stc`hrKLB_mm||I+*J*q92Rl`F&{0g#p142K|zf@wa)T5JVC z2EaD_*!HluiMgHSxvUs~pik4C%_p046^v-m7$;bK6AC(B;KP!Ua6*VoT|&lwQ;rTb z4Akl*`IcSlgR&hIl-P)P6Ov?U?Z|9Xa2L0zFNJLhZ_BI`w77Q%8-(?1b#;t0+nS9M zpREI*A8@s3@`D9mzR0nrGFDP`4RTP>s6Qd`D^O#U7r8YIXl^qIu{Y#D^wP3ZJY4UM zXKA04UsqNo zdPXGnVcV+?@qW@D|?M+R;?*e&SXpLZxbh7 zfl$0CHN!cp0vt6GBem(R3FDJBt(soU-Z*_3_*QR>&wXUkx8@WCx9V)ME_XP|!JK`* z6E9QH+~||l*jHQljsgYey7Q-zmaj774IH zW(-)^`)nUFhE-r3+V;d|h^FeANqiDGr|n;fTgU9gbvxYO6OK|ERFBl>nO4Qb{9(G9 zk&2-L{!(2pm@97Mp0HE+j@nsnY>0YH!cO-~^?v7+yTHf_IO6*FUJESUT4UHC)U9__ zk>7E4fM7;aVR!WVMIrm0W-H%U-}XenEq+ZyP-BLJpY=W+C;btULG^8Z2;a z@CSZLDw=K}dVJDL5aoLu7=!zq`!!Q-OthGr=c7!f`^O9G?0mW@@-APwL;&2uJvaaje@RheeV>?T}PkeZ|xOem&jS3%j*QlFPr zeM#?30%v$RPhwL;enl0qO2P4t*?uD?mVNb@oX;Go#h}T@u+u&#<6RL0|NSH4ug`NL zv)qEIcqGy9Mn>&24(m#xy$ZdwnCiTXkJ42TVBVn)19LvXVFl^E#)iCV>WNmTmVn4H z3@&Gr3t9arQLqP(wJr5mH9v&OsVcZSxyg5wPp70u(ozOdP+2#!uuZsCV#rM^*0NzX z;sFvZM>5@)6~@CV5CWRHL^MCy#3prpKb9Z3rtjyFh(9Q7`+~s-${H3E-{XO|g$xPh zk4xQb2si5(8z#dj%$qu(K9 z=*2jK@^Fz zBGkf7dIuy9y9Br-S})@+jCFa(h)s{bUQ<|hx&AKm6Sn<%gP_=myFH_U)AFFM>t2|T zl{hp-9~RkF%N3?V&OT@n+u z?~~bU&T?wrbFExEhYdT!H)Fkj@c(SH4gU=P)QN@4Ht9~@*>QOt+}q(*@#|!v%BS{S ze+`ybxJ&<)j_lf(93jNp4=dM>M77YQ+o^hMdG4wW@odzcJQ;U~QYk$yo{+gMow=RStlE;M^la8dG{Q$+$uc_br z5m!>rAzttR&M1c#Z49LM8!se9mfAgTqYS~rnv|#8BNwtL$zNHWn%v?Zk`Rp5TV3fJ z8l0YyZ-ly09KRhk$!C-(KPh`JEBQOWf*08^Rj^wq0Bo?caiHQ5TEgzkSBhSrU2@Ih z<$4Cl)IdBuWoDRl3Lg!vx(RrCE5;RHRs&L)T?!G>OAv)O4G)UzZKG8^6i#`&(uCi~ z%l}Sja-nCIedqdcomcjFWOOy(U^gtg7zz9*4{Uw|)|Br37`y#_y!iVlkN^JER2?JU z#bVu9zz`Krt$Qs8@rr{z3!Q7{g(v3uGmk$iYza*uF{a(*4ec@iDH%~>M!ao1`OoV?o*)sCbes1J)sQdUz(h!xR z?E?+}&;yQkX2Xz}ubbSSOU})aQe2+>YIYp##2itd;^F!su9e>1 zqe7p=S7K4Ir(!Fi&{7h>SEA_=`z*+eW0o0hl$-cY{(Ib%&#s6<2PA#3)`1P*Nj_3_ zN|&7y8v~O5#F;*NH098E$oD&rX4|v?ACj29-|41@L60(_&nBi%tW|J{SBopaWxx!I$2BOJ1S+G$Eb5>99Hg=5(7s~_SkUwzUUhfmj2_)J7$}d6leG>?eBNnZ7IdvMI+5+o} zDtKdWGDEwthdyeh9)Hr&Uc&n<6pvAIA(+h3wM|vH;YNkTDLI@+<&Au6dmn~YOJZu2 z|6PQBD`_abKLu)SC*noV&3Ppk>$k%PcqBk$a&aa*?pS>hUiS2c$(4~1Er&@)Vu4or1#vDPKRB}&KOd4;q zMwh{nPJ&HqF6~BAj*qTL&^oJqy1baBvG_*NO)zps5HbH;DC7)8iTDDe0SY%xfz`xf z1;>DlPyiDb3@EP($cY3Hd6fgr05aPRLgW6OrSoaX&5TPb7!uv>#_e_n4)QX##`!3Al-!%6f57R&Pn}0GA=!@weq&cujIp3@L zT_jU{mO5;B{GPEJeN_)p^ux3Q+vTP=rI*JZ-(iy%D$kE_r53yosVmiZ4v#2RhOF zc~>k%0LjN_0rI`CXKp}6gag0G-s#bK7m9c5ur8Qv$mvsH5J0U|0VxiI2@v$s;YJeo zDMcfnB4r42WepQ8FCWWF$Q3g35e^x)`NfL%Z<*3veFSSBxAV7cmO%%If5excE~AaA zFA%erzFIiol>0>20$WjA`r>HvCkkAQyiF*r;#Abo9yV2MXDDh_;saG0Vk~hyc{Kd2 z)U@JbhANatoURF`5$gX_nvcNbd9v%kn|-LnfQikegJrRIe@8)f`D9`=q1GX6%NVWS zB=dPUU^s7Be=>OZCMkkmRtX<37BVYW>kd=F5GM-r&&iFe7o=$=G0aV>*|pB)N;g@i zN&=e4so7Fj8CBkgUMh@Hi5aDcD8;5V2m};nH5wC-!O!A@qlq15O9h+D@v)`J0Qocm zN`b2}61%tt|JtCt;^Z{blh;hT03*b>71)=9NxXJZUWyLiE`8tYJvALjWfFZl(;p(p zB%l7fA`nBy^;x_yM0D6YP_Vv5aA|o3oxLU6xuKL^yyB7v-VtFYwCMJm9feMLZ!4h1 zulFAdWJj?s$xsp{&T+6r;mK70CRNQnq8B@@EHaWcIfy!ctzGM?$AL?%5Lf)N0|R}` zfD6-GuUIbRmZ=3bK0>+b47L0+YO96~g6MTnr3(ug5LqJI!-(?)pUiw3` z*hl?w6m4bbvrxku{EW^l@TqAct*$SC!)P6GW@g;n>W!n@*noE|)8q8X(m;(lD5@P1AmLr*PA}Ehcf5f-5T--f`3|kiBg)qKzKL9x`jh zx;(|qGn*`a`cnFt85ye0NhHITp-Py{cn>X$S(t24$@6baHTxvZLBorz@nlh!q$U4=-)hQ@x9%!d7_2T_Gz5Zy4IUm+@#JMH*gfYc2lU4JgJ+ zH+IYu|56QEX{4eWP$FeekYvJkSp-vfBG7CAIPHGJ0OFTacqga?Wnofb+-xR7i1}2^ z;HvGi*K4H9n~f}Ov&@b8dkt(Wm8pq2zXOSGcCEH zii{BRRXq^NyLy;FX-LW2Td;B2i+@h4IbV(_(7D*#Cm~Yv3f^nCrJp~GVoo9z zOzkt+AZeY4l-#r(jDV&J%DFvFW=(FPmS#{*W6%dK0*_S(QeKA7L{&CAjV2NTFp^PK zFFTfkmn5|N*kPG4Tk3t!`~iyUGxc6Ij9f6WB`!6yF9?s@5Yl?I-S|m6*#EB28zpGb^G_mP}okfHbTIRIv~qfzRa z8Wtmxvq%_)c)l*Tf(>DyFNry;b=dkjT?^uxwYvhCAf3SZykT^sDJo2-4+hF7YBuZ~!+KZEuzTHC5k`j%KS@9VW}diqVf> z4><_Yj;VjGz8)3Wg4PNZS+CIv%r9~ew%NcK=V!i?KfbIaeaX`$Vyx3rRq`mr#TA;d zO%?moj-GqNpxm`6>f%d;tLgbdBG}Tvi7r#Qi)4%)$3?d~UQCe>J5@8k+lWu5!SSsh z{Wyry{c=PzgI1*?+7wL<+*2JF*}Jd0?dg#X3R8#Vl1`p3I+H_X|L>2xNielVVw$xfy{&cyRdU4k`7xs@IU$K6Zxnj3` zjodi9sT^5_KHq(bfz2ggLL-?tmZ8kG@J#$zDiG?6l_jda8={B)j|Ina)Vv*E3A&V7Z+6)?%ucJr`{-cZJxZB`y6im-uG2DQEm|cp_8f4a^`N$u2mm8y?0V zr|KP?vY zW(^BkGuPZgFpe(wYxFheMh=&R6ih8g$I)0=^Jj&)GvcPST?Bu$_w}b1&`e2aOpc=n zAY}sI_-Dzjs(si1IdDa~sF~kMxUMBLdCcUFT>M^RqB)KxQY?8zaib=3{!E9H})Vo*{ z5SS|&By^Znh_ui|6yc+$XZ2(>k%bTzhwv7IS`~NDZw5(K&IVFL`7x0XK4`QD*_tE# zx|H(Gxp5?V(RLrKv32*yvV%0dKj;>W-xYQH%V6F9|%joD4esG&`FI7k~_cR*4rPd$Y`Bc*ulG_EDSKDj1Kan#`c))c` zuBZDKs&WY{9+U!PI6Dc{0ovms9(L{t^jD?PC*cnh1*a)#6hnL}8*)o|>=?(If*NeE zTxiHoqW{=KgP(tjRCvF_Vh)|Uu&v=her4ZedDa?E%Wk$R(9*dlhgYY#QxuUk421JfyZHCs8nxzQXsC@SAa=nbP0@Dh@+0V|Yq^o0%++IS}f#rx2|o3UUW za)Ya$&3DkwT)Lvbudi>i&8fC^;`lse4dsik1#}0!7=WfhqEc^w96dLNk3U!`jBHs# zSi&W!3>!bZ&3~u1OQ6abYZb}Cn&|6nVMhWA^VUwxi2M>2V}cSP*HOYS2*6g%>Bn;^}ZNu4||7V_c&k!W5}$rsKVbsTbQjqf9UrUUM{ zb429Inb}{*#&@42=MEuPo9XRtdLC$05-=&m)H`yzdPztRKvr6>nj(5@xE5}RuiVj z1*HDtVsi$xylx9U; zjiS)G|9!_<=6ehw+zth*#f2kC$Y(ztDi(x3wj!m&v}T{e3?=~6sfmJI1S=h@zC-U} zmRNO1<$8Sw_=@i5MauBU&&pYoNES~@5Wt&N$OTrB)OSqZ@~)?gpAfM^W>&$2F{GqB zEUNz5;$k$;W#Z4ikfKzmFCjiwp&~jnBTLNSt+<(Lu`(ySoNX-D@dKw%A(YYp0UtB} zrAqPoKvv#TFvwsz#fs!65uSSQo{{heq*yfvwjx zyWxtfp`SmSn1F7jY;ymZ>063oLi)dpltGm!%=+cKFeeR-YR7}|+5t1)A^Xb&Kjuiy z6#S&$eS%ab-@t6G`ljaFq3(`cSXgGN|wW z$NR_4%j7AdRo-BI_VC?{$-DT;SDNe-G$OgQ@f|{JLn-JP8-+5W=P$Jl&dg|sLk-Vs zzGRO@Pl}GPG0vHtWZW8L!oP>GkvNDwSSWDR=HSsV!D8n^Ump!2?Uq91wrl00pCWMt0>zS%?8G$Z?>Km#t2`QNUd(Tw_q>s-H{G zoEDQzrhn7tOgSm)qv_Y{kvtYxbPA>HB#7Fit#WZ6bEVG0+joNFha4W*t;mC(u`WJ>`FvO?^vPAuX8S$uH58f z!!@@iGYzE+6cql)d&yLYr+p?h5Ygld-BCmz10>K|^YLF0|{Mq~_d>Z%v%(z-?(f4~#VQ_A!ofG3frpHJT#I@Hi-qZZ4hzh~VQU z{wkW=)^Og;d0eWRedc~FkVsb&SLI-C5w)P}{z`DJVo@lG2lKx}zI$VaJMxTsY= zV$6hNEPo8`6v^g5#Ac+T9DK!Bh9J%)m#FuDds6c!wbY3zCCvEKh8rcpc%&a4-dNUS zCQRaSlI+l5m)dnt!3>03`b@`dtO&Rz zb~%E1p7K8Gq&Ua2=v0AW;ZF-2E5(G#ZbSY~kbPiBi z+c15=D$y`vNh-siPZ`GAfE(^2_;Iz(^RmdLOAQ8EO;V?-D@TZgNE(0Eb}Vc&qCWm4 zsI@fiCPacK@m!zd_n<1+mz1gHc_q8LW*=?8l>AOq9()6NazAZ7XhFPuCePVhE-S7^ zDzh&>Wlf=g9EmXyuy@fkw};k7=Fayr!p@3#r_``tK=jsW+eKOsPP19Rc87{w)#nZr ztGRF@zTDNP#Tm;TpKwQrh6o@*d92HxuW{3XGLrqkHso}kl~H-&WqCh(S--KKud_7s zDS$4vTMzO}>D6-k9GODk2(~VEa%62{mhx<*46=EJ-9h1s(MyZ zpsaUBAe@pjig@6IOU&yb-e{s~^P!N-b z-`oPoR=PSwz)72V`X|8@=*k!0@|h7s;_XTIU+)1HP1qOv5!RIV@iY*ovnRUq#&?)m zM1htIV~Z^;c!^G9ojE=!fmn>f9`8eUb=_n3zie3v(?rX)HQm(h36Zc?8DaNI9WoZ) zMoUimR|rroIVFs4DRRvCMF?+m%s)E2-?>~EiN>5p6yG%uNB<~lppWAyz)6i_!6W=+ zXzHvJ4~Xv8wFFt3=3#S-P9F`uSoBHAwlrwCnmr_MV{Si|*b2&&9%t^1F78mqsVs9x~ zdgV{vVh~>tCH6kBIbU|p1R>A}YscYuA)SpYhMRNOYF-(s;?@ouWO{vMac}jE+hW(&F(zCeU?(h} z(4tOb69xn<8FKt^g>{Dt;}CMWDEBa-2uI?|N{xjoMo=P@cQ}vyI;@QyV${@&d>e){ zpE|LV^7GXGQczKeJ32a=9SHG3uU|j7&5viMQzu9>Zs^`Xuwk4FjdG5guD23Gt~1Dgx2-grsLJwn4pet1AFcl#umP2*)zJ8ZU+jq ziGrY09=UYNQ+x$!1)b$%buVzi^9~uZQP~F*x&9)jwCR-&C@~fZva$BVp3EkZ(KKw0 z+fS0rvL(DNG=!i~Q8lWsOmp4|pxRKbCOBzv`XSoN0uWsnm)M~A4P{~1eVatnF{)uV zBoLP9N3`|h6JsfqJv-7;z5e?AsVB$7bf3jjV|Rz|tOY-N33Ch|LEbmH7x<_Geiu0c%#{mCtWn!%oF};o=p%K-MShrehfhS*82g$+77#G-EbWuE=L1U9daQAO?)Plc*7WXv@C!{b6v3*TPw$%$)u>b z+}oa?4kp;!_G^ujx~~7lK#X!GD(CeCx1&H7`UNgatSnU>Z7DyAG~3>|VwVNr_xi!V ziq3_nuIQp{GLRf+x57+NLXo;;@0Wz6c>I!G? zf+M&Gei1pJYW@Q6Rna?bFv(+%W?^~?RyYWN)V6sl7xoGBCx}UrD$1(U*+Bi9%TLKK zIOqabC8)IUFlUpdkaLUFF;~3+Uw;VTn&@~QWu%&@qk`9q_rqyips!<%p{AIpAp}qr zmm*ACKn;#PS3^#}1Zeq@<6C9@JqZsz(Yn?BTfE%(Hba>KE|piH#)EcYvC7W@IDR1)UwfKhH8!3D|6 z`Fboc2z{l!eP23Rd{&zadccKQtFU{Dr;DC= zTB^5(j$&^xIwx#}6T?&?DmWHdS{Dm_ev71s4Qd|#U=8Db<1n4-qO~PNRP){#498xilf=K$^bBfHztDZ5@|G+|I0a z$9w|Pp1*EmfP=Ks_?E4ALW`umZUw;mT}f!LD6>_n*zvpcv6dW^0^&3Hj;r>MqFmMd zX^KDz8E!Z_R)%l8gLEq}p(npftl97~uYDcBVnRa(B(rGcpm~256HS z#m-$a7q>85N%E8byaX%z-v3Mibh+qgweL$^uKpD2IMJ8VsJ}noEVe&e6)2`vGL}A1 zaE<;2hZRWf?sk0Rx?Nnh|`@Ip}YFbw9$(;G8jnGXLWG2@`gy(sBUt>)!$EZ6XW9DjkcmRKo^F&I}G zbAr|uQkb7xn1IRt5`@u%1`|vZ18v%*er0+XbD5G5clj-EDid7>^^0RTMenJcSx9bA zEQCtr(zzF0l_NpqVHQIDdmuEr(6ec+{TN)OH&97ai(Km1Xb%Ol;Zx>gpU*HmF3f3! zreN1!lsJ~XRSfe}3E)3M{Ho!%i?ov5#Dg@BIk3`fBUfx2~MpnqHInQ{y`8 zF-iR?X02=2^ru$r%*yGxrL65g@v7|-Y^UPJ+0J!n~;2VZV+mEX$ro^DK{OOE7do5@jv1hH>-)I=jLNo_hNU}R1x^hEQ@!(k` zwv2+`ii5SY9yv>2)i!;Tal&&`v@Jy07;d~Y4~s+pQpd3_Srq$LG42)ft5pmM(@ zBE-UyhkL7zrv93OJ7L~u5KImnEb96?1QIY^b~&hZc8X!UO@;3BeTXTJP!QMYt^vIC z+1Cqc@Vlhb>p09@6yCrpQ~LF2Ebhv0EO$oZLtFM1b=OiW>8{a}H%BunnlRWy8>`Hr zzpYSAs~Rz2@6<bX& zZO$Qk#oqqCFKAbZR+X?zFf%2Xv{1W7w4K>{isIXSvqQJOOZCqC-$GBFI#Ry_8IsDZ z_gu@j8GJAzbmgZ-4X|E#zv+EmdBcaxUQHsFttyefR@B4H=oOVRDTZCUR6*1W*m^S0 zm=#GEKl|p|af9zX#JB}26)c~Wj#gWM;9F|;n?eC9(--p9gpQ=%aLF~uzdPwLNe9>i=9t?5xY zyP@ji2b=DnmqJRxJ;r>)oMurf62BWIZJpmqhKJ zLAvI%*&Tn1*?cI13Eb{!B^P(Jua->SGp5I*^OlEbrwR!TO)sVcu!_m+nc!x3KJ?%~ z+Vlm$%!_}^=!B*xUUau%x@Hp*%8-Y5;BNRhd(_1M1Es2iEx~O^VTK=;SPiy>=P>3w z5yXsSnZUE1n)+2WOg*2@@u|a*!uluiMMqEf-{XI2HD_S2-Pv+RX#zHV@xFc%$CP3k z*%D^KVg7xhI{Uw4iMt%V zv|L^SJ#L^fOP7iUb9Tp#0AD++x+G7%NZQZ$zf0TN645^D^(N#_rKPAWT==XxSJ&SJ zINLs6;1iteRfjj6gT0DqW@|K;{@lj+KPZ3wkv$xisXX7%@G&>S!$>+Z5*j1Iwt8(t zA`Ur~^Apag6CXy37qQ7l*(S0dS$3?_(np+2^6-104a0fEwC4so!%Ng^qFuuiK<6BE zIwhCWTqU0DFF*YWr&AJh3u(f z11GK8`d5$BJ`S&PqZ=Md=W*eiLWs2)ogyc579l{Xe!h5jj{7v`)HlCt?rqZ-98YPH z6)RZ`L>mS%BoGwpPL10gu$mcy@I6{2VXaLV6Vi{-EF7i2@c>S%?X>xvUw$IuT87uE zeL5QKhIDYO?Wx=M{cb`mVot{aRwB}m=<;|SqO%>^P1Z$X6iB{bHcsLOEf=ktcsDzP z(Dm|WTs-_{ij4wuOn;KP3O+fPB!01rSJ7Vbdr7|V9XsL(!|dbYBk-3Jf9T{aX8jpW z)$0qG*!l!sq5iC`2Mz|Ym9z3dJ(yGiA#8m*G@r z$xPIX7$Sj>bM zgf_=`oco~uj>EO{w@yn`MN`bJncQmyQS{HZZk%uIE=n)HB5G`|A3$SN?qbv?WPA#v zcz8}foL5onJ58@Zy+d(0=Jd8)4KZ)_?ion^cGkwrb?&^{mi`GaTKsi3sL|H&8j$Mm zF41l!zc+v|-LkzqNzf!&PXQUP5SIM+S+@b@s8CN$nfq9a0bkm{& zmhT&>U%Ad9#0ZN?&uiEPS|O7rE-7E!3@s%X&R!rju}zOOg1}3CeSv8(Pv2g1GkYLx z_KYIE#FIZsF83S%Y|?v@G-bR>r8|A^0rpq3}>7U`18r4+2154==NchImVj`(u1f$oWmQWE`|9X_G>s>9^Bc31K~g8rZX zFKp&t3U&Orbw%<)!zIk&(PKnM;|FV=N(y@oaTklDfKbK_a$6i2xXeJEl|Hgv>)sYZ9Ts;uWF$hGj`C_fmR_t`U(qn z@Zbzl*!ohk4hC_SROYO1EbAQh4`WNq4SA>EvA?^ZSXy|A@b>C;&AYmb6=)S|1*JGFmfEq~N&F%Iw zmZ-brbnb6f2sfU0?T=Wi3(eUKa1I{ECV6P6<7(sWW4&UFp{hm2`2?#42_lP(KKytl z0>2(8JMJf$Kt%FrIqwTXi!Q)DZoy)bj3;-gEQKcXogK7#j9KIhxL8pJ*_sC;dZcgYSs`|<{Zin_py znKI5C+FNyD2bmK)v5Vu2WrMJ{iAv+HldPB;W=2Ak6d+hv?V|&24jBb!Z4UZqF~19O zSqwOY0Eg9wCAV}!aL$yxUe*h6j@oN~A#aV$1reigH(Vt5Gj8v3DiFI3LAm-k)5#6_ z9AROAnI){OLAq)_pqt(yTzF63#bYL4M15_)EV&aippe>$801d~T zC;>Ejy4{DXR?U^*X!t`@4<&+L=N~R%`#&S7LCnrY6*GF#3+8{#4V+0eh+6lsi|Z4M zWYHS~LhMc;Ue`a~{#Ii?Ux(9ZxTHSZmKibufBUP2=Zgs!o=Zy42apbM<^f{w<28s4 z;)6tK1d}Z))GNznn)IY+plekYAl(gG_AC!l`m1^G!GxF|qQTL<>JXYhUQfnRSDH$2DL=aZUQx4W|y`Z%l?{?W&5ZSt)F&d6Qxg z$w8-nM+$oROVY(JyckVs_$cUlByK z@%J*RW*~xChT(<8pax2u7`dzfX3R1Dk8t4$pz;Zv8g)T71(eHGhZ_!o-uU8c8JR4Z z!}I14tn?gB#rUq^4U?~&ZF10Fk;Z{#&cJ9)y}>?R3CBg9~g5Ir9F6LOyL@^PW9V()%;z{uuAVI04p|FF-9k;{DHp%xS zmQOdD5691QQOzuWL<%v4F2JK(aM1LI?6>nEZgB1Ox3eq{2SLm>6VZIFN{MPMFf!Kg z7noIiq6rFAGE5Q}i-R!8maRiKa_mysSw-do?6aI2&N!K@%(i_8-ra1!4FbWkTOPA9 zbx>eBRL7TWX!{{dUHyp!YCmboLnO@UG+(Z3-nvm>Ee}TkP4T;6C#wWW4ATUtWI~3o zr9)P@q$%c1g0enT#u(7~`Z}=hU{y-gvjjuSA^E*OT!s9JbXDNjI2X;kM|(#Tu3tMY z>-d5r)Ib651^~#E18XRk?>GPg zkN^!ZZV~KnN5bZJQRqw@1R#e`4wfWLQC`gUh?qVB1j<+;Pc0a(WHatGbcTz(6Z)9e zY}{^TgA(|byPRiq72P9bqp9fwQZ<7zCb45Xat@+MB^U@&D<+8sWSQnIoHY>NKWWfi zR(86;F}>w8fF-hIs2*U(2`hH5dd(@|bTCkGOt1b=#1f-K?ylRf8K$yUc%?(~p4wS+a#V!FZckNQ851cIL4PKGkf^FM&ET-N5M2b?s6Fj_hi??jNNaUT26=Yk13>Eq3 zl=J!L5J>k{ZO*Kjvr`$bs}%*HJZoj?dXET9k*COW?f%RNN-Uu)X<1SkO`kldNjeEM07%K zqHNYI0x?#n5ua9^MtuR|KY#{^*AqMOv&4S+!aTa3`$O>t3+NqUfo$S6WT1fLm1wvY z(Eu4_KnG#)FPlFOMl6>^HUE`8^ko_nCJ+URK*PZ(7}-`_;xbf(Waan(Dj z%bRbODaVKiXv? zVNAY|xxPJ-sq*V)9iuNrFwph|&|hAx$;eyXAz4f(YPY3y6;aaOHIHbV`Get-VfM7zv(tNI?M2I5I3^+0#n!iYgAB*JTojw1C0)U7NpxmJaP zkXGa>+?Xc@Jv8OVQA3Uc)p8Rh5fnyHxq%|giM&hhs-!7H8e?KUMZNWlG7i~NfSInW{|j`Jfse^AJd z5xp|s5|aH+!a^Hk6ac=6nFG7Pvr2p#3Fa7JW-1H@)dB#4LcRUJvcyCvVX!MHJr~PD zw>8Pipa8hOREfuEpCBwIhyqO9+0RiC2$95<${%P~?M;azr*pGq)5A4LfRY}w*0UiI zotpbKU|V^~Jz7SNTCsIvP!i@DQ#BrSoQoxAMNk^CTV#w}LaVRpKovsUpftH*=hMGj zJPOXvhix+j=I}mai7waI$!+p9BZWcs#D;?!&9tj3kO3#eCz`G1DHC!^#}-V{4MTSI<2{I&09J`u%p6xVmODMac=cJOj)EW zokx}l#PtjX5+Ap~IYDToqPH>{FQGKS;9hzgM<~! z8|^<)P?4LSJjkd7O)O3fgDk8;)m~gxpOq^?zuFm&%NiBvq0w_#JPm)?BT>Qo4WteY z*9*(ojytO^Yi!Cd`3qmzjUM(8azJ#ki6IhsnUQ8AAtQk{vJdRPB_RpcLFw8UVwk{Q zC@(V^3QB~ z0}KKC_$o|o(7K|8Iy?=m>NTCr(qKw(AE~JyAZ-7Vhx0HX41gnH1|&X|yMO$D@j*{7 zW}l*$$_1Od1b8woI#}{&VDag>;5oZwN?jm+&_mRX{!db1L2#IT{VNFgC#*ge#dEze z*?x;7AQtU#a8%v>r3%(EUE2w!?nZ}(&2ijR|FOy1MW~snCy`G>QrRGB=p@UZh>+X> z8?>+!yZ6gvhX)`&8V4j<5)`<-B^t@OY?}@P06e*zh2n97G++j>f&*aVT-mPh%MO69 z3SQ-rfGLI}>?jy|+BCTuy9fwi3D{R*0J%mpN+V?11@uvkg>%Rhoh8*L10pB#Vyg0d zjKxiPj;OH@G*y6#z6rL~U4|k6sAY#`co`6$DOKQMslQ`~!fmT6Q)Ca#on4EpQ~P2w ztN21op7IOZH~FxS&J~_W{V5GuTz8-Ury9G)^broEPiv~8RY!;U5P`dqa~qCcMs_7C z1l8Nywu!f8RCp1QZ4owKg($6}DY`0%7;9gSqZj_3Fm{vN)Zo5l)?>~5C}VI+?=7`BQnnv zj~z1d5LnC^}(jo_M{+AChF|Gg1wvszU9}OvN z64Xeuq_D-&g+Qn1ZUfOI56|Keh>=l&sJ6?3(Fd^~9Hs2C2hWX<5PbfbEFg2-auKl6 z{fJpz;gf%jS(n?4X{+k%48OEb{MvFUAr6QAQqK(4da5>>!UMwb>^|X3)Cv($AqA5^ zlxq8XeJUe~i4OC$nXlpvCmkAwuaNH3XF||qPibe`&JbV23VAY3$_9!8Ak_n^LmX6S7R@<7lh+Q z<~b<}qi`wDoP($U`vZ`ZrJIV9W0&D*887eF@eJ5Y9CJfn-jHl{Lp-BpXhIV8#s(pE zn6n*&lErQ$DHr7AAnWU1bITkjyTQ>iF~6v ziaN$z?x9@<5VHw}>M6St3CWYj1PJlLZj!_SV@`q-i{5anu(m%#*n~nUw?@Vgs_U>z z@U8%SER9M)RnS3(FTFuyPP%?<-vkTDABsg=AiAhI-(&J{p;3N@JPcZ>{;Dp~@TiZb zPs9dLsz9o}^KB;g1c(KV7Hk8zJnYek#9gCNkm&q{ZfCDW$(lc)O$Rv>0kkSaW zeJA5w_uf?=wiK2^I1|UCL+-2D!letR&bij0w}js*6X>#QVDE38j7te~r0Zgs3;85keZcH*zla2(G-GC*IGeqcW%-~m9zZ-67dp2g%M^&IF#dwV`;YJ0!64VI;>OlSr90R zS^ z^(ivOZYW;uqe3kO(i{+^p)(v@lQ<9w3k4J)3&w}IvXdc9z*CHiOa%piFf*e%Bw6e* zO#=~&K-6fNpc9&6UahomHjz60jOK(v7(APSIPnI;+O0m_Xb0146qWK|$IhmO!>Q3V8Hac_j+67aQK>C~2Wk63y)tye$RVA>vk)fb7H~3id!NwNN3( zAheHXyAIIC_R0$u1Y6UvN^UHE!(mZ1u(E8D;r`yeheMNyMGUb{LMEt6 zO{78jL_{OXSi~0`*$HQs@L+SdRj-6SdrNw1S5h@U*z_#3#`ut7x3D5L-(37AZ@ z(l(~3d%!dy47Qmhyi?|07h)k8IIu;sW*l!vo3dbAZ0l5pf8OVIE}5|lQ?uCSYLR>CFo zZdC1BoXq?hlx|s7Dlgh8M;~!YINNKw5sXJFqTsb1lWQ)B5s``6&KrP}{c(U`yqdCV z?PCqtvj{MiFz2w)-v)*g0^|;Z`iO9DN3*XAFu^11cO+%?)A+PGABBWK3ZpM<8IC#0(KpBw|K!^YuYdB6zMN$+ZsA6k^ zda(-9xcC7)2Z@*sL@Qm2w05|W1Af_BI2d?5qU5L4E%$aQj27xj=>WZefD2DaGasVz zkuVV!Lw7{SdJmmAcg`EEay&4FfOpdAPrblk8SOhTm~SFxrO0#!lp6{iRZheOiXKx0 za{#GTa8;eN0(ncP=!cYxP`DU)MIuMhI!!rbpC!kRNWrDb5zYEk4HXGH*nPE$IK&8W z5MxqMV*_wlMAacIFeyonfXH0I;i`6FHE6s%hX3zcN7T!s%{Az^eC2Tg(%~Ld(_%5R z(gMo!hn2A3jd7-i1g3)X3^b~F22Hr0;l^69%F#+jxjL)51GX#JN@cguNasW_Cg;&aTM9j!tz1lqO{%$E(c!ug0PJcX6 zxX2nWd06?Yx|DWSVK*N%-#!)@` zC|4176_)hS-0T1WdPXYQ*nNYn0;Zr0qL>T7q?FKZ!UX_uN2f6Be}71=idD;C425jD zHL6Idg{!OE1MCysY+=S!C(51D$B4=s{t*HJL#ok-ms>Ic@nPo+CUQbAEXot}u(LBJ2Ep71J(N&gWQ*Ss z5ika+qJ)%(f7E~iCusVnZG{#8ughnWqC!NkAtc z1&`#@u?i#8MJ##;R*f>QNGk})P=FqdoO=2ruAVTI_Zla7U357-`4kEn)>LzWU1IGK zvD|2Z=7IZZ-0TSA6P45FQoXRI4f&u*x-(R-m~rO9WcFjHAxR`Z2`L)pk}T7WDAm_Y z7KtjmdDN?EG8dl6al!N9>B_VQQT@Xa1jjtXw1ndGC5jf_>E@FD!#x@s#$+`7CgB~9 z&NAJOVL)jX-4{Y#U~Y6#1wl1XHYl$Fimr(i1caBt!i?RK8xXmWmhTVAcXuEfr(G65 zif4*)#8kMH##N-#fNJ6u2>GLnsb=}(Soy*S`6NKXD_8Ag^Gf?N5`-z9#)J&`qnMJ> zuS$Wi&GtK{lnw{Zdvvt8;lpOp=onu>kEzD_l3W54)RiPGul{aFSmd$LQaaU0dC)Av zj!ZbC*N159%>lfL(r4l_=d$EPK8u(bAF{K|KlrevzFA4^M>0rV7T#_A=FtU44>*He zx&TLHBURCd+^gNe{W(4tNU{xhx%17_To1HOvAG{;KoHZML<+#P}0Ai7)YQz!I)AVMlgEcjk3wiJq3bliKz+X=ef$MnNnQb?(*<_moihEN_rk<`VB zg9$>;R+AF|scj^@f~p)N>?c^dOV>fGaQCb4VA$wSo+%aKsi^^`N<;ZfOAk{)10kbz zCn?(#Wwd3!F)p@zF;7FW26|>@@`d)Q6j^slR07(MP4Co*oGOrtJ5n{aOWj&BMYhS> z*X4$(g;Q`PyPQ5#eB88yKnnLhp%>c7E&f@hwZZh=&V*@er7C;XK3o@JD^D#%gjvH1 zZ_E@^J3np;?4ZZS4OQSIAAvbWR7RXcG@FV8Dn~(Fj44vEN?wzu*~T?Ot6A-*B~sLI zO$PG^TApDx!mP#tL|Nu(I^s}}E{|N7K8@>&RFM(rjm{|CRSzm6e0RkV)CRbg_!uXr z*q&2NfeFV&9#G1iWK3nDL~r0k)s+-{i_QH~mog1ohMWz6HvBaHw^0MzRvQ!W>Xk-~25Rq>!JNc zHDl?Hm&azyMHoWs2DenKQ^h_Q^}wMh(%qINs+R<2dmvBwcI6Wh2ND@@FVih?x&8pa zy|P*tjn~zU&uNeevAznntsR>xQyALO;L3`1L(1S%Y<1G1M6FjTo@>0Sqv-zMzRI_@rW6VV{o-XkMOX0+@t}+SkU4) zyLp`u4FC{ZBo|O;t$Tb6VjdD8D1=uIz#1Pdr)+vxGqH_ODxqS(E7}AS)JiTVL}vtw zFYiI6n2kw;nqeqY`RA;E^oFHai#V|&piWsjCu_nC%6DD?Wi+`PqQf`00xdn+d}M5| zLlMT=P+}XP^M=Ht-21>JDUF}WoC_6VwgPmAOWK1MSXKSY+g_yAh9{ z+5IlK^2!BfRZ4y37{JWxqf>XUKJ5{OLQ4$2aUK;n_oe6GzM6{^BcV_0RzPQp0Rk|h! z5di!hzCzrUoT)l8P2Sut3K0oH5l+isn80POUDYd9U#(N-z9li^yL12{HAT$g8V7NE zpztiTVVA%Q$fQAM2n)@gO{2LPG3@JNwz&a;`QiQHMCrUd?wRF(-h%$*X*1kew|b3X ztl%d1ND_FaL7}C*PCR>_Wid)be@XGJA%s&LZe<&OXte(yLH5zY=9n2uW<)T2=@b80 z3U|e!fDux4-boV~AOVvIfS<&X78M95H34zzFn+{>xJj>K`2G$=^qg_|76;}oOq23^ z3Q{CPX|aV<+OD)f1(A|=St$c8l&I0fT}le^zHl){mOvgDX3M~ajZNDQjgN~A)X%ar zz#RmYfS7&GjiBO%08YUmg)A31KG}ew(vT{#1<-qOth6Rpq&I{Mq=WO*6a{TUom&w^ z#&%V+Ri=Fz5V&y9kh@^FcX;hOjm_Q$U+s8?*W5&Kb6$*isgDD&3(-my_Zyu7CJY~ z&yP5?$1myh1-W)uxTa>YI3|8QV_8`>?-*rqru>|kdS>DH!eo5tq@VXoWpB7m zI8h?BOGwQRgCz{fM*#-hx@rw;!CbJ4VR=Cq3@q9jfNwZhWf4bL5YBAXvQGzadPjO= zBCdKy1waWsE)zqYvtwo&vr&X!x{#X_mll3uyiNA7k#ng1g0dRHQW>(0|&A~GK@-D zJt>rIQfl^#K`T09==mrWmnWBu1pP)uuzGi~#I1*HOS@DhP)M9d3`^u!Y;4dq;VmLH z4t50tw+)8}lYjAi+MZjF4Gf9|^z7x~E3<*>2?r^OPy^NxrndNg#Xdeji9~7~e6*zd zKUsy>{LuC3JT2iUQ_L?C4wgD}vbL$J13*njN$ov_VjbS9QN$qhnn-I#krXg-3!!Wj za1bCRaRbg=(;6PL&jB=k&~N}j=kRVIUDv@5tuzwUg7bF=2a(*8b~?h4vMBrpRF^9N zQ6Zec2|?xz42IINt_&tld2JMBnD*M@q-qS`qcZ3uZ64G8?S77~YSk=l%T*0#1U(<8 zK;#evkK`<~L%40d?V*Rk)Ce6QKO)zu`6VC;8a+IWJ8}eD04XHS_A2{GbQC8gIJ~D< zHcR@G5m^`w3sIB+YKUSjzgDdLd0OC3Ime=g7g-k=Z^1VOfB`qEhGM-|=8h1#)vk9O zio@q8>@-0kB3{VbjezHY6$#bh;Y$+|Kw!2u24Qe&>s&i$zL`c-XxeVt zg&$=4%NTqWYBq%|G8iZyRyiULQHm5iL>yf_y(=g?wS?d#Cvfq2dwN?E%L!|>#mT{H z0Wc z4%zGrm@}8vyEdA6A_T2jI89&cY6Ge3;%8_$2FJh6VrQ4qOEc=>K#hjNR?K8ZYTBAVnc@3X8cZ&LWJmZcc{G7hA-ic~LTen~kxT zl<`^h)c9=-IQ+(np?G)>2#RVj<;G-8xQ+6({%dh7A=oC$_#@9jo`zb!Rk&rFn zU^7P*qO#`ZMRT=X$1^Gn72%EF)edDL;)yW$cZ6p^OgNA`E?q2|(xS%k z0a6God48*;EJAV?7K_C!J{_v+?p7iva2n~@nu%URl=~)qLNH(iPmeIQjDF5=z`$EU zkc~LYP!Wd)kmBdr06i<%V7~+VOG}?3fk*1FinhDlC2=TFlUyX< Q`J5OcUgkjfqv4FCWD literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-regular.svg b/static/fonts/fira-sans-v11-latin-regular.svg new file mode 100644 index 0000000000..1e520978de --- /dev/null +++ b/static/fonts/fira-sans-v11-latin-regular.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/fonts/fira-sans-v11-latin-regular.ttf b/static/fonts/fira-sans-v11-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8ad68a6e720aa6473e2b8b69aaf8e00e08be6fea GIT binary patch literal 59324 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 S?YoZDyE3^ulYh^GM*kP@%Omvw literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-regular.woff b/static/fonts/fira-sans-v11-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..dfa72751e1ed3e1a0c84899ece0302e87d123edb GIT binary patch literal 28024 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 Zu=H+ZVsP2an!?85;sOA~l`_2m0029cjYt3h literal 0 HcmV?d00001 diff --git a/static/fonts/fira-sans-v11-latin-regular.woff2 b/static/fonts/fira-sans-v11-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ad3d10e6638ac1a17b5b970d6752d59b4e9d8a3e GIT binary patch literal 22748 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 literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000000..914f8d690e --- /dev/null +++ b/static/style.css @@ -0,0 +1,353 @@ +/* generated by https://google-webfonts-helper.herokuapp.com/fonts/fira-sans?subsets=latin */ +/* fira-sans-regular - latin */ +@font-face { + font-family: 'Fira Sans'; + font-style: normal; + font-weight: 400; + src: url('/static/fonts/fira-sans-v11-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('/static/fonts/fira-sans-v11-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/static/fonts/fira-sans-v11-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/static/fonts/fira-sans-v11-latin-regular.svg#FiraSans') format('svg'); /* Legacy iOS */ +} +/* fira-sans-italic - latin */ +@font-face { + font-family: 'Fira Sans'; + font-style: italic; + font-weight: 400; + src: url('/static/fonts/fira-sans-v11-latin-italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('/static/fonts/fira-sans-v11-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/static/fonts/fira-sans-v11-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-italic.woff') format('woff'), /* Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/static/fonts/fira-sans-v11-latin-italic.svg#FiraSans') format('svg'); /* Legacy iOS */ +} +/* fira-sans-700 - latin */ +@font-face { + font-family: 'Fira Sans'; + font-style: normal; + font-weight: 700; + src: url('/static/fonts/fira-sans-v11-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('/static/fonts/fira-sans-v11-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/static/fonts/fira-sans-v11-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-700.woff') format('woff'), /* Modern Browsers */ + url('/static/fonts/fira-sans-v11-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/static/fonts/fira-sans-v11-latin-700.svg#FiraSans') format('svg'); /* Legacy iOS */ +} + +html { + padding: 0; + margin: 0; +} + +body { + font-family: 'Fira Sans', sans-serif; + font-size: 16px; + font-variant-numeric: lining-nums; + color: #696969; + background: #002d6e; + + max-width: 60em; + padding: 40px; + padding-top: 30px; + margin: auto; + + line-height: 1.2em; +} + +body.mainpage { + max-width: 500px; +} + +body > header { + background-image: url(Anexia_Logo_RGB.svg); + background-repeat: no-repeat; + background-size: auto 45px; + background-color: #002d6e; + color: white; + + min-height: calc(2em + 45px); + box-sizing: border-box; + padding-bottom: 2.5em; +} + +body > header h1 { + margin-top: 0; + margin-bottom: 0; + margin-left: 130px; + line-height: 45px; + + font-weight: 400; + font-size: 20px; +} + +body > header > nav { + display: flex; + gap: 20px; + + line-height: 1em; + padding-left: 0; + padding-right: 0; +} + +.outdatedVersionNotice { + display: inline-block; + margin-top: 1em; +} + +.outdatedVersionNotice:before { + content: '🛈'; +} + +body > header nav label { + display: inline-block; +} + +body > header nav a { + text-decoration: none; + border-bottom: 1px solid transparent; +} + +body > header nav a:hover { + border-bottom: 1px solid #77BC1F; +} + +body > header nav a.common { + margin-left: auto; + margin-right: 0; +} + +body > header nav > ul > li { + display: inline-block; +} + +div.dropdown { + display: inline-block; + position: relative; + height: 1em; +} + +.dropdown menu { + line-height: 1em; + width: max-content; + + display: inline-block; + position: absolute; + padding: 0; + margin: 0; + margin-left: 0.5em; + top: 0; + + transition: all 0.1s ease-in-out; +} + +.dropdown menu li { + display: none; + opacity: 0; + transition: all 0.1s ease-in-out; + margin-right: 0; + padding-left: 1.5em; + padding-right: 0.5em; + line-height: 1.25em; + bottom: 0; +} + +.dropdown menu:not(:hover):not(:focus-within) li { + padding-left: 0; +} + +.dropdown menu:hover li a, +.dropdown menu:focus-within li a { + color: #696969; + display: block; + width: 100%; + height: 100%; + padding-top: 0.25em; + padding-bottom: 0.25em; + box-sizing: border-box; + transition: all .1s ease-in-out; +} + +.dropdown menu:hover li:hover a, +.dropdown menu:focus-within li:hover a { + color: white; +} + +.dropdown menu:focus-within > li a, +.dropdown menu:hover > li a, +.dropdown menu:focus-within > li a:hover, +.dropdown menu:hover > li a:hover { + border-bottom: none; +} + +.dropdown menu li[aria-selected="true"] { + margin-top: 0; + line-height: 1em; +} + +.dropdown menu li[aria-selected="true"], +.dropdown menu:hover li, +.dropdown menu:focus-within li { + display: block; + opacity: 1; +} + +.dropdown menu:hover, +.dropdown menu:focus-within { + max-height: 15em; + overflow: auto; + + background: white; + color: #696969; + border: 1px solid #b5b5b5; + box-shadow: 0 6px 12px rgb(0 0 0 / 18%); +} + +.dropdown menu> li.header a { + color: #77BC1F; +} + +.dropdown menu:focus-within > li, +.dropdown menu:hover > li { + color: #696969; + transition: all .1s ease-in-out; +} + +.dropdown menu:focus-within > li:hover, +.dropdown menu:hover > li:hover { + color: white; + background-color: #77BC1F +} + +.dropdown menu:focus-within > li[aria-selected="true"] a:before, +.dropdown menu:hover > li[aria-selected="true"] a:before { + content: '\2713'; + display: inline-block; + width: 1em; + color: #77BC1F; + margin-left: -1em; +} + +.dropdown menu:focus-within > li[aria-selected="true"]:hover a:before, +.dropdown menu:hover > li[aria-selected="true"]:hover a:before { + color: white; +} + +.dropdown menu li.majorVersion { + font-weight: bold; + padding-left: 0.5em; +} + +body > main { + padding: 40px; + margin: auto; + background: white; + line-height: 1.5em; +} + +body > main img { + max-width: 100%; +} + +main h1, +main h2 { + color: #003ca6; + font-weight: 400; + text-transform: uppercase; +} + +main h1 { + font-size: 1.75em; +} + +main h2 { + font-size: 1.5em; +} + +main section h1, +main h3 { + color: #696969; + font-weight: 400; + margin-block-start: 0em; + margin-block-end: 0em; + font-size:20px; +} + +/* `p:first-child + h1` is special case for the common "badges on top of README.md" */ +main h1:not(:first-child, p:first-child + h1), +main h2:not(:first-child), +main h3:not(:first-child) { + margin-top: 2em; +} + +main h1:after, +main h2:after, +main h3:after { + content: '—'; + display: block; + margin-top: 0.5em; + margin-bottom: -0.25em; +} + +section.packages { + display: flex; + flex-wrap: wrap; + gap: 20px; +} + +section.packages article { + display: inline-block; + width: 100%; + flex: 0 1 100%; + box-sizing: border-box; + padding: 20px; + border: 1px solid #d7d7d7; +} + +section.packages article footer a { + text-transform: uppercase; + text-decoration: none; +} + +section.packages article footer a:after { + content: ' >'; +} + +section.packages article footer a:hover { + border-bottom: 1px solid #77BC1F; +} + +body > footer { + color: white; + font-size: 12px; + margin-bottom: 40px; + clear: both; +} + +body > footer .copyright { + float: right; +} + +hr { + margin-top: 1.25rem; + margin-bottom: 1.25rem; + background-color: #003ca6; + border: 0; + height: 1px; +} + +pre { + overflow: auto; +} + +a[href] { + color: #77BC1F; +} + +a.latestVersion { + font-style: italic; +}