From a44e96a54e5076cae2361840a5a8a55d02b55a88 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 18 Sep 2024 18:10:13 +0200 Subject: [PATCH 01/19] feat(docs): Add minimum configuration for CLI docs PoC --- .github/workflows/deploy-docs.yml | 47 ++++++++ docs/commands/index.md | 143 +++++++++++++++++++++++ docs/mkdocs.yml | 127 ++++++++++++++++++++ docs/static_files/assets/cli-artwork.png | Bin 0 -> 102270 bytes docs/static_files/assets/logo.png | Bin 0 -> 2724 bytes docs/static_files/assets/logo.svg | 1 + docs/static_files/stylesheets/extra.css | 16 +++ 7 files changed, 334 insertions(+) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/commands/index.md create mode 100644 docs/mkdocs.yml create mode 100644 docs/static_files/assets/cli-artwork.png create mode 100644 docs/static_files/assets/logo.png create mode 100644 docs/static_files/assets/logo.svg create mode 100644 docs/static_files/stylesheets/extra.css diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000000..4101c6fb11 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,47 @@ +name: Build and push CLI doc to S3 +on: + pull_request: + push: + branches: + - master +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + environment: actions + steps: + - uses: actions/checkout@v4 + - name: prepare temporary folder for build + run: | + cd docs + mkdir docs + ls + cp commands/* docs/ + cp -r static_files/* docs/ + - name: Pull Material for MKdocs image and build doc + run: | + docker pull squidfunk/mkdocs-material + docker run --rm -i -v ${PWD}/docs:/docs squidfunk/mkdocs-material build + - name: Download and set up AWS CLI + run: | + sudo apt-get update + sudo apt-get install -y awscli + + - name: Sety up AWS credentials + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID + aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY + aws configure set region nl-ams + + - name: Upload file to Scaleway Object Storage + env: + BUCKET_NAME: ${{ secrets.BUCKET_NAME }} + S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }} + run: | + aws s3 cp --recursive ./docs/site/ s3://$BUCKET_NAME --endpoint-url $S3_ENDPOINT + - name: Delete temporary folder + run: rm -rf docs/docs/ \ No newline at end of file diff --git a/docs/commands/index.md b/docs/commands/index.md new file mode 100644 index 0000000000..f4101387f3 --- /dev/null +++ b/docs/commands/index.md @@ -0,0 +1,143 @@ +# Scaleway CLI v2 Documentation + +

+ +

+ CircleCI + GoReportCard +

+ +Scaleway CLI is a tool to help you pilot your Scaleway infrastructure directly from your terminal. + +## Installation + +### With a Package Manager (Recommended) + +A package manager installs and upgrades the Scaleway CLI with a single command. +We recommend this installation mode for more simplicity and reliability: + +#### Homebrew + +Install the [latest stable release](https://formulae.brew.sh/formula/scw) on macOS/Linux using [Homebrew](http://brew.sh): + +```sh +brew install scw +``` + +#### Arch Linux + +Install the latest stable release on Arch Linux from [official repositories](https://archlinux.org/packages/extra/x86_64/scaleway-cli/). +For instance with `pacman`: + +```sh +pacman -S scaleway-cli +``` + +#### Chocolatey + +Install the latest stable release on Windows using [Chocolatey](https://chocolatey.org/) ([Package](https://chocolatey.org/packages/scaleway-cli)): + +```powershell +choco install scaleway-cli +``` + +### Manually + +#### Released Binaries + +We provide [static-compiled binaries](https://github.com/scaleway/scaleway-cli/releases/latest) for darwin (macOS), GNU/Linux, and Windows platforms. +You just have to download the binary compatible with your platform to a directory available in your `PATH`: + +##### Linux + +```bash +curl -s https://raw.githubusercontent.com/scaleway/scaleway-cli/master/scripts/get.sh | sh +``` + +##### Windows + +You can download the last release here:
+[This official guide](https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574%28v%3Doffice.14%29) explains how to add tools to your `PATH`. + +### Docker Image + +You can use the CLI as you would run any Docker image: + +```sh +docker run -i --rm scaleway/cli:latest +``` + +See more in-depth information about running the CLI in Docker [here](./docs/docker.md) + +# Getting Started + +## Setup your configuration + +After you [installed](#Installation) the latest release just run the initialization command and let yourself be guided! :dancer: + +```bash +scw init +``` + +It will set up your profile, the authentication, and the auto-completion. + +## Basic commands + +``` +# Create an instance server +scw instance server create type=DEV1-S image=ubuntu_focal zone=fr-par-1 tags.0="scw-cli" + +# List your servers +scw instance server list + +# Create a Kubernetes cluster named foo with cilium as CNI, in version 1.17.4 and with a pool named default composed of 3 DEV1-M and with 2 tags +scw k8s cluster create name=foo version=1.17.4 pools.0.size=3 pools.0.node-type=DEV1-M pools.0.name=default tags.0=tag1 tags.1=tag2 +``` + +## Environment + +You can configure your config or enable functionalities with environment variables. + +Variables to override config are describe in [config documentation](docs/commands/config.md). +To enable beta features, you can set `SCW_ENABLE_BETA=1` in your environment. + +## Build it yourself + +### Build Locally + +If you have a >= Go 1.13 environment, you can install the `HEAD` version to test the latest features or to [contribute](./.github/CONTRIBUTING.md). +Note that this development version could include bugs, use [tagged releases](https://github.com/scaleway/scaleway-cli/releases/latest) if you need stability. + +```bash +go install github.com/scaleway/scaleway-cli/v2/cmd/scw@latest +``` + +Dependencies: We only use go [Modules](https://github.com/golang/go/wiki/Modules) with vendoring. + +### Build with Docker + +You can build the `scw` CLI with Docker. If you have Docker installed, you can run: + +```sh +docker build -t scaleway/cli . +``` + +Once built, you can then use the CLI as you would run any image: + +```sh +docker run -i --rm scaleway/cli +``` + +See more in-depth information about running the CLI in Docker [here](./docs/docker.md) + +# Development + +This repository is at its early stage and is still in active development. +If you are looking for a way to contribute please read [CONTRIBUTING.md](./.github/CONTRIBUTING.md). + +# Reach Us + +We love feedback. +Don't hesitate to open a [Github issue](https://github.com/scaleway/scaleway-cli/issues/new) or +feel free to reach us on [Scaleway Slack community](https://slack.scaleway.com/), +we are waiting for you on [#opensource](https://scaleway-community.slack.com/app_redirect?channel=opensource). diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 0000000000..71e2cc611e --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,127 @@ +site_name: Scaleway Command Line Interface Documentation +site_url: https://mydomain.org/scaleway-cli-documentation +extra_css: + - stylesheets/extra.css +extra: + # Versioning tool + version: + provider: mike + + # Analytics and feedback system (placeholders) + analytics: + provider: google + property: G-XXXXXXXXXX + feedback: + title: Was this page helpful? + ratings: + - icon: material/emoticon-happy-outline + name: This page was helpful + data: 1 + note: >- + Thanks for your feedback! + - icon: material/emoticon-sad-outline + name: This page could be improved + data: 0 + note: >- + Thanks for your feedback! Help us improve this page by + referring to the feedback page. + +# GitHub integration configuration +repo_url: https://github.com/scaleway/scaleway-cli +repo_name: scaleway/scaleway-cli +edit_uri: edit/master/docs/commands/ + + +# Theme configuration +theme: + icon: + repo: fontawesome/brands/github + name: material + logo: assets/logo.png + font: + text: Inter + palette: + # Palette toggle for light mode + - scheme: slate + primary: deep purple + accent: deep purple + toggle: + icon: material/toggle-switch + name: Switch to dark mode + + # Palette toggle for dark mode + - scheme: default + primary: deep purple + accent: deep purple + toggle: + icon: material/toggle-switch-off-outline + name: Switch to light mode + features: + - content.code.copy # Enable Copy button on code blocks + - content.action.edit # Enable "Edit content" button on page + - content.action.view # Enable "View source" button on page + - navigation.sections # Creates sections in left menu + - navigation.top # Enables back to top button + - navigation.expand # Auto expands collapsible left menu entries + - navigation.tracking # Automatically adds anchors to URL + - search.suggest # Add suggestions to search + markdown_extensions: + - attr_list + - md_in_html + +nav: + - Platform: + - Account: account.md + - Billing: billing.md + - IAM: iam.md + - Secret Manager: secret.md + - Marketplace: marketplace.md + - AI & Data: + - Managed Inference: llm-inference.md + - Bare Metal: + - Elastic Metal: baremetal.md + - Apple Silicon: apple-silicon.md + - Flexible IP: fip.md + - Compute: + - Instances: instance.md + - Containers: + - Container Registry: registry.md + - Kubernetes: k8s.md + - Labs: + - IPFS Pinning: ipfs.md + - IPFS Naming: ipns.md + - Managed Databases: + - PostgreSQL and MySQL: rdb.md + - Redis™: redis.md + - Document Databases: document-db.md + - Managed Services: + - IOT Hub: iot.md + - Transactional Email: tem.md + - Web Hosting: webhosting.md + - Network: + - VPC: vpc.md + - Puvblic Gateway: vpc-gw.md + - IPAM: ipam.md + - Load Balancer: lb.md + - Domains and DNS: dns.md + - Observability: + - Cockpit: cockpit.md + - Serverless: + - Functions: function.md + - Containers: container.md + - Jobs: jobs.md + - SQL Databases: sdb-sql.md + - Messaging and Queuing: mnq.md + - Storage: + - BLock Storage: block.md + - Object Storage: object.md + - CLI configuration: + - Alias: alias.md + - Autocompletion: autocomplete.md + - Configuration: config.md + - Feedback: feedback.md + - Help: help.md + - Info: info.md + - Initialization: init.md + - Shell: shell.md + - Version: version.md diff --git a/docs/static_files/assets/cli-artwork.png b/docs/static_files/assets/cli-artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7e5a6fe11a8257e8e92ee4cf67a5cbb54a7699 GIT binary patch literal 102270 zcmeEugbFcL_)>A|l0#E<*NtlNJe>0{L{OfMQ{WQXVUkBhGlku+R z06xgxD!y{U!=s?X{o>;#BwYt)du64i>#VEtT+$R~$M@O{W@66gZub`V6rQxZByeeG z?);k7-OkqDNzz^B4tR$oaE<$#{|+m7i?fZ)9bFZ5R(Y7CIjacY13rN}5OP*lR%u5w z3&|IcpZ@bWFp|0R#@YF;BtO5Kn;V~-Fdxj(l3!3lLV{mFh+jyE7r2Ah$;00HwL7o9 z)7^_n{x#2Ib0s_s_*XovkeXZzX%De~twlkRSIi z{DOP}{QsUCcvKqqt)!Zxl{v67ZhnZMG6WF>EY{cMaPsgC+pAVxQ{_0`(tbbcuFr1-bbc)f zn%NQIb0&5ZD}8Zrk1u_Vd)aEM6wJ#L({ohKV_h0KJba@6{q;W@{7(-4rw0H3 zLIL@0WBNOEyZ;jM6{0PcQoWUy8K#tPw^QupyGC|Q*X$GT$oC_+wn{!pT=StiA!YT$ zBOql}_r?#v%r_D~14n*xinCkz1I+G(#Lqb8Nt-fW6dEtS;|{(6095*XJ*6 zU5RiGVds^|x~1V&Y|~@zEs@s4GrUAiKEUV@Pq$P-_rUDY^BW`Pd%@`hK2Ap?XV#S# z5C7pd2NCIdvN{{p#Uj6moM{@_{Ed_|70z!2*^)^mdk#hg&ONN1T4{Lc-CT{nxsXTq zcI(s5*@=;0t=8M(vrKJYO44PMw&FrZ&E8yyBV}IimFD4jCN8v-xweJ28R&j22*i9cE628WC5`bq|MJ`7U+aj^xa>FIC%(V0c$fWQ^s- z;pHofQh#465`quD05;3Lq_UR;(jc5-Qh0V-`{P0WGP;2?aj=A_D0YO%(04=KXJeQo zVyTQ!OV%H4eGteZ9ZG0D>3=%`C3QB){t$Ome<51dT>gys_6(5Ei%>a|yf}Bvi%Yvh z(j4A5T+>Pt{^ktJJf!}WldxWZH^a#GQ?0E7WQ9NZRo2{+K89Y?yEvi9sug<$cPBNnN~R-yi}r{&DrjV1@|6{6NekyUvoft zXnQof<)6hotXAJEw7C4Enm=L#E|)CzR=-iLX_nLkCm6ZsQ2nYGIi*}I~wt2B|KB)55> z$GrCWu_iuW@Ab5Vm6J;p>OAEait$qf;8L;2ReB6~Gs-(T{n13_Az7ksNzW&XH{)gi!1m-hHPXhB(^C-8jW72$r+ z`T+S-WG~KYih${o!3ptSjKUSJm%}?>%pW&1y6j-bCXleHi zz;QWtib)w`7Y{ap>zeY)gQ#a`uN1${!abyk*XoL9+|s`JySsy1ilPIgyhi7#{}mjI zUy%JSO4bo658}*cse}m(W0UxO@nv*P>hbp}m6=I{t0Sy-I?ly@(%}fX1P~R<2a8$( zg(EVyzn6qp-v07RpTAzL`{BS4#NfRh@7vy=1CYPDHCwz^WFH0Ingj=20LdW*%~0Jr zlg1-(7Y~S>E3D;1A2vtwrgsKnv&{Kb^5yT?{=U*@C{j;5%7PVCB*s|7y|#_4Hy6?z zNO9u#-@?eM?{Dnn)yzoRm^yy^ma1y-3aM(~%IBt4JuksyftYX>B&f#p3V`^CZ!Lbp zF?rTcZZdEEjpU}E?b5x^xfCDB(cAeieKyyAY1A}QrQ8Bmd0T+@ut9%@atVYfMXplm z+6E6fN*l}7N1ftkipJYT*x}}MQ(M-^_i~eZUU29uMMnx?YCkyyz>PiL=NM4^03ebo z9kuh2mY?g+w6fn8cWUAIF+ls+M?A{#Hsv2HQjJnj>}D_H2Y9;GlRN`Qk=b&mj9Mr) z7^-AE-h$R3NbV^?)0JJSh4A1+9=OvL=8cOpsQ_nsgEkArohdTUFGb%VOdW2y3emRd znB2QfCAxb*%~EH_J(O^+NZwi2OQho0w6ult0Jt;KOnTN_HKpIg;K-gPn58dK2A%5G zJdqbF#Kzc~t|u)+nWl525kG|%M~@7@*0A^Ao?krsj^Z&1I*z@SGTIL^8N7K)v3k7j zf>+WCBVEeAWNkq2qWPbE5dzsSK4%Fk7R zY;baLQ^oYbWM6XA-Il!a(T`eARmnEEu^df%INT#<0AyWU;s%HUnY6)VF{G=SpB)gv z1cHq^1SfY8ROL8;;!*?XxjQYPh9l??Jyvm-FR!I@NO!&s`3ac#luDObE^IL%jcFA1iqZP_gkgK*%+ZTmPjFcC_Jv>Cw35oe1$Fi0)X1t>{a*tL z)%2LFl&s?NY(dLJM!@=3?5rX2-awQ{euWsb!Q}%PdFK6;+^L9&n@pp^`tsf!;UIOy zIpoy0lh`>g(3ACTubi>&P|}PmZIC(QVB~E5wO8XUq-1ajty)QNziIGr2Ep+XH6!~@ z>AEay_$w32JUQRCf@Ld?HmHwPnSaBr`l1}H%aGAq@u+hLRA+c&#} zBy?t68_+H{xgvG&>&chd(SWn?UbWPrq<7!_EhQ+&q8eJZ_N1LnADZq7CVe zi6{B7x1k+4v9GPj%5s>KdnPY0GFW}ty=5HwQ3b7SEXx+OQSQK%uKy8RSO`KZ`CVY5 z>z0n7TNO;(N4UV7j~I28#W>#JJe54o++u0e5s{yv+i%W-2I_65kMpLc|aW5&j>gnxWOj^uC#4!m8fm%*s1a}bk$kD zPdb)%OgANLYf?ni#6B94VhmxCy|KVoLUa)8^cHGgq`CW-n^gt8wTpP@NQUP^ zBtLQw5*4ER#a=F0xCIJQ(kWt$R>!# z6^78}UxTIU1|?u%9)c}Sa=we@hp#{fhcz+`pp&TeWFUx%v3~Zhup5p}s}`CETU%mJ zAD!?`_xUVq|5Or4opBrbCL6aJaSz$PS*tAniWld?1`!>MQ=4BeH-C6~vf(pwu|>1H za(gGXLq9HPZ|c8laTvr-4M;7jTRfd$rc}DM-m;CPGrNj2}kFT`N)YqasB%( z(GSXx<@$1XYH&5$4?()!K|5v=d|YaM+hO+U8j9=DmE9=wx9V-B7Dvov@CO~rMr@#A zQ$NFbFX!PNIP03WO5pj7zgYnCn&G!ln2)`^t8d_`2CQ;@hPPbLqHd#*fm>m1o`5X<5h&3+}LfQpCA=ZYy5tTDX&s zkrs9-HQwqg$PsFBHm^8AEk?`Kx~BL|@5?qA){Yoa8?0iYvhN#L9v$e%-J&qcuFZBI zih*<5&pp6RhDRU>98!?&7U+GveIZBOo)5)zn6w+(-=cZ0mXUp8Ur=se7Sb_3Ou(D( z>}JI8`#`s2aAvK4XV^D*lS1ic`3m4tr}RN?g0qok0uFcTCE9qO)hIv~C)Jrd05e;uP+hE>lFmBlHRaHdfN!GCBk?Bw&)q)|uS5{_ z@d(yPX@+t#ev5$f-=J9K+@Or8o)BkkL~^=NxrQUbdSEE#&EgHN zrRAgScUY%ye^Sz_5R332`s+Bg&-W|It%;TZMP`hg=ToB^kGxp)%fPnI$CXR^c0tg^ zoRN&&g5?9k8v2YsgRItELV1FWfj-}C!Y-vIcul6NCQytN_Le_Cj}mF@;SX`4Sbi>9 z?Vw`fAG>^nor>u6<8HN8G;qE$#r`Br#vvZFVitk0&#FRjjL9U)gTCy~YXTco|EPjE zdz#G}gN*-`;X-$bT%AgEQ%y~B2kQrCXIa}T+}EYEqC*wxUo7Rt>Se6iCikx%x_j@h z>*`A$S~!Mr`j@fWIC%Ca6{S>XkI=1Jeq(UhY+@Jm`e1(U{#zq{8+2Sle|EYGs&smW z+-yxP?QCVl;oVOefa6;p3^BOy1C+>>75^dwq0T(h_oVl}w; zQ${NGQ!Gl5x$BB9K8PNET_=v^?)E7ti=aYo^w~5rW)xSn)FC#b@;A%Vtxw(r=GduL-!fL>EOqi2uS0Cb=+v$T z1pBkC>2H4%lh?pa?uPS*Pq6BeIDK6Ng5RBOsxbGGlYxSoA0fvyo@UP4^0Jv7rNXth zAQ{iJ`lQRsF!^Pb2)^Opi1a}kHAA$E{V0;<`ndN^l&BUg6}4mN`Lg<+u@YBWEqoOp z{fwiO`Z8Nyw$Jy}PoH<}$S&B}4g|~5Yi}=uw!{=)*n4{O4sw8>#JLQ=p*R+*?{Z9L zNI1Q?`KDcgh;p{1|AHBxM?i%~7!>7Crhdb0(^*pA&%QUkYy4B8cxi#bviW<%{r^G>wsd zqeAb!xgL`jTp)kN0A;P4<5jsRGw%A03$tRIFFa}2^<~~&Rnx|ilBh_+- zVSM5eRIs3yzDpt16gu>CciDew=0lyxQ0^fKk8=1}mH~}ZNkca%vv~e*00;KXl>^WT zD5u>C_JyrJ?G)Dvm8jbP?vmeojIXUfRbGWD7p}GPEK?|@{!0I*nI^-C>P)8~VKL%` z4ND+mfPMxWxN_qPOH1MKH37kh-#Cup`9A~v*%CAquQvh^S8+BPNLVtt;>$#8sTg>^ z*~{g07VCpzm?6}q#WrjR8nvF{2q{TebbCWGwV#%hDjZ_T{qZNnTbf)(wWWbDWa^bP zcQr^}EkD3^64#qCUjdeBtNtlNcsAXK=V8rQ$Mu)F%`K&WP3$^VM1J-`BKpliZIvX( zn|;d$nAA9|WY2^h;u~c-;*U)`qlsBe_?9xTpm9A;+L+-Nty=28N%9sT2@s=QkmTwr z)zq5~e|=2Y-#$3LD7-~X;Cu1z{1wBka-2?13eFu;$@Sc_ob1@485m?W z^o7q-y>%S4owC0dvFCZ5(X<+9Kh{_YRUymMLlAYEDuvizS%@pwxC~0hA*s6Nc8c3W zB^=G8=yjvyN)mMRMJ%uN-*rWOuA|szZ5Tf9v-vowk$d_~h9%;9B`TjU@op)#Z}dnC zY7sD{cZrVEZ zBkNxxC3Ht}QPAtl`GZZ@2*~&r-V)$@;mJJx10^1C8m)7ftvBwBFTHo?kqD)*@wf;W7)CoK2KfVcGM?-os3@9gT<<$p)T@MubKsxeJY2U zBak-tY9XaR7Rh*yyZvTt4|;p6dAs>Pncu6I)(|QdFIM=&(Ad@e#nh$vzPbZN|F=s$ zgO&3#Exb>YCSB;f&cg$P&J zS$pl%#>3Wr!X2zs;|e|E3%z_7*$!+E)9Chy~9zl#$Gf z(;}|FL1$w^lw*#Ee#6?QFEj{1LR8}*X-P#LCx&Ui!IbC-evskDqfk%S&=<)cN_8wg zhRO>`{){EhNkAq z<}(f-rmm8yaf$SRHOb-M5UUCd=3c68BSK}wwyXDaQ}QR0g&zIkeU&o5goa^is`r3{ zl56*_vztCY?Px&{(;fZ%-=pze1v@JNEZ+mh@^|;?A-;}amh)|aoO`QWb=+r1ko-T? zf6^2n`QkYLL^dQxR02Nyt7U|i70R#1ym_3g8P#8T>OV_^*Q8-I@4iCx=~N|YhGT@%cyB zoRk{pK|x4*!W=b(@8rYO4yE<|Kex5%oIdbTJZ!i*O=^yFGbiuLsWf;^6SL!jxM#{g zb&Es}6^-wwz8A|U4CKPT>)vu1biK+GvF_)=o~EXI%aHs0>-qNnZt5B8AlT1nMjg2t zeRw);?s$@n{B-$ruX1&Su(mMY#t)USg!D+5NUUet!i-0jFnks=>^1ICCU=r7N3Zbn?#qZ| zC-=11EKb(gvvuFeoPlxL0pTueITim2=R@q4*$&C2PNI7p=cTqMIC+WQ0m zXscTjSoamH%cYa-bSNAL1}=O=KglUthNo(0wDo4KOTlIiMWbtaFm)mK1SsI>EZVH3 z1BTImgLsR%wD#9Z4mHb9?h`H3?Facq*!4HRXWc#XB}ERs8dC1@9fXhG^;DOZVKvI* z@@zZ;^N_F#FcF_?fXg!b z97^NjipVU#Ms6TBxkYX#^`l?kE2pD*oGvBv^6Gy5-dt;x9jYI7m~U}d!^5C@6-MKZ zoqH4(&X1{a@(4269^OM%pNJ-RizEyE@I~TWtZ%X(I14KGUz_UFHyF@^@k81hznfutI0*@+ZkRQ;bl{+%Y!|n#s?3 z6xJx2y9M-5d)GxT@>Q{1KAQS~W7QB?m9pwca<2xEDA55tXdOq=g==*S(XNEw_D@ZZAqf*`1J zkPlXLbc<@e*=B8@)!{2Ty}C2gW>pOO^(1${nL4>T+PS-S)ZeGVt*9l<rGNN!UoMV}BUqrSe1ZNe1Q0QSpMM`E6 zZr(~cxnBt*a)jYkpnA|;we3QpGk~9Q{*2v=rb^l zGT3OHdaCJv=*@NHR!Q%uMB$PbS{8!Gk54NYL~lOndVdkc=Mn(|`OLjj`YvwGNWc8N z&8ldj$G3{I;<+kxvZlTzOh&AGjBk1iy=qK%lfM_wQU8);-yZ6Wd}l&@P&7?-Rkp=Y zuKr|l=jPu}{YycPpf``_KM$k?8G2KaaC#L*r`{c|zxn8cT9G+Rr@7tr@{(G_%ihlE z&nl8Y>7)GsHC|pLGM~bbay^=XnI%Mgc_ca8WiyW1E3GdiWj=h|v!GfZ^XOcf{(wnW z-WC4b#!|TyOdIO}w0E45Q40r%WX3}yk(}IGmVlWaFFDACqxJPf3%fnXzbC>Qgcnvm zx;0lfq8;m-x1=qu@7pCJ)m8;b$s5%5`FXYH`-_zSX}h_fFE@A2ot7J+ybQ<-P}3#V zy_25M-j-MCsH9C5YUz0>T5NYyq&_9iR&yPW8n=Z}P3b(VM7yR}eoa^}o()85=(Bhe z`W$%OU)1w4xcRC(qGnx(cNCW+=F$YVD>NgehBNzS>}dg*;zIl9j?v7l06mtG<#w(m z(OU?sq9GAX)MC_hUQ~V-wHMp4U3vzhsAl%=iH1JEREVIlkzC>DQe-da)XKdF!dRUn zYQI)orB3LII(E8x6uAxLyUMGb^a}8I6Zl>U$15{RX{)EAUVN%V&-E7SNe*4B_4NtM zNv|1LDbf*sM4wd!Ii0Eioe}jhK%Zl=XC9t7%vdD|W8yt;LG77~h^H93b0kd1Tk|&9 zr6G9}$tNhGz4|kYn{A%A-tCmfuUA=jTlsp8G10F>iBIKBczmM&}1PCsXbf zi~=PY*=6u5b@KutYb4+yJu+XZ^>(H^H3X&Vy=ut%c)NeVs=y&vK?cNE1L$vPH4#0ElTH3A&hu8!?^>aFWBQj8!QdIkp~ zjoLf*xb|7JWR{N2q_2XIIswE(Q)fZoHrPel{bTO z1kUr3gA>CZ2?LxjUl~>W-4zjg6}Kn+IEMWiHJF&4&6Rt7rn3F!vl1m}SgsSqy(8fn zQRg!soxr{=sP(nvvs(3XT2ni3^Vf0gp58x1eI;g`&?gsdG0bqYI~Mg({9DDr-y=$V zx-869%5N)tO20G@CNAZU0WFC?ms%#n#lJ|h`sF`%sU4N-HA4eXt&Ay@#y0osJUcs{ zQR!Wgr-nHR^To8frYR2A-m1$Mao2`Fo@g64@-Guy21S}Rk^>M8>82LZG`)ZVl!%p_GR-T{fun#mk;gUZ|Kj=+TBz>=Z!&BdoF$4QuoK=@8{@e zmi{xF4lrB&Zj?AkOy0NWe#4%)(hudBFx+*(lBL(R0gKsK$WpkR)FV0(RbNt;p@L*( zFtb8`Cn1meOd)*ZtiONf_$ut>lUsL6-R45RDdM*E6%fAoF^VMzT&}B{oafoB-}RTJ zEZC#39}f&V$2_!M1Iv@W;kC9oWy)sx3cpHs2dY{R;44X?l&ryl1CevIm$rOkCqzU-Qri+{Suuj|V`%Cci;a+0e^rUDg8Aq> zHC-yx9GuWLqdR2?QX89`vmrS7R}SJ9kVtV$iXj3M62FMGav(Q|~jujj69QmTqTX@pafJh&UuMIQCC^MUSH z;h>@ry&zwOqvt<2?NF?6SVp|xwya3D8}yP{#}e=BkHN6{_`kLpD-jnPbrIs}7$4==ISv7nq4dHU3KjmQd zbWpx7U*G-k>F)<{oq;a8cV+ zz2u5b0wcwMLHY}Yrc~xs3hYZd+toPk6S|}Y0i4hQNCl{ev? zL(a6SIb<3oI`cNT8e|*7p3!;h-;qUedi_nBq*-S9DCQ+ z{^?p^mr-30(G#j47u*Z2!r**l^4BH-umzr$@U!}VFZpqz>~ zKvewCZY#NTBFc9Ciup}swfR0hWfVi_%PDneTHdBNN@hNc7f)gF!;FC>CE*2iYXJ3K z;cCNz)V=LrM-u1xNXkLf;+};Q<}f@Z1Csdu;jYQBHKPrMsH1UM4x|e2D%{NeY0vaH zRK{SAQW{sg#AUoBu&uF#$I-aDrk~smGWV9%X9wa=(G(WtdwD(PQVKGGi!B|P`~pVP zh~*Wvy-0M$#~0BL%V8mxr=zfLEl0|^{B!Og6Z zUpH}HsX*I^j#wm}PJV~-<@)dHnh@t(QwZy(^lDaciXQID?Cu3BjNJ38)l?{|5T^T+ zZic+b$K&}s0~$3LJC7>~;Q7Z8#3{N)x8*$dI1Ug=6rx^N6Noi@GzDN$1(}+p_qUF= z(t)baZ^fKHUd8>B%&{7Df(C&iArnhW0# z`Pd`jQ$L&2iWRC>G2)ZKntnGS$X$ba`FMGIuZB;^sd(Xvt$h0+m`FiHcC5DFdI8u*4=qogy?zCp+kLxpRH>o1b486}RN1jC! z+ptZG+`1?%v1;O9DsI;bMS<{3OP;%YX!!J3MNR6L;}x;v zUUPYxa}!ZwvwD}%^NM`e=N+3-Fxr-5)dx6WyYzz^1of9cV_sh^+V~_>=AG$br>Q!H zP=%zv+B;ccVNuqi4=*7-vd(X5j65&iXZ|~mUut@g$Tz|2d!WW5;nsZcHaQOTsTt=Y&PA(pevlP64C_b9@z(M&?PVV31=$(MO%>O5bvr1!oq zLqMs5QjG+}I_&I7-=ei6&HXb{|G6at*)L{L;Q0VERkP~A4-T4$;k!S%cT;BSc+3%= zaEv^4vYH1I1HI}`Q}^NL_BAVq?_oYB%iY^G-$f2%lGNsY-9Y^wl&zA~X2HDEJ_{01 zOxfGb#Ko~%#eiG5gzy6UvF%HDWFORMFd z;?U!mg6*9D+paG>g$Bo=pBnf!id6V*@O#p|AGPs^bBxqP;`h8>sR;g!)5%9uZoVSfho1Jd<^b+QjQEFNNnaV`O&N^J zyfbo&4k}uUB(Jt{6vjsA+!-b@zd!8|4)W%|8yD2I{9g|jo)z~>b9+Hf^1nDrqt!ST zryJdGFN>2r)1O^F-^J93opvnUAVE6`JG!3MSBi_=US79_LMxD0@BLFG3Q|HKeFu0@2n_ILl*eiq!JTaUxIjZ zZmq>uSkZ`*j0CiUjzFhjZ+Ar9g_A|}yzGyRwQ8N2vSEhs!-k%P07kM@i-Y#>hORvV zv_0o3g_+Q!5m?H;wuk1Wl@JP{zrU%wxJ3B9pLWkhFKwbFl)G-{46@09=-6@X{-m^M z>}J;>PTH^Dj#RCfuU(du5x7Y~U_~~G_D6QvH(;V-@EcMdZ9%swzvucPAVu#&oIhh$ zTUb4wlym3<^Q0L7h}*f}y=#DzhR;MmDUZFgwyZ&L6e=+$k|h80+EH}Lbd?#5L$3g_ zm2rMXRUt1@>4v4H*^Wd}DB*(#d-eVqnoNAfz0>; zOlx3r1N+r}Um-oXA!>G~C$BGk*`?bwok{c)S6adhgUI>guZ>G_1@RLIjvuq{Q}shs zDMNE?R%VX6c$=0F$jU#77bY%Q(v9AXlYXn*D9HTzUkngu1zOm zarynpd+l>XtfN|lb!u+VboIji3v7W`i*DVkP|Q8S2pJA#HE(Df+#UM7)>FM9hyQ%< z%Yq=umkz$5cZ8sb^Z@R$l%>)$aKKGacTy0vHI^!Ej0{{#mK9Bi{d##7*0|^L0{P_# zYKkN8p_|Y0SmAE&yTofN*PO`1g+=s)Rt6ZY8}lkftp+T^mGlQFUL@5oud+Yf8MiPOrU^JxG&ga$q|PXBWDDPN@JYF-@Bx zYZ3o)jivlWPigGEG?Gio2VFLGl2Mo6#cdcF%BS+ARc{Zg?9E_4XI6Y0i+{Q3>0lw6 zGb^t7K)Ge@B`Pc7EHB9hZ(R`PwDR^V)gp2iVF-MOb9SL zA^Gq%?2D7nz3*7a;n&}!dh^Wd)-xqcw`$H^$7zwDCSX@pm7*?#s{2kZ-@i$+%6Uj( zGIBZm@=!+NBuCx83`?ECx(;T7qpotF zfZHOS76ran;uowyAm4sVD-}~Up8cK6{%({9N`WtIRIM_@1`X@jNzt;3Yd+2zJKn%R z7I${CueQx?E$Q>uo3L*=eZJ!&^CLM02J!A!*>agVc4nBG0j`}UIrQInrau4R1d4zv zQ1p~aS7ZbSf&|qEI@J1ctNp`td?Lr6S9)sh~6`UuiWe!UVa%`k>6r2Q}+8gb? z{*H&dQI&XqE~GfCH*?JAs39f1d#;YGdRU>T=^cjz*fQ?tCl5%=<%dzYP{vQL@TVOX zL1dM7Km9`dug5cq95)uW6vnU z;V!|<>C+WU+8*be*G;y1z3!ReY$u>Jz{@);mf&@yj=yulENr|?ut;M^4U*db!_&j3 z_{DRBZe?Fr2hqbTtHM49Pi)dziv($73plOECAQ<3KJuxc+-FDEAGk6kLRq{b7+KYN z&uF{??q2Lv9I!px^_-lb?RiX*`6i(8csTJ|2JBz*W@b-zn4 zA)g=m@I^4VZ}kUHndl&t~*@$mv5ormj;RW!3OGgDNiZj6DpEOwM$nS zAzki_d7Mn9e;{4A3votT8)1%3h6ixXbI-{#^@r*W7-VF9_`dSU{KfWdI*HsgFNc(K zHh!Kbe7R~N3c7hTZxw;=tlNrFV574lyD=M+xUGt%f}Ya|bwS$M{94z^`^KHedQ%6Q zGLMx~QoYTGzCW+HZ{C}|hE-NeHqwdtmEEQ#)^I5MH?U8eA<>@Hjznzef$Q+RGDa$* z-XBy~d?H66W!F0uNe`|$K$Cl=*EqkkYNP(aTGGJ*_VBEQ;=p1Y75#x5D7J|ROy^pA zLQ_R!ni(tx(PxXw86I}UERa6Kdl7XtL{I_qoxD$?u=WZyR?xGjnjr__=l(C-h|my2$+CQj=N zo1I~tg^zdG-)@ZUOnt9%;l<9oU6MzxKj0Tt7#T{OpJJ%>yLb_Xh@1_mF0#HU2kAwl zBx0P>x{x>Fz7$mBT)2gawq&2;+(MJ!$vDEZcw1~;ONw#`R-}?ep%YeYOo_LR;7-Gz z?+z(YyE1I2teQIcp63PYVd6!x4;R_j1BY=gL=6}FZcTsk(x%`E{j8a8!P9gr1no(ba2H2%VRYu z%M@AmGY*}TKRH~B0})%AK5KVL+N6dZlz-a|4Jf=V1+#GKasUYlOrkFm^TCWv(ra=i z2u7%KZRNgX>G>`TgdKYPThqa2(JD&5B@s4K{

)piKZY<_h|cN zq20<*)8m8phQGi{AMRb6G&P^5_I5B-W)*Kp{#p-fU?!8D@<3g=N_K?JXh}l!z)4hx zffm+vVdkZ2KKc5}6u2sK#IkPH@62{$;touwac&kSv3vg?@uUaZIuU7;X1F3Vt1*RE z2&~auY2fGPfQ_V2rOFdKC3^bobdh`E#W!ruI~n1q8{N51B?Uk3=m*kn zs*k%BV0mz$r{l+UaqXe(^E^D~!Q)m}Z{E$H@M4RM)5Y}@Qv%QAh}#44T(Ui2UWHYi z6rlK{`_UvIP8i_J(8BY_F;!G{Om;UX$`f~_?TeRO)Tu*tx{g=vR75y@M)n3KtmsW- zUNy>Jc9qQ~*q?qkwq|^mrP9bx;s#;EV7|0O1y=8$T>gD)1+-*%1W#y;)9UY}MYH49 z_?iFnS=b7;K*6NC*aKC7m91IHp-f(^c?)F6Ql__M?IYrsnu(a9@dE)b94Jy5sg&lL3l4KL6q%h(H)kw~HFHo85O@;V4ZR;1TWvNuxe|8`ITMA92nEIQ@az^?2o z9u||X#upw}X!>ikDhL=))^^eU`1#Fgt@{5aV$iuX!-X|}p5-i1Samm?g%!;id^F=6F2&B3zOcw5ezOqH^blm(O(6Mr zp$(C^3hrh1$&0ru>*Y$H4#hO&y(qRRwn40`=!6#hbb}06X1NGl> zsuA_{6kOTf)6491Eex4xFjhij_u-wcS~Yt z;Zx_Q%`-ntHEs41^t6*@3}YmChOaeGb}83 z&!gz_RicpMDOHz-#9scMo(QAs5{9x;qHDGIgr_3|Plh8PXQZx|zlm0kDAliR^rYOk z_4OS5?zyJ0JsZN#2@<^?2zXb*;@*J~fa4WiW-8gpa$g_=mYnK-_+l{OX@BL!0!Q!q z?3pc}2Lr~)(8$n!f2DTZ!!8}utCplM8FlDqwBj;Y(qN%lk`bTLtDD^4x?2f*^;C8c zxuhKL3{ISM4Uiwb7&It~x9Iu^V{T-lv!3_uXf!r$jEod&1^gPo)%>D*?y07oyxrh?3Q;CG@a%uMdz9yt%wPmzAIzXLefjgb z3y#3Zo*#4&Oruu_Ed~8itJZe`)AjPg^C8rVdN7>YRF+$qz>T;uwmK(K5O0!X& z^hFCK&3$5^(xO~W&vqZzC*^ig|)V&U58hINwVAGK1>#_M_p&D+bY|Dtm@{?(Pk31EJdry>0{Kqzw!{AU#xttgXp28ZUoK3IQZ zQF|uh#&A{FE%#@w3UU_3s*g-qx!Wd&wce_3|Eg)7;?eJaI{H^Qc|Gt^atF6jzk!== zm#?RNQxd0cjWaK{4&rIph4#q_*R#~#J2~aE&h(1-LKzwlHGgqY&Wx7piV^ha_+SR| znWjxijylN==o>}}5;W(JK&-m$PU2J$iSU!`pYrD?w_)F&yHFu6mk&d8YusFXijJ&p zTI(UbnI%=@3x7QWul#6TF|@q?)X-fIBky-ZfMdVx=X{hxmSuj#CDc%@ebzNZsZ;(3 z2ENwKk3aL?-*A$i_i%bHw6uAS`Uwlg=F2gXJdiE7kR zu0>`&Yt>${EL;$}`X!&!Ed6Y@cSgpcr6)`f%tn6v+P=v0){!rV(~E4?=_T6*wA~@^ zJ4FN^nO$TpYJTnpA6Z1?GLC4u0o}@0=(Bb&6|bFoEu;>{gQ+iqSLJHV+;~dS?q{_r z`oY~_Xnl&~EoGSQ?oGgq5)%6u3;pxj(`&$U`0!Ba;w_nT0xLC_oKG(%2DZppuF9Tg zaW~w`uUB@QmVL3~2c&n-QLxRA6bGY?-6M+?{0%_&WEZ)E@CqwVPJx$6ajyO&{*Z5= zB`YLf^?OcYQJ_EzThsVEbGUX$CUQ{rR5DFg!q6HS}sQ*0x)R!cEWh~l5$Hd1G9}?tGRADrIQoPSR!F{#>;K6@zlhqdl ztR$j1La)8bHFQ}uPsHi^=5|~sw7R8(b5Q6{R1C8a;83;S}6p&_y>Lis?F8ZMC-5U1b za*=*prm0)GN7-wiZ$d^*3mZ0Wc%T#2f(CLksRo_&!h1rmo_-Eg*=pQ-J?6R){=-97 zdRJ{_|7I{x${YdERTa4VUJ@Xl>_Sjir1-mPVj z<#SoDiRO*FE%l@@nd{F?MxtQ8obMw$>H=y!`E{v2^$FRA2QeG)o{I{QIu8IZChgG| zb+i$JCRTXUL~r?s z*S>a~hIJ<)J&0ca8H?0Z{}tjgEErJ*<+UyX^|W{7y?wq^bKucjhjiY?Y&*wddjC3Y z9HG=+^e%KfV{PI{jD^GQ=uw-k*altjpjzD^ipF9Uap|X*e}7;ksIlAgMQkb49Y-D| z6zV-g;;^n{%eaox$%`MJD#c>U)ls??IPDysrxRilLRk-}H2**Me_f{5MxRLdpH-$O zN^EUBS0+7{GGiT#21$hljSIJ*oNYn`i=+boXu+1xbqA!cmY#s{XAS{p9ob5zr}0nN zQm79w3f<3w;6o-^$=R75&vC2A7k~HP;FKL3PX~P4Er^&D_k|F~OOMwVRg@CaQuroa1HJ>%zk6&FDNZ zzgViiQW>};BOoZw)O+d4HiYdV>w97ykFpO@QJ4z^zA)sk=w4WTegw)($eOW8$Vj{q zUlD@%P93_ILYI~yDfc7+W73{?V|@pADjgr9DHgYs{nVmJlb;mz%d3C~^1MLWCdPxq zGBA1$w|Nw!gZlCx^-DnXzx(xaa)<)CJrf*Cc70x8QH{mngA+ODvmmMJ@sLtTC~UdU zbg1V$`D8;w-w?zz_Wsq<#l{PPW2fyr`W@tqt~N z7-~If=vy_D-zu^=%x4*tdqo~$d+7A^eXRF8`L_3|aJXWu>bad-dAckc-cg`~;^dw; z2)vU2AKt6xm)9NvUDxi(=M)ol*&)|<^!_AVl-^$Ed)oi-b3(`+*)_MRz%8Xqn_7Q6mbarz$x3`{dK&Yjx}Pd z&HP7p3LO(NI)rfu;L$d#J8&Wou3YZ+=bSWABbI7L$qIQZ4^( zG%;Z);bb4hHJZ4lohSmvWUixZZRc=H_JEN$*%YqcaTrF1QKq(+dwSYnNpC~*8Jy9v z@6wN__?8djgdS518Wp{iYFcjABth?i?&OJqg*wG;p!beg zbErG8QHKBNxD8MWpIvfy`oACf0yG(ct~I3w{AD9T80kz`<7`cZ;lYW4pS4aKqs_Nb z#~;-cNdq5T^ffqTrKGzCWQ#QN9$sW>qEQ{n7hf%OHTIB?&Vf$kF{cgW>8{U zIAl*@mRQvrcUL>)h*XyfcO&pi`xYeB<7po0n$>?^<zxLc!B$;Q9#dl06H|)i%}I`V#sAKxwlq!e886X;Sd*Om+KrYjpSUG7ZCQ;Y zbKw$=Oe1p|Ypv%8R`FSMc>3i=YL)WryO~KOc#o3v3ALm~<okvjrEYP*^@fUe<(ULB84`&DENXNIFHeNpbqCL4=EReD4FI^sXG)6WNL6O27K z?qN9}w!@&?)aKh|@%ZdVVASEoW?v-!YqhUjyQzNFKVY)T${rN@CfY}%V0P3S< z9Bwx$V433fucC-6EMF0}aEB%TTn@4IA1VI*gFFUeoeax6ruomwe_;H98D$94s5xi0 zI^eV60Jj?!5M8Q8C}6ZEq!yLL=cg3bKx{$JNzM^p43^zpj;3^+mf0zG+kw;-*1m&N z8S4qgbb2N94cde6fBoRPCfh-y-CLNP-VN$4pq>7{8xOQU{lu}&qSJgFz&!(6BLlTs zx_yH-yW!MDAoT&1b)ILajcy@GbAUnIHF3C1TxFvG{97g%k53}kQ_CKKRrWy37FZ{gLT25{nM7qPObY7538C0BvRcnd%-nW z{v>EAUSlA7ay7A>Ji(bEtTZh4B_XBt_8sWy$i-jbt`+miIk#4&mf;14jN4UPHz0Q@ zwvp{itl}|ly?ZeHLf+4O^X79b1upM)dhOgf z-v8Ssb751zE1lis8yf0p-eZ0*#RFLs8PMvxq-nuk8yUEm_8j8>II7~X^zHQ8-mmu8 zq9fCQ)~D|*??2nz>RX(@{qgO7kwXWT^6h`{l?E6)!d}@WcI`>!=ZK_!T=1iH>4SDC z#cH&!hWA0y!S!upds8A@Zb0 z^R43jWi72XS5D&n4Vf&zDAo=<_tH>#BZ0b4*(F`W%vh?N7Ja_3nX$MnXTJ+MyG#_4 z3lJM~n7%))apr@+BD&}Ti%rOifGt8^Rp0yIVB|KtXd$}6e23ychoh}c=(tPSuVHt6 za;`)JUBU7s)8VqKTzx^h?53F~xoM4z|dQTN8pNmw{J=H3$%A8>(G>rFX}bhpx-c3^<28Q~g^5$f#kJI5rGD#5Cv2JGYo$PMjtjY}WA zA8YkqL36!A&GL)w-`|i3a z;Ww?vbVh+;Tu)x;#BXvXc#pRM2qhS`nxJGFx(4$=K`k(j*)?`t*a6x{p-JyU%l z2&w0E*%QJWAoeG6?@M}{^XpLeG`6*ErGV>@aGpnQetY8l^3MF zx5!v;&5zcf^xlrmU>+ME|B$Jjp0IeK*l&mY>c_ooVw#p{p9PUXDGAD!IU&IAlVg_j zST*J~$ld<>?SzBNmTe>Evul{|TWr1dQ|{)(fL_uSaMQ#8-N`BJ5Lsp^P$mecpf#id z>QaK)7+*w)9+qYw_RqaZ!VD-BRUTKFNIYBwA+=0|wL}94iysZIu5I(2`;}OlCvYQ@ zZG-%rT`;I|rj1G{`dj&Y-RsJZRjKA*ttJ|XsULNJr3mCszNgJ;U_X#v3b01`>k7x} zs)gv(o1SjX{K{_ujiF$O+x?hny#3%#m<*2^xJ652`9iGZY7we^gIH`J7Mz}3<0U7F z|HRfOcf8`K;l#{JwOdxUo8Qu+$;bq^>fbrP(Q=aE*dP@PVpn_sp3DkF2KOkb zCF+#5s19D^A@yVIKu!O0UtZ?c7{hN+Z!GYF`AMr}aw=m*WBh7EaR%lx^a$Ol-ZWi$ zpcS0Awquz}d@c{Z_w^L)zWI8#IaCA!6DpT=JnA{eEqq8UcE)^&n20 z4M1b>2*rs{hiXUqL{-478N&kEpg#avg)V|Zrt9o5(kzVCx zgsW%&iXF>+zCiU!n&S>ipwSu94ke*G`bXwi2$kasYDGSXMSYUp+$YM=_}g&V?hClr z?5M_}4#}A>+J`U(wYdWT&qzQYUg# zl#7%OvO4N823b`zv-WXstZXn!P~r&h{8nma;gT#D^49olc>v5pYf%p}3|cNFT55=^ za3DbmC+4O#n|SWV9Nzqicii}j5V$Cq?h38n&8}iv{0!|EuWd`*z^7oSe&P`6Y_p)f zL{pX!$MNkD$M^WNh(K()&rrRPxFma~`qUM&ziEN7b<3Ref<0(a_@80>_Y@UfXogu& zuA5?9bWJ1bkgKJS6HZ|V#0r0t<1{bo^3LWNq##r4U zDlMduw;nbzmy`Gm)G>5 z{Qpi3COuwBwlv?{%Q>hAg_=@*Vlv`7*hnAKIKZD2RSC>Zcx%e3wbc<3Le)o1Z{cR) z(-k}4hMo+a9#~8LogVMl0SDFG2w`2B7rg?~sK)hZU*?_4+Q8mgzIR|ReUc+4TY!(a z+c`f!h7wdCkz$_MJ3~f)D@mmsGfIMWuxTR(z^%qO?55f#bm`Jd^x=|XR@T5}_r{@% zY&bK7dg%C6QT^Ao*P;a&@YonFU`UL10Ff)jRz0q8?8>&cW~5}Sw&>(U$ortJGId(? zEU6)*_34AXDO1M#U9z*aDx_#om8nd?R>ZCr^ic)Ne5A_UL`$h}^A5zl)iuB*yS%dO zO+9{Kx?U$v8B(7wadg6h`KWORQLYsfx%f&{YNIsCtt-K z{$toSfR;=-Xh;5aMX?+O&A*1Rm<0AE?S}f(ou;8u9(15_gL+Em zH;XOalt`1sax>7m)Og+RD#V;miD~`0|K-o`^S!;(1#LW-2-s{uiGzBPN!Uvlor=0j zx3611alc&m0*%rvzN_Fz=vVtloOZcxe?N}L5r~x=*JEZu;N+B!^ZF%8)QA}*=)kNu zR4ZQHZJ8mX^9^!%)ajUX!>Z&du2lmCaHmsRkPj@7Q!#&R)XBgy~b zL;0L0Akz#(^7;Wf??otn^E6FnnGk!S3t5G}89I0pV&rFA=Dah<*PF%s6_&c$b@=aD z%?-47<9r!*(k~T+U!If=vcoQcA~X{q5tU^`rnmMjWB(7=RguFR^#Teu;up#jPSIZ$4&VClP8K#`$;D(irjUkn6t9Ed8Y zEXuFlG+i6~Gko9wJmvTKzj@O%6E>{5mWRQ(HW!r((lI#frqTH9S97A*26_gzOaD0e zK7N~@3^~AWcZv7o^U$+Uow#q=37b>Htu}(%ywD%}!#t?Wz%5cF)GRRSrd}R<`N75A zD6{#h1hxtC`5}y6_AMk~r>@TP(Lpea`{8xf#{cT@`SLR?Ju(3M2n8^|mi~ddZpkkR zSw}}SM#>&9@8- z$T*a8U#~I)AuFg}jgM^D==@3hg)m?rdC}-ASymVZB(kpNbuIBpc}^Q=8K?Ncn@(3L z?0hqW7L(g$?K5_`fs`LF2As$%9k!skUDwRQOQ79XPUDf_HL3lLyh--QwC!}>0=$-5 zmM~-=WV10kAO!JzbguY~s|D3EK9C{#kaFrXf9k0xdZBGUbcF|nKuGaSPk~tyC&%Ga zeE=W-h?iGPEt7Z4+n7{S&dam`D(TDIrYjCA4L@HK=<*=9Tg!Zmw{FSC-eUk7;g2)T zy>&3ldK$-I$R(uI`08&ZjV7Fdw|&zN*F_&ydQ2_ow~cR1N0p5b^vYO$Run&-o(|qj zZKU22{m&VMkpY8AuIHj~kcPh@+d{7I1Z=zcALdEQIGmV}Z?9j8OjLe^Jm`CErh}Le zvW_3HS;-(S{~NG`EGGs#E(*v(E(FQ%2Wb+G$nh-+NN+R?Q~kp)xs~qwsD-bu(N;|a zrsdDJY6dIo&B6XfqHXCX60+mKK4uTax~O}nDl8frG+)YX)l%O)H-U2800r~Ns2Mny z1!4tCdmw7w!Vt5jBn2#;*l7_2`ox^`1AzaC03^XgmgWpNfi_~*hd&x8eW*e@3MMI(e~PEOe>4BW7-C_)MMFR$<1%(;=d1;=E#lx`dMc78Etob;2(0NWpObM z#$Ln>Xpj?+|1c263UsLDca1Z9$c+v6S=fmE?#LWIgI!J@&kk}}78waT$!3RGBj1># zXWWWqAG=xLT~N5$i|_Xha_w+$u~(6KC=htYQy3D&3{FF(EbJ9_0^=X#f%`#tEBYF^ z`V$oZrqbRJe15}7{M@pww+}Uwpk+>%5iJLQ-!Br5o*Ptl6`zo|j?$Wp7Z)YQi^SeO zVzRU6ehSx;{>x6C@rrqL&s*HLen-zZ_V!`#gbLAO2WYVqw=h=w>+oa{y)lxJfTztX zEM3v~Gw%8LOev72-^C^ISG~*c<8mMEDwRL%CWCE0AJ;#4h;{w2!#SElS2{z-hA;;X znEf$~&$D-1i2VT$pvmWN0>ImcnqCJT{pvY)A_J}%Onoq3=Y@Gri|?;M>~H5Lg@ z&>B)LKl|h`oq?z!XCG+m;^=563_1twOS8`w1X_8*a$xB~Lqg!q{o10%dcvrpKwX zm{nbF_c{VRG1{{xYoNXU&yI78NoT$kCb_2yMIENknw^*V1j^)39~7R_ zb0I(Z4N74>$WE;cje2*@x`74&EP{)tg`FmK64OHS> z1TsaQRSeCAR6>5pO(I>4=j*@oC`WpiYc)+fy}bV_TPZ}5c$soQ;W(`@)lgnWh3vJ+ zox+P{9POO@xH6UK!&>5=!tH$%cp}rkcuZ)p*(;@!^}HuLTGqeIofQJz2E1sHQcWia zF5ctT8Jald?~ialN6(T|j~2pG8mB^E?CLTuD`l0!n9NGel)k*QU{nRuG zsyvO=!SBa*ORbxGn10`2d^S?;FVL>1kLG$YH*L*iyXHLe(x<+WN*wak^3%#@q z<}8CJu|c6`%(B7=^GZtkyzzjF)16JDzu8o*49CZLJB{B@@t1wj(Qm^8#T6kAJy$zS zf2)So+id~Q$KJJIOK30;rAIHx_TKWobssiSo#(mmAU zmwwO25kI4D`m@HhBp2F>K~%nrr*pJ8oSQ11!IuTuT^`sz?v|sQN5d9z*6pP4w6fEv z5gY_W965Ah#RjidSc&C3MTnkv*IF)%UF|X=jG=*i`nSJAH0h8f@S<)7{QfJ%zI66! z8OJe#=h+CqL_PUyH$5vR%lrl6LGOF^uRZoR)Sjy=zPEJMU)ZYJGgq2+HBw5n_IPsD z(H_0ci$BU15tjA4YFTKXfQYC6FmPIvJH+-P#_gf!MY{#%2>xvg{B)#9fP;_|+rnRU zOT(DJkhf&Q(}_E~QE0h9kL{3D*Jd2E$x>3Z%{aYR+gnu$_hZQGr3V&E*U@{B26kci9a>hsg1E=A4FkxlMp)EsH zYZaRE&LeA7&>XZ?H^Di433D*d);$IbYb37!@nkgt3l0YgXvGcOp&9u8LRc{`(zER* zDXu*0UiBbyDO}>y(&ncVMVcriQ4+zI;-#Od|UM z@A=NRW;EEk;Z^^d47138BtFiRMJMMZd$ltkv?u|&OAn}!FJL!jXIE|mf3guhzh9e< z6+CVMY3Z9RRhAdFO!*%Byv(2St&ctSLVjLWiMFAj{L0RRK9=UcOq|~5#TiX-CB@78 z_~16le^wjjNy}CmQv4a?s4x_R1a-!ypg*40e8?gRIh&xR2wqQoKBF~w&-CnXXdpc4 zh4aquLbz|SeOM_z*`c5PFNP~?weyWT~txY9DB~ryE!pR*j|K#K#e;) zD>SFg^ub!~FIxP^_rM%Xy_hSVHUDYCz#LvDy9EM58g~Z5m_P#!-kUdwU|dg~G7+=_ zzIUo7|J6;*e7l1_crq!+T~%UmlXPt@RP`G+}?*Qcggs7vlCpa zw>j2rq^~<7V(~B6^PIxi*bf>5TN|77jK54tt9~vw2RZ30R58l5 zcu|jeRFv)@?zZCwpVUM@iw5hv?sd)V9wo@561JP%!KJCQap^(=7Hz)Y{= z2dF7MplbJDETn|0j^3cD&LB{1-;5a}AZv;ZqdCpAQVi-IDD^pwClOoT1x0!OF+Coc z3TeQ2F*9WSbH-AS{Ox~c!IFw3SXqBg$B+Cl`lPMg@!o_nJ>^$5F8kt|(AU3REaGhN zvu2G?CW+ZGZm0ZbCCF?xaq+oO$HnIOkPRjUzK}Z%CJQxR68ev|mrU&f=Q0TV`C?76 zow5kJm1Xu#Ki4&)njb2k=(S<(hJMh@M-4Z=o*wrR5MEqs0b;?*hQpFC+{hs4c7z|a zgdwQ>*NLhxGJz6nDu~}V8``^)EU3Cju!vpO5xTRZvKtu@wYBx2emBl8LOAi$Bgu#N z`I+BWyO~zUL`98^M)Wws4zi|4RF-Aa=zGfGCMEya3sQ^0_Hx3mXzpXALNKwlm0#dP z=8oz?dsWnfO?$q?(71L6!#d7zV7>tvN|!kxp)qFWS(RIE<}z)4Ac=YJKD)09vz&@oZU{D{|QGK@sQI5#M5 z`4$Zn{xxXSS+kU%fB2;sKvT^G+~c4j(!d);4G&fdd`=sPs`7+qr?0A*>M?4$Jh$_E z9*cQLSw$Wr&&L|g^(#G&MB|IIKuJp9x@MU6tAI|;$U^EL;-pN93HfL)_$RlG%@HE-_HUujgW06A1|K3d zNKFo^ia`6pAJ|r+kuL!cCdfhX8WHiT8|WZ*CaT@r3Q}zUZA;xpMeIKytQq|+r1_KO z6@C1gL$mqa+X!@O0KC@1+mI2>C0yq|MpRn-2|^MBv+>Z%r7Y@w#28x@4VSUw?kjQu z`7oaFFI>J=4x~{KMz1zVC0A)G?&oiPyirK)*5dhCRL~*6=e{VZ4l%xafB0rzZ3HCn z+&q3Q!0i|w2BzlUn030*XG-*&T7BOG539U!c5tvY^?43}U8)KMxgB>V#(2nPzIX1o z1cZ7*v}7V$Gh&u1Z~CYq0zZu2j;lBZCcx264jyhyHaNS6HJy1%G_n)Ey2S8yEj^868pcH=CbLD^T?cuqw@Rr##!?opQLoW4sY~27|8jB! zQVY@Z(d!0j3a|>?^HO^LwOc=`^n*pnT^h~iB1Zkiy?`ewG7GOu3{iryaYE2hhC)N} zsacc0dp?n2NI;7!>_0QgchV9Qt)EzQc)i4}d+~1W##%Xv#s8}mrE1IDx)UGb@Nqh- zb_PDtz#mG#1|IGz0Z$@v6$b)!cGfaNL4`GKAxGsjsNYE~kRQY6y#iiJ<^lDXp(d>pu2Z^0a+~Sx z62kX#j?O;QoDy2S9&wO)&=4;FPd!Z5X3DKY@GCTAyRW;(h?Gf5{kHHMBc)WUV|dHV zNwz>7b)1f+XG9b!Nc-U7@fXXMaKYOddcRJu2E9)>4H~4}7oUd5ZEoxx<R{ zYAq`3te%{iJd~^|d6%O%P?e``sZ55-@u#-i@BMH@PBD;*u;pJlj)exm-Nx%pmddmZ zX(Uv|S?BEdzQzF0(*$Lr1hF4{Jx%$MtDAECM{o)pM;tY^^<(XyVIOb*wz7~=oB-xT zKOj&GDfydcM)T-dxIuQpVUu_KA^1{FvK5sd6JnEc*r~Yi56sf5QCB&1vOL2_>&C!j zK@n!3q?941lh)!pz*oSAl+`JKYd#dXsygpsC#o*Uwysj)Nue&Ux^xekUhqlS*qj06~ ze@CY}L^!umR&bOG-Nm5P-FNNd<)!Ks(d+)jt*+%ApKgQ?YYBJd%n*sVuCm`@#O3%C zeA#*1iTT#_fUMIhA%T!g;s@YQBYCOKNC~-!vlaxzhqY~{k0Vb)l>1X!KIFIzCVF7NLboY|`ON2f!wn+5VANWdr!R$_>W1stU)Edry=pVsb1?lF^Q< z4Tl#gU(p14YmE(X2IRsBa3hN#Xl2=ui&TBv*)WC>`>|n@1wFLmUyxomNn4X0x5DUN z-nmKkrGGAg$xelPJHo^(daekwyV2JAU^j>2LuV?oudcymx)?uMF^{8d*?R z`4f6^(;I{|)gZtfTn$qN-Xtod_qXyZc8bakdiZMhX}f2--ruXnvd7bD_^I6w-(r@$;*y zaLre&3q0OiPd|S0!hY49XaBIj)uz%3tk{08#nigk*uZ;(+Wh#?;vJ~`8T|MhoWIk5 zDfWpuRzk>xuh;p8wg4s=e|FsDr)_%Fy0i$%i}|!1S$sJwcdzL-(K$B(STAUpGLQt= zu%!a%D!Bc3UVGPBznM9w31$+zBKZ&8ib^q1{aB3Gs6E6B_OA4;mbl_eVGGVF5Qg2~ zg|-u8q4j~KZC+;xu3m_OnpFBubcjX%+zAZ{+vRaJ7w#GoSW#tw z{71EFI~Y~B$womT>2k2eZi#0wLT_ZKSxi(+Rfnl(%d~dQMkFwcC+~p}^BYYf7BLGg zb__8>mR5@u4%M=Y4P5FuG+;S@GXuWz)^WLokR&f=#CiKc1oP!?{WS^?aSKHg$c|bs zAO5rloMH)JN_8Ao?h>1-5=3-J(8pRrV5`oJ`V<~0gWli2(@FdTrF^!iY_kug8{BfM zsP~hF!HU+7V+32@}a>T1*bV zhrBl2*4Robkt)9!QG{WqueWexwPX)J?jT^|N#emB%(&BbX9btlTA~@_r`K7uWnUFh zbJ;9X{Pt!;-@rlKRUp{&3}79_S_$XgJAl8W;1`5?wx)x4@~dG;18F! z!p9=R_Q)IH=~Y{zb3~R>Zt9NJ_*IOO>^Br~GCQ8Jf*H-JhuZ3`ehL*mb-MFYRI2~g z+(XBux1k5cv;aa?2SPEse~M-tmcm2{h}(z~G@|)J1GNJB=N2&NJFp_X&tP50J<2@QP2mXMOrbkt!_%;Hp+=We|fX@N5hPf4^^k7N${^I*-UGDEY8chOH4+qYz}T@{o$YH~(P+@=Zy@nymZ9<5mf zZe~m;N`5voyNgKci+==vgcVO=c+=Gp8KH`cUPj0;HvgRu3VhxlBlNPNr`F#h;*5ZX7;i2Ybh2fN8kGRN;lN5 zUflt{IoiLIJMPY|2QFjz!G{Fei4t4pTqKFiUt6s*QHKi5-h^&R{(g-VyZ3e2bA`Hi4zy5s!p$2S_^htxDNKr11T@0EE=Kk}hF}4q zM$9%85tc;Ew#+(vQ^D=w+XZS2UE zyiZ84?LFr(a41=)8sV1(rLe|j>1lAe;-Nv~>G}bd zM~NH%ag3wH1l#O1(KjYSMvL##3JxBg3+Na)JU3`RwYTw=m#MtkwuLBTV~^d!jqZH& zU&PEc`gTXI?3DjqO%7xeC`U@c@6Rga7!q5SfEXR>ZV)MPb4+#ktba744bLlyAhTIm z0}1ql#R*dI5l`n!kG{q8tT7b{m?X}h7Wkdihwy$^!w{^L&-_amcWUoV@(TsB&M3*p zH9zoi)JvLs;vR-h=vBJNeGr#6n7_=m99JT~CXgdOU!=N=M<* z1emomM>kAYn2+pV3*lJQUc-Wn+oDX0GfO~xrT+y;ojR)5=alWN&DLy&+K*}LE%$K? zYBRbcL!2xtxy8(~1pYRjHHVbB{xeemaBV-S5G145YLwMDwC@lpeDX%UN66BV`G1v{ z-~Yz=gQkP;0Ts_$HEcvDpmP(P6jhtB$6Wf}(7fQ*^NgUD`eks#42mCc}UYa)BYLc=Z;uy*|}m!+eVR7Y{Jqa)}YRDJNnq?H0y42 zp@NumF36ebcZZ6OD?q!^Jfa|sLFZa3b6xXpbf^}x^l>I?31d%g!X}Kg=N!fESz4SL z{U)*rb1DV#iG%Kve<^-6K+$L9#Dn#AHnoVczk(OgEE$ zezqumv$ScLczMDM_J!SjMn>~golgNql1;h3{j6(H+joStVX0|n%~>h~n&%8&c^?QoD`k{+p$V{dYYCva zW%i{Z*2=j?1(0<$Apkg8)QMUMh%`AmBXE(~rkOQmIuEq<@Kx&yC7MuH?Gtq^^dlJ^ zg&Mg^ODT$h-XFP3FS}cJ-t#zwWckB7BIT7Qp>5SF^ zuyp*2fKZw?thjO9IS0hCqD@r)KzkAmRLz&}iQBVx_ch*p{PbSo7!VVD;w!XyKM9rw zEgbU@<_Y5CD(H^WRw$0wthw!JzH}#3;hwBPBqlG^WfQ2VzVP#3jqMPawdiVC`>;5m z-;jt7(R}E3@^%lE|ErGl$1;<4SsPppKe_ZHw(1BQdGW^%z1Dy|J7_1F2+sw891rkK z;^f?=goHGIwJc#tD1mclB;*nl`f3Ef@yMh4v8Ky`TFI{#)wa^4b&LQfDOpo`n0X3> zQ3$g(A?0)cufR<>9ZO$2*b{Xm`@TiG8QkwqiHSdXqVtBGg4`N>{6vO}vWtC0^1*wE zp$x&1)f%a}Q&m?>fH2%#MtP2BH?mlqo^O|kFcJ_FRm6*D07i2ntDc1Z;!!P1fabOR zs{a*?RNd5XpTRf(Y&N3B^5Z07>_oaxdM^oy%z1KJFe64S*b~!O!B|$9hH04Nosq?v ze-?rfAC8~#Heq@tB{uDyf)>>B^kiMA-fRvjBJrURPz`1D>8HlX%~Gc|>*`t5X?G&|Hq&{X-Ca z>)s+U;Q(2F3x=9It7M1?UurnGak4DZdbs>cGuKLoyqN9&Y&i~-YDoz;xk6#qz?~eet6BZ^*wn2w+q}D5g?6!pZ zR6yF@@oqE&1lRv2WP~MQpaM8i5^dquLv}&@@FjQ6h4K*5D?@BE)I%K7uy1ky3qVJ! z-{7@@^;_(Z@k?D0S4h-H1Gp>KAtvw%D%J?@gA6KnzTpE%bpzODb~ddiu+6YAt7C%- zU}~C7MpBF;(v4y7s!Y)meEX=V5*a-Sej>JTbeFI~5byk0Q~506#Tzpm?e<6(J9Adm zdD6F&-Ij+PzEHeCs^%xAk=CS=fMBps2NFK9B^}p!t{;(Qa*^CzBmu;rk4OOX`$k(O z9k}t84|9yMfco6{FbSq-Fuf6uBA&2x4OU4QfH>xWn=m7A9|dc#iCC%|igM;(F3M<$J##&PlUJcQ5eN=C=!=Bb4Ow6DDL#dg)p# z9~XZLrgED@3%Eb#<2+9g?OsJ9rRIO6$(q7D)t~+#J4_kaU7qW(nHqvh!GB7 zi$_MCcLzDYFmHnlzT?#e@f8DW5x~iA4Z_kYo0{;O%ML$$?@n0}etiR6@KBt8G() zD@ssn(6Ko`oQe!tmUiOH29D0;KyDg>a5{ju2XO`$iC{N?!anse7oon)2Q3x;eOS7_ zAaFx%Zo;SUSu?D&Pt@u}t-XXqFS&ODIQQK?RFAwQW0KXBubKoOZY`H<>)gP@xUdF6 z8Qf9SL>@%OH?SVw{tbt{i&yKmlkyOERKlqtB$E3s>K%T>ixNl=H2w$LSpl<^j(tFJ zLoIr!<^5q;7#!GqkZV7Z%8+dH@C&FV<-NOpW7(?TDiH)qGp9v9eQ}`Q+5zs6{v}YB zqjfLd9fqJS%6y#SP6p&fBjrmc!6r2m^|=30xLse!Z2!6xng2(5fW#rf+GYosJB_Hy zCRW2a{MFw7u#i4=KBsUm+90OkuiDTFyX}9Sa_I#VG)GmHTQD)Y|6CE~VVvVM0+<-% z($4{dO^GbdwaSh751zjAmFE7|;P zl%4YG=yQVkGE?J>7fl7{p; z)xUwDtvqj@PkI+yJ>!O-85a6FoyOfpBsCdYe8r#@XYVx7yVvrmfuF+!^=jBg_|aaD0HPo`S~EM-|>zunf(CHsha6`rw=o;7D9t#rfPY zLKb>2r=$p%W}{f|*9{jaNOaa!xW;g_fDxe!Zw#t^cH(#1A0Y5bqTlE|IwSJz!=toq z<={ou*H?Ux^NJHbafE&xl(^35k%XI?pi6G(P9sm7Tc+6cAxXEF6gXbVo59(ar$9JJ zR{P4_+{3kst4q9-ONbDpCLvhVM;93c(Hy77U08|7ol|gd$i0dqxufzL*a{J#^h{)< z6|fL)zamw1y4-%=n8LsMgU|PzBkt^+ybh*%>liZI;ePpwO=Bq98ZZ-XGJm=hQ6`IT}VSkRkuhIl$9uqGe#>QTyA0B-a zK-S4RgS?#?*fAm`_-S#9ikq9UiX6{vGjmID4@9Hw0B8ILusKDYoo_SbTLxNNK!VE} ze(i84KLkHw(@*W27V+x93S?yO3eMZ?hZ8jgU>yNr2r+Y-(;36xuR&5zUt!k15A9l* zn`=_0G4ciImO+Lh0!z!>v@5%It1LUIS!h=3FWSNJV`!E&L6p8<$v%2M21uLqd`2q} z5Ss!3e~BdV-8s#B=@8z6rZ%`|eeJ(Zvsrzu!pp|FS%niR=p0EZ*D_^UD0G%zn;kg1 zMlxO9q_5DnCKl`HKX2avj~)f_?E1uM=yIB3bSiKz2LnmvhI`o`?^YTqtsD&i3~leb z(*wD(H0@nveO)4So#IoLl$C>Y@xpx~zyb}Gkk2brx8~`UTDr+A zYqWQAm<|ubW5AU5kgqewPr)#LlX);y;93msT!g|EXLhHl_v2J9;DLH&_!@EZ)bU&8 zI4}2=?&m~pQ(1ol-&z2i;f4GYv{ElW`aj(HUK_k#<32OvTAwJ=$PekY-8CBl=MTI{L-0 znX2H&dinM)X-bk#6#Z@SZ zvc+HdJtkWtNl)(q$K0DuXMhXpmv+0D<}l|+8)3M@2}nnsOn7vz_?$xhFew#WC52fV zof4J+I0IyB!wKLsl3Ri)$({QRfh_gszx!Q~b?1aA;QKN(=T575I5+(rbUN{ zBfZg=(yD|28M%WLH`T-ta4hbQ1fRR^GirP}}*%;}-PauPKY~ zZ(09$Gj#ximi~!8DOHI>am-cL=i|d0?SUs;pzE*5r+Y--b)0b+m@UQD-s`De*jJOY zWYxVyrL&&522)DZ$D2A~O&CEsa}Lf9d7t`KIf=_0R&yV=%qtUK(X14BR3U0zLu6Z5 zUQEo}cZ|^kr+9T8fGua_sCW>~pM@23K&rAZe<`m;Swh_AS^)HXYQlb^{1x)Vo&*1>RA0w-56bQR^*-K>EJ1}Q&#dfn++s#&yBmZLL3^}G|C>QAF+ zhY4+E-;E0*-|##&pe)@(qfE{A*qJbThI>`d`NpnRQ_5?m)G9m>@pM#_LyjCAukIKw zG&o9{jefaz9eS$+>$*w3(KUQTXbTDaC{;JbrBiO;WWE8QUtsn;QNc{QTsw7v3^mE0 zI~2;^em^^!mHkrHNt&>h9N%~Jdz{w)Z~W;UXYU+6OG8$x1Xu~FoPwiR&8fS2bF zwaxUvb-TazjQO6FY61fF%NiB-qX()eE-+G_-p@`bpS1TBUs%02)I$7qP%cvF6uTBE zJNxasX_OU}7brfUY@;L4i#)Wx+!3i2w^e0~-AhkTdWm;5Z*$^u-}iB9XnH{$?1G6+ zjjcFUW2`t8a5b8xb2GT|YqUD2cL@jZBY?HuCR5(EPHx|!EPe)g&ADBZB?so&037Yp zk72-oPZFMblRmu-I~RN}A^LM&)p_3Ng>D)CSe)9vLbD#-_z8*Cvyz4ah^rbs0uyt8 z&UiI7(r(vt@4-sC!dROWUw>KjbY)XbbMA8!Q>s&AWewnFqyp>O=SDb@6CKC&d>juT zT}yRdZ;K@{{ju1uc{NQ~1D2f{XCk<-q|mueJV;lh3A_7)>Ihnx?hS!eJF6pK|lSNA>Cjj8d$~rZY%&5nu1FE3Jy2hNFukQjDW1JYkM0hb@yPJPm zgtyUdz0?(qWf0q>m@TMt$-j`v-72|TE3vLM=@mR?HE@3CFzjTN5JFd zlO7?lhA);^GGANgbF5tZ`QaZ$4=&yu!jpC#(LgA0+?}~Svv;c0p4Qv#XO_F9GGa*Cbe z?4|L{_7$hKPH>+)iu%AU&7}e0J%ydUxaaX_b)&}G#BcwHskaV`a{Jzg0Z~e%K?MW> z2`Lef?(ULKK|*Qi8Cq#2m6R^&7`lcI=`NWe9eU^*;`huspYwg+>zcp!JbUf6*S*%g zVpHBoD+uj?pt|;A)vAT!ZIB!dd;fn``Yo1O{RDMweA))cSvRm{O2~8jaJjuvb{0~0 zS`V2Ha95;+`MGjKyCq$g6|wvSF6Vv^mOC0~HWSbID2&hx@BPn{q+KH~VF&xko|nii zBq|AUo^tdK8_br^o@OY9?z9RkdE;ObkEyi-&-mOUllItBwdtW}^#~MA@2a!*Y}LCv zO{*v*T-7b*W0;vfKF47~kQ&U@_}a~{dT>h5iFgrj3gLQx0sM3YW~0$pH%u{+wc8O4 z0!u48GgDzUmQ&m_1NnvYa!uW}u#=q!BOXn#L9qu5k|cnUAkHdI#Xm|yiKztNo09v2 zYK6T|{NZouzMvT>-g+bF&oI4hzI%H0xpR;x2bPlAPQD}hXD?kSWV03r5BD<%DelmV zgDSqHvx8kHh51{dC?c)%KTl6Gt7^>?6(KvV-hW>u!ZdEmattGvmfNKeV5A5d8(&QZ^xHboamGmd%{I*6_)528xi~I8?6w8H(-!lSTQr< z3K{S;Sl~{pq25)BWPfZ@pp1l5#-3*zr>hu2Z^6AJCUcjbqjCeQ8%qO(qp-pzCGI){ zU|XZ2!;nf$=L8C1xhXn-HhG;jaZCLsRi)An+jCTK{4by85qu7^(->s*39d#Uc;X5o z7k&-yZdCxZN7dPUvbd8CC>LbIo0`&%U031ad1-B~JpQJ+jasQC1NQZOjUVrVJZ%qS zd&g1iPpQDNV}{4iW=2G;n#NR!`vJN{oRQMxyV5?{;sV?L!F5e~h+iF((p1%PD-`qr zmHs+H}(|12@X#Zn|x4$q<_u6An9mQF=Vt zDa_p^?2Po0MoLN&03IplchN)yL|?3VuRjV3bLrvS;fra>F1rnFx075?B3(5hCE5~N zHnV0@hC){iU77aCxNdHkqLOe+3nTp^EEo9%^4`}lZ{MsncQwB@*hF}#;i6bP!_F+! z?tJ+GU&E879XzQYN$+E(CT|LVmw&#^Qc&s2h~@w8x|GB8|DfSzahbydG{Hk2fg$S` zCn=Jh0IwEWEjOY{ePFg5(l%wcnd9}&%_W*;>U-im3=HY zt-!PE#Kf>4K`)|aE-C9vyBB=CRN3S)u>k5F3@> zQ+|?(RPNU5zc0Sgg0RJ!VF99?!U3Rk&?wy^EsPQS#_#I4($dutqX2M8XmOLRUF*6G zPR=?uVFxy1xIEi0vb=uwJJVrdR{0VQh+|u%*N>WHvCvz*!F2dw`$j8lx-ZzwUxot?8cj<6b*A23>{|PiA|r_)u_C8;w1gQ?CrrN3VRIPfYE02x*9)j#4v9A!J3VyO zgw8vn8Ya{Am1{0e~WW_(0qf6Uc_8WS-FP$bwZyQP?I*-o{~-G^b66 zCl}sRPf=8>lW85GDEjKLIC#sLVH2h=8vx3CeV2iQa@w0+6o7peUys@cs6ev2W$pW7 zvtAb)yW_V#GO<<4^Rv12rt5%7W~IffK&p-A2$O%^%)kJUHr%^{S_~guRzD{Ubsyij zYIC6Y^YSHNM}hHjE#kfTo8$`|&w`qcG`~#|-^%yX^q{u1Ou}#T;r$*e0kIFO z6M27kpWOFT{_yCeZ`G{okCzy{2xh4de!khW-~-ZjSewW;LwG$3EiBJQxKW;r-no74 zK_K5)`+DslsU{iovv@JG~SXc2J~TaE7$u|w2oO^}ed4iDl=I?TF}3Paa>9yR9E z4AFbDQYW~8AES*WR92H%_w~1mx};#TmpS|-^W-|@JPb!h1#*kyy_O>5zDH~NcGe`R zYP4nMX5Ieg338*Uec+7ls4mu&jWoS7U1(@ z{O_XQRNL#uAiCy1kPz{tthb)(Gl|N$GiSBQ7&g%%>9nW7{5^R*Tve?04GVZ0$ z?P8x#HWkrEnIe;fT?}ho$fIs=8mUFp2?yTQ0RF6{$qWWZqB*?oB}^Vyca5F-LsKu2T2!{rE&CW zZG1_@DLcKne&oqQt+C#??LIW!|EeDoWYMSdg}=k?KybU8BMOrHKy1-4R|_$0X|o;_ zOeT~&nu7N>JZw{Oh9vf1kWD5&9iFKTP6fi(pXdl55At4$PC>j%9v5VYmsMSJ#n zqfKVq@81Ircmv+;MN(6C2%ArQkX)m;pa$I1x|GOO&u;G0lOpXp`xWYYK`G94cea~t zrIcWHQ1br$c7}A${g!BnG%5_lJ9|+AAI`Wfg*%4>rnM;1t0oS9fqq58-YvGLqt3`2u z%dYrEJZ3PCckmP>7O`|#L1w=Xt-Ik728ss?S&tF}0|B{Z;(d82mo6}P>Tmhh{9uaI zS9XjE9fShEhG2{wc(dixQzB{ENd1|~k{37PMMX{3KT~~Kw(5&Li3xn0U(}7+Q=B*s zGF`Q^+_+(j86&^}G`Z&Z1b%ga-tnp$y75qgV3-rcSuJ43lXKdXr=s@m9h~Yz)Cdk% z6SZ_uFrK%cGl)?S#0$h;Ju>$JiXKfj0lyu*c5P=dE8{wPhgmmSF|X>j0?YRx=09(r ztBrI1famd!Q~#RVzi70m8f>NXLY=fC4BP2;61L`c=6hOPj2nI^L0R~WhRr! zT@@nkf%NgLy}OLbalgo?2{tS6t4f9vU>+Wgd%$n3{A>xHlH-h{f+`mvD&q02xE9W! zn{p%?0*)j*%rfaudP}fv{EzDSPHmxTag1lj1}ED;E&c#j`Vue>2;22G8tb?b)z8JO z$MtW&M-hYABFfHYb+5@B%WgT!I8ZU)MS3KrEb}XhG|r+J7a=7#Q{G2L+awj~REyI~ zY;`3&ZQ#PGOb}5YjQ+rVG$uC zSLih<3g}&bF;7fx9kr*l<$7;bB8<*hJtDYJ2M%pnGZcmh1im#K2SB{iCAJ z631Wej1;J@smp6c7W17#bFnj0TJV0mO6p4)=2${ME}tv{N$!;e{-Oe)P-YUH==73Q}^gO2Q=Mnh%%U zgwtgYpqki@e)GQBrfB+yhYTTUPxK5qbo;o4{x+P6nYTO5uU`KEDNXViBWEKNFRxSM z7dNHdKUZ@;bN*(l2SVkq@xAQ6Nj)zuC~hhinm+QNy#3s%7H~AN{u8{7C*jgibhHT9 z8a;dj5Odz&Zd#Y%I>E5Rr*g#=};xOh_)TK$p>}>@*ipqLGa!CKoqP(R6 z2aBV9{u8?At$SykKCX=C}RAB zCCTkar0cs{Xd1qUj^5`@M-n|$MbxsdiA4N=_Dfs?H`W%0AmX1-z`$-5L)>o#g!U>4 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

;V}uCJe2OZ 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 p3$5je-m>0v82fedzW@FbjcjC2f4_Tg \ No newline at end of file diff --git a/docs/static_files/stylesheets/extra.css b/docs/static_files/stylesheets/extra.css new file mode 100644 index 0000000000..17e99161ed --- /dev/null +++ b/docs/static_files/stylesheets/extra.css @@ -0,0 +1,16 @@ +@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&display=swap'); + +@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap'); + +body { + font-family: "Inter", sans-serif; +} + +li.md-nav__item{ + margin-left: .5rem; +} + +.md-typeset h1, h2, h3, h4, h5, h6{ + font-family: "Space Grotesk", sans-serif; +} + From 26668da2f7eb7d5537709b1182f530ce40609bc3 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 18 Sep 2024 18:15:39 +0200 Subject: [PATCH 02/19] feat(docs): update secrets variables names to avoid mixups --- .github/workflows/deploy-docs.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 4101c6fb11..3ce52077b4 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -30,18 +30,18 @@ jobs: - name: Sety up AWS credentials env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + CLI_DOC_ACCESS_KEY: ${{ secrets.CLI_DOC_ACCESS_KEY }} + CLI_DOC_SECRET_KEY: ${{ secrets.CLI_DOC_SECRET_KEY }} run: | - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY + aws configure set aws_access_key_id $CLI_DOC_ACCESS_KEY + aws configure set aws_secret_access_key $CLI_DOC_SECRET_KEY aws configure set region nl-ams - name: Upload file to Scaleway Object Storage env: - BUCKET_NAME: ${{ secrets.BUCKET_NAME }} - S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }} + CLI_DOC_BUCKET_NAME: ${{ secrets.CLI_DOC_BUCKET_NAME }} + CLI_DOC_S3_ENDPOINT: ${{ secrets.CLI_DOC_S3_ENDPOINT }} run: | - aws s3 cp --recursive ./docs/site/ s3://$BUCKET_NAME --endpoint-url $S3_ENDPOINT + aws s3 cp --recursive ./docs/site/ s3://$CLI_DOC_BUCKET_NAME --endpoint-url $CLI_DOC_S3_ENDPOINT - name: Delete temporary folder run: rm -rf docs/docs/ \ No newline at end of file From 2249340b1d419f9fb3553461c73dc0584b97d8e2 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 18 Sep 2024 18:22:20 +0200 Subject: [PATCH 03/19] feat(docs): update --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 3ce52077b4..1359839360 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -9,7 +9,7 @@ permissions: jobs: deploy: runs-on: ubuntu-latest - environment: actions + environment: actions # Is this necessary if we use the "env:" context below ? steps: - uses: actions/checkout@v4 - name: prepare temporary folder for build From f06f20c0e22233b2a0940c4ce1275b159faec086 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Fri, 20 Sep 2024 13:10:05 +0200 Subject: [PATCH 04/19] feat(docs): clean up and document conf and actions --- .github/workflows/deploy-docs.yml | 12 +- docs/commands/index.md | 6 + docs/docs/account.md | 119 + docs/docs/alias.md | 103 + docs/docs/apple-silicon.md | 319 ++ docs/docs/assets/cli-artwork.png | Bin 0 -> 102270 bytes docs/{static_files => docs}/assets/logo.png | Bin docs/docs/assets/logo.svg | 1 + docs/docs/autocomplete.md | 52 + docs/docs/baremetal.md | 948 ++++++ docs/docs/billing.md | 184 ++ docs/docs/block.md | 304 ++ docs/docs/cli-artwork.png | Bin 0 -> 102270 bytes docs/docs/cockpit.md | 725 +++++ docs/docs/config.md | 310 ++ docs/docs/container.md | 764 +++++ docs/docs/dedibox.md | 2130 ++++++++++++ docs/docs/dns.md | 746 +++++ docs/docs/document-db.md | 1217 +++++++ docs/docs/edge-services.md | 669 ++++ docs/docs/feedback.md | 36 + docs/docs/fip.md | 267 ++ docs/docs/function.md | 819 +++++ docs/docs/help.md | 248 ++ docs/docs/iam.md | 1149 +++++++ docs/docs/index.md | 149 + docs/docs/inference.md | 401 +++ docs/docs/info.md | 6 + docs/docs/init.md | 12 + docs/docs/instance.md | 3247 +++++++++++++++++++ docs/docs/iot.md | 727 +++++ docs/docs/ipam.md | 169 + docs/docs/ipfs.md | 284 ++ docs/docs/ipns.md | 169 + docs/docs/jobs.md | 258 ++ docs/docs/k8s.md | 1248 +++++++ docs/docs/keymanager.md | 309 ++ docs/docs/lb.md | 1447 +++++++++ docs/docs/login.md | 9 + docs/docs/marketplace.md | 192 ++ docs/docs/mnq.md | 607 ++++ docs/docs/object.md | 213 ++ docs/docs/rdb.md | 1674 ++++++++++ docs/docs/redis.md | 607 ++++ docs/docs/registry.md | 381 +++ docs/docs/sdb-sql.md | 220 ++ docs/docs/secret.md | 489 +++ docs/docs/shell.md | 6 + docs/docs/stylesheets/extra.css | 16 + docs/docs/tem.md | 474 +++ docs/docs/version.md | 6 + docs/docs/vpc-gw.md | 909 ++++++ docs/docs/vpc.md | 465 +++ docs/docs/webhosting.md | 348 ++ docs/mkdocs.yml | 19 +- 55 files changed, 26174 insertions(+), 15 deletions(-) create mode 100644 docs/docs/account.md create mode 100644 docs/docs/alias.md create mode 100644 docs/docs/apple-silicon.md create mode 100644 docs/docs/assets/cli-artwork.png rename docs/{static_files => docs}/assets/logo.png (100%) create mode 100644 docs/docs/assets/logo.svg create mode 100644 docs/docs/autocomplete.md create mode 100644 docs/docs/baremetal.md create mode 100644 docs/docs/billing.md create mode 100644 docs/docs/block.md create mode 100644 docs/docs/cli-artwork.png create mode 100644 docs/docs/cockpit.md create mode 100644 docs/docs/config.md create mode 100644 docs/docs/container.md create mode 100644 docs/docs/dedibox.md create mode 100644 docs/docs/dns.md create mode 100644 docs/docs/document-db.md create mode 100644 docs/docs/edge-services.md create mode 100644 docs/docs/feedback.md create mode 100644 docs/docs/fip.md create mode 100644 docs/docs/function.md create mode 100644 docs/docs/help.md create mode 100644 docs/docs/iam.md create mode 100644 docs/docs/index.md create mode 100644 docs/docs/inference.md create mode 100644 docs/docs/info.md create mode 100644 docs/docs/init.md create mode 100644 docs/docs/instance.md create mode 100644 docs/docs/iot.md create mode 100644 docs/docs/ipam.md create mode 100644 docs/docs/ipfs.md create mode 100644 docs/docs/ipns.md create mode 100644 docs/docs/jobs.md create mode 100644 docs/docs/k8s.md create mode 100644 docs/docs/keymanager.md create mode 100644 docs/docs/lb.md create mode 100644 docs/docs/login.md create mode 100644 docs/docs/marketplace.md create mode 100644 docs/docs/mnq.md create mode 100644 docs/docs/object.md create mode 100644 docs/docs/rdb.md create mode 100644 docs/docs/redis.md create mode 100644 docs/docs/registry.md create mode 100644 docs/docs/sdb-sql.md create mode 100644 docs/docs/secret.md create mode 100644 docs/docs/shell.md create mode 100644 docs/docs/stylesheets/extra.css create mode 100644 docs/docs/tem.md create mode 100644 docs/docs/version.md create mode 100644 docs/docs/vpc-gw.md create mode 100644 docs/docs/vpc.md create mode 100644 docs/docs/webhosting.md diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 1359839360..49355df6aa 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,7 +1,8 @@ name: Build and push CLI doc to S3 -on: +on: pull_request: - push: + push: # "pull_request" and "push" events are only for testing purposes, final trigger event should be "release" + # release: # Must define which of [published, unpublished, created, edited, deleted, prereleased, released] apply branches: - master permissions: @@ -13,10 +14,9 @@ jobs: steps: - uses: actions/checkout@v4 - name: prepare temporary folder for build - run: | + run: | # Creates a temporary "docs" folder with the existing "docs" folder because the markdown files to build must be in a "docs" folder for MKdocs to work cd docs mkdir docs - ls cp commands/* docs/ cp -r static_files/* docs/ - name: Pull Material for MKdocs image and build doc @@ -32,10 +32,10 @@ jobs: env: CLI_DOC_ACCESS_KEY: ${{ secrets.CLI_DOC_ACCESS_KEY }} CLI_DOC_SECRET_KEY: ${{ secrets.CLI_DOC_SECRET_KEY }} - run: | + run: | # AWS region "fr-par" is a placeholder as the CLI_DOC_S3_ENDPOINT variable overrides it aws configure set aws_access_key_id $CLI_DOC_ACCESS_KEY aws configure set aws_secret_access_key $CLI_DOC_SECRET_KEY - aws configure set region nl-ams + aws configure set region fr-par - name: Upload file to Scaleway Object Storage env: diff --git a/docs/commands/index.md b/docs/commands/index.md index f4101387f3..add128979b 100644 --- a/docs/commands/index.md +++ b/docs/commands/index.md @@ -1,3 +1,5 @@ + + # Scaleway CLI v2 Documentation

@@ -9,6 +11,10 @@ Scaleway CLI is a tool to help you pilot your Scaleway infrastructure directly from your terminal. +!!! note + + This website is under construction and may contain out-of-date information. Refer to the [Scaleway CLI repository](https://github.com/scaleway/scaleway-cli) for the latest release. + ## Installation ### With a Package Manager (Recommended) diff --git a/docs/docs/account.md b/docs/docs/account.md new file mode 100644 index 0000000000..ee0402c7ad --- /dev/null +++ b/docs/docs/account.md @@ -0,0 +1,119 @@ + +# Documentation for `scw account` +This API allows you to manage your Scaleway Projects. + +- [Project management commands](#project-management-commands) + - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) + - [Delete an existing Project](#delete-an-existing-project) + - [Get an existing Project](#get-an-existing-project) + - [List all Projects of an Organization](#list-all-projects-of-an-organization) + - [Update Project](#update-project) + + +## Project management commands + +Project management commands. + + +### Create a new Project for an Organization + +Generate a new Project for an Organization, specifying its configuration including name and description. + +**Usage:** + +``` +scw account project create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the Project | +| description | | Description of the Project | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Delete an existing Project + +Delete an existing Project, specified by its Project ID. The Project needs to be empty (meaning there are no resources left in it) to be deleted effectively. Note that deleting a Project is permanent, and cannot be undone. + +**Usage:** + +``` +scw account project delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Get an existing Project + +Retrieve information about an existing Project, specified by its Project ID. Its full details, including ID, name and description, are returned in the response object. + +**Usage:** + +``` +scw account project get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### List all Projects of an Organization + +List all Projects of an Organization. The response will include the total number of Projects as well as their associated Organizations, names, and IDs. Other information includes the creation and update date of the Project. + +**Usage:** + +``` +scw account project list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the Project | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned Projects | +| project-ids.{index} | | Project IDs to filter for. The results will be limited to any Projects with an ID in this array | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Update Project + +Update the parameters of an existing Project, specified by its Project ID. These parameters include the name and description. + +**Usage:** + +``` +scw account project update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name of the Project | +| description | | Description of the Project | + + + diff --git a/docs/docs/alias.md b/docs/docs/alias.md new file mode 100644 index 0000000000..744359aac2 --- /dev/null +++ b/docs/docs/alias.md @@ -0,0 +1,103 @@ + +# Documentation for `scw alias` +This namespace allows you to manage your aliases +Aliases are store in cli config file, Default path for this configuration file is based on the following priority order: + +- $SCW_CLI_CONFIG_PATH +- $XDG_CONFIG_HOME/scw/cli.yaml +- $HOME/.config/scw/cli.yaml +- $USERPROFILE/.config/scw/cli.yaml + +You can use multiple aliases in one command +aliases in your commands are evaluated and you get completion + with: isl = instance server list + "scw isl " will complete as "scw instance server list " + "scw " will complete "isl" + + +- [Create a new alias for a command](#create-a-new-alias-for-a-command) +- [Delete an alias](#delete-an-alias) +- [List aliases and their commands](#list-aliases-and-their-commands) + + +## Create a new alias for a command + +This command help you create aliases and save it to your config + +This command help you create aliases and save it to your config + +**Usage:** + +``` +scw alias create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| alias | Required | Alias name | +| command | | Command to create an alias for | + + +**Examples:** + + +Create a custom alias 'isl' for 'instance server list' +``` +scw alias create isl command="instance server list"" +``` + +Add an alias to a verb +``` +scw alias create c command=create +``` + + + + +## Delete an alias + + + + + +**Usage:** + +``` +scw alias delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| alias | | alias name | + + + +## List aliases and their commands + + + + + +**Usage:** + +``` +scw alias list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `command_asc`
One of: `command_asc`, `command_desc`, `alias_asc`, `alias_desc` | | +| command | | filter command | +| alias | | filter alias | + + + diff --git a/docs/docs/apple-silicon.md b/docs/docs/apple-silicon.md new file mode 100644 index 0000000000..67b8cf05f7 --- /dev/null +++ b/docs/docs/apple-silicon.md @@ -0,0 +1,319 @@ + +# Documentation for `scw apple-silicon` +Apple silicon API. + +- [OS management commands](#os-management-commands) + - [Get an Operating System (OS)](#get-an-operating-system-(os)) + - [List all Operating Systems (OS)](#list-all-operating-systems-(os)) +- [Apple silicon management commands](#apple-silicon-management-commands) + - [Create a server](#create-a-server) + - [Delete a server](#delete-a-server) + - [Get a server](#get-a-server) + - [List all servers](#list-all-servers) + - [Reboot a server](#reboot-a-server) + - [Reinstall a server](#reinstall-a-server) + - [SSH into a server](#ssh-into-a-server) + - [Update a server](#update-a-server) + - [Wait for a server to reach a stable state](#wait-for-a-server-to-reach-a-stable-state) +- [Server-Types management commands](#server-types-management-commands) + - [Get a server type](#get-a-server-type) + - [List server types](#list-server-types) + + +## OS management commands + +OS management commands. + + +### Get an Operating System (OS) + +Get an Operating System (OS). The response will include the OS's unique ID as well as its name and label. + +**Usage:** + +``` +scw apple-silicon os get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| os-id | Required | UUID of the OS you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all Operating Systems (OS) + +List all Operating Systems (OS). The response will include the total number of OS as well as their associated IDs, names and labels. + +**Usage:** + +``` +scw apple-silicon os list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-type | | List of compatible server types | +| name | | Filter OS by name (note that "11.1" will return "11.1.2" and "11.1" but not "12")) | +| zone | Default: `fr-par-1`
One of: `fr-par-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Apple silicon management commands + +Apple silicon management commands. + + +### Create a server + +Create a new server in the targeted zone, specifying its configuration including name and type. + +**Usage:** + +``` +scw apple-silicon server create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Create a server with this given name | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| type | | Create a server of the given type | +| os-id | | Create a server with the given os_id | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a server + +Delete an existing Apple silicon server, specified by its server ID. Deleting a server is permanent, and cannot be undone. Note that the minimum allocation period for Apple silicon-as-a-service is 24 hours, meaning you cannot delete your server prior to that. + +**Usage:** + +``` +scw apple-silicon server delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a server + +Retrieve information about an existing Apple silicon server, specified by its server ID. Its full details, including name, status and IP address, are returned in the response object. + +**Usage:** + +``` +scw apple-silicon server get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all servers + +List all servers in the specified zone. By default, returned servers in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw apple-silicon server list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned servers | +| project-id | | Only list servers of this project ID | +| organization-id | | Only list servers of this Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Reboot a server + +Reboot an existing Apple silicon server, specified by its server ID. + +**Usage:** + +``` +scw apple-silicon server reboot [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server you want to reboot | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Reinstall a server + +Reinstall an existing Apple silicon server (specified by its server ID) from a new image (OS). All the data on the disk is deleted and all configuration is reset to the defailt configuration values of the image (OS). + +**Usage:** + +``` +scw apple-silicon server reinstall [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server you want to reinstall | +| os-id | | Reinstall the server with the OS corresponding to the os_id | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### SSH into a server + +Connect to distant server via the SSH protocol. + +**Usage:** + +``` +scw apple-silicon server ssh [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to SSH into | +| username | Default: `m1` | Username used for the SSH connection | +| port | Default: `22` | Port used for the SSH connection | +| command | | Command to execute on the remote server | +| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a server + +Update the parameters of an existing Apple silicon server, specified by its server ID. + +**Usage:** + +``` +scw apple-silicon server update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server you want to update | +| name | Required | Updated name for your server | +| schedule-deletion | | Specify whether the server should be flagged for automatic deletion | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for a server to reach a stable state + +Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. + +**Usage:** + +``` +scw apple-silicon server wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server. | +| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `1h0m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a server to reach a stable state +``` +scw apple-silicon server wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Server-Types management commands + +Server-Types management commands. + + +### Get a server type + +Get technical details (CPU, disk size etc.) of a server type. + +**Usage:** + +``` +scw apple-silicon server-type get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-type | Required | Server type identifier | +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List server types + +List all technical details about Apple silicon server types available in the specified zone. Since there is only one Availability Zone for Apple silicon servers, the targeted value is `fr-par-3`. + +**Usage:** + +``` +scw apple-silicon server-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/assets/cli-artwork.png b/docs/docs/assets/cli-artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7e5a6fe11a8257e8e92ee4cf67a5cbb54a7699 GIT binary patch literal 102270 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

;V}uCJe2OZ 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 \ No newline at end of file diff --git a/docs/docs/autocomplete.md b/docs/docs/autocomplete.md new file mode 100644 index 0000000000..95f1777fb1 --- /dev/null +++ b/docs/docs/autocomplete.md @@ -0,0 +1,52 @@ + +# Documentation for `scw autocomplete` +Autocomplete related commands + +- [Install autocomplete script](#install-autocomplete-script) +- [Show autocomplete script for current shell](#show-autocomplete-script-for-current-shell) + + +## Install autocomplete script + +Install autocomplete script for a given shell and OS. + +Install autocomplete script for a given shell and OS. + +**Usage:** + +``` +scw autocomplete install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| shell | | | +| basename | Default: `` | | + + + +## Show autocomplete script for current shell + +Show autocomplete script for current shell. + +Show autocomplete script for current shell. + +**Usage:** + +``` +scw autocomplete script [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| shell | Default: `/bin/bash` | | +| basename | Default: `` | | + + + diff --git a/docs/docs/baremetal.md b/docs/docs/baremetal.md new file mode 100644 index 0000000000..266c2eb5f6 --- /dev/null +++ b/docs/docs/baremetal.md @@ -0,0 +1,948 @@ + +# Documentation for `scw baremetal` +Elastic Metal API. + +- [Baseboard Management Controller (BMC) management commands](#baseboard-management-controller-(bmc)-management-commands) + - [Get BMC access](#get-bmc-access) + - [Start BMC access](#start-bmc-access) + - [Stop BMC access](#stop-bmc-access) +- [Server offer management commands](#server-offer-management-commands) + - [Get offer](#get-offer) + - [List offers](#list-offers) +- [Server options management commands](#server-options-management-commands) + - [Add server option](#add-server-option) + - [Delete server option](#delete-server-option) + - [Get option](#get-option) + - [List options](#list-options) +- [Operating System (OS) management commands](#operating-system-(os)-management-commands) + - [Get OS with an ID](#get-os-with-an-id) + - [List available OSes](#list-available-oses) +- [Private Network management command](#private-network-management-command) + - [Add a server to a Private Network](#add-a-server-to-a-private-network) + - [Delete a Private Network](#delete-a-private-network) + - [List the Private Networks of a server](#list-the-private-networks-of-a-server) + - [Set multiple Private Networks on a server](#set-multiple-private-networks-on-a-server) +- [Server management commands](#server-management-commands) + - [Attach a new flexible IP to a server](#attach-a-new-flexible-ip-to-a-server) + - [Create an Elastic Metal server](#create-an-elastic-metal-server) + - [Delete an Elastic Metal server](#delete-an-elastic-metal-server) + - [Get a specific Elastic Metal server](#get-a-specific-elastic-metal-server) + - [Return server metrics](#return-server-metrics) + - [Install an Elastic Metal server](#install-an-elastic-metal-server) + - [List Elastic Metal servers for an Organization](#list-elastic-metal-servers-for-an-organization) + - [List server events](#list-server-events) + - [Reboot an Elastic Metal server](#reboot-an-elastic-metal-server) + - [Start an Elastic Metal server](#start-an-elastic-metal-server) + - [Stop an Elastic Metal server](#stop-an-elastic-metal-server) + - [Update an Elastic Metal server](#update-an-elastic-metal-server) + - [Update IP](#update-ip) + - [Wait for a server to reach a stable state (delivery and installation)](#wait-for-a-server-to-reach-a-stable-state-(delivery-and-installation)) +- [Settings management commands](#settings-management-commands) + - [List all settings](#list-all-settings) + - [Update setting](#update-setting) + + +## Baseboard Management Controller (BMC) management commands + +A Baseboard Management Controller (BMC) allows you to remotely access the low-level parameters of your dedicated server. +For instance, your KVM-IP management console could be accessed with it. +You need first to create an Remote Access option. You will find the ID and the price with a call to listOffers (https://developers.scaleway.com/en/products/baremetal/api/#get-78db92). Then you can add the option https://developers.scaleway.com/en/products/baremetal/api/#post-b14abd. Do not forget to delete the Option. +Then you need to create Remote Access https://developers.scaleway.com/en/products/baremetal/api/#post-1af723. +And finally Get Remote Access to get the login/password https://developers.scaleway.com/en/products/baremetal/api/#get-cefc0f. + + +### Get BMC access + +Get the BMC (Baseboard Management Controller) access associated with the ID, including the URL and login information needed to connect. + +**Usage:** + +``` +scw baremetal bmc get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Start BMC access + +Start BMC (Baseboard Management Controller) access associated with the ID. +The BMC (Baseboard Management Controller) access is available one hour after the installation of the server. +You need first to create an option Remote Access. You will find the ID and the price with a call to listOffers (https://developers.scaleway.com/en/products/baremetal/api/#get-78db92). Then add the option https://developers.scaleway.com/en/products/baremetal/api/#post-b14abd. +After adding the BMC option, you need to Get Remote Access to get the login/password https://developers.scaleway.com/en/products/baremetal/api/#get-cefc0f. Do not forget to delete the Option after use. + +**Usage:** + +``` +scw baremetal bmc start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| ip | Required | The IP authorized to connect to the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Stop BMC access + +Stop BMC (Baseboard Management Controller) access associated with the ID. + +**Usage:** + +``` +scw baremetal bmc stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Server offer management commands + +Server offers will answer with all different Elastic Metal server ranges available in a zone. +Each of them will contain all the features of the server (CPUs, memory, disks) with their associated pricing. + + +### Get offer + +Get details of an offer identified by its offer ID. + +**Usage:** + +``` +scw baremetal offer get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | Required | ID of the researched Offer | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a server offer with the ID +``` +scw baremetal offer get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### List offers + +List all available Elastic Metal server configurations. + +**Usage:** + +``` +scw baremetal offer list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| subscription-period | One of: `unknown_subscription_period`, `hourly`, `monthly` | Subscription period type to filter offers by | +| name | | Offer name to filter offers by | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all server offers in the default zone +``` +scw baremetal offer list +``` + +List all server offers in fr-par-1 zone +``` +scw baremetal offer list zone=fr-par-1 +``` + + + + +## Server options management commands + +A Server has additional options that let you personalize it to better fit your needs. + + +### Add server option + +Add an option, such as Private Networks, to a specific server. + +**Usage:** + +``` +scw baremetal options add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| option-id | Required | ID of the option to add | +| expires-at | | Auto expire the option after this date | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Add an option, such as Private Networks, to a server +``` +scw baremetal options add server-id=11111111-1111-1111-1111-111111111111 option-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### Delete server option + +Delete an option from a specific server. + +**Usage:** + +``` +scw baremetal options delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| option-id | Required | ID of the option to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete an option from a server +``` +scw baremetal options delete server-id=11111111-1111-1111-1111-111111111111 option-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### Get option + +Return specific option for the ID. + +**Usage:** + +``` +scw baremetal options get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| option-id | Required | ID of the option | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a server option with the ID +``` +scw baremetal options get zone=fr-par-1 option-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### List options + +List all options matching with filters. + +**Usage:** + +``` +scw baremetal options list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | | Offer ID to filter options for | +| name | | Name to filter options for | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all server options in the default zone +``` +scw baremetal options list +``` + +List all server options in fr-par-1 zone +``` +scw baremetal options list zone=fr-par-1 +``` + + + + +## Operating System (OS) management commands + +An Operating System (OS) is the underlying software installed on your server. + + +### Get OS with an ID + +Return the specific OS for the ID. + +**Usage:** + +``` +scw baremetal os get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| os-id | Required | ID of the OS | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a specific OS ID +``` +scw baremetal os get +``` + + + + +### List available OSes + +List all OSes that are available for installation on Elastic Metal servers. + +**Usage:** + +``` +scw baremetal os list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | | Offer IDs to filter OSes for | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Private Network management command + +A Private Network allows you to interconnect your resources +(servers, instances, ...) in an isolated and private +network. The network reachability is limited to the +resources that are on the same Private Network . A VLAN +interface is available on the server and can be freely +managed (adding IP addresses, shutdown interface...). + +Note that a resource can be a part of multiple Private Networks. + + +### Add a server to a Private Network + +Add a server to a Private Network. + +**Usage:** + +``` +scw baremetal private-network add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | The ID of the server | +| private-network-id | Required | The ID of the Private Network | +| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a Private Network + +Delete a Private Network. + +**Usage:** + +``` +scw baremetal private-network delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | The ID of the server | +| private-network-id | Required | The ID of the Private Network | +| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | + + + +### List the Private Networks of a server + +List the Private Networks of a server. + +**Usage:** + +``` +scw baremetal private-network list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | The sort order for the returned Private Networks | +| server-id | | Filter Private Networks by server ID | +| private-network-id | | Filter Private Networks by Private Network ID | +| project-id | | Filter Private Networks by Project ID | +| organization-id | | Filter Private Networks by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-2`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Set multiple Private Networks on a server + +Set multiple Private Networks on a server. + +**Usage:** + +``` +scw baremetal private-network set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | The ID of the server | +| private-network-ids.{index} | Required | The IDs of the Private Networks | +| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | + + + +## Server management commands + +A server is a denomination of a type of instances provided by Scaleway. + + +### Attach a new flexible IP to a server + +Create and attach a new flexible IP to a server + +**Usage:** + +``` +scw baremetal server add-flexible-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to which the newly created flexible IP will be attached. | +| description | | Flexible IP description (max. of 255 characters) | +| ip-type | One of: `IPv4`, `IPv6` | Define whether the flexible IP is an IPv4 or IPv6 | +| tags.{index} | | Tags to associate to the flexible IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Create an Elastic Metal server + +Create a new Elastic Metal server. Once the server is created, proceed with the [installation of an OS](#post-3e949e). + +**Usage:** + +``` +scw baremetal server create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Required
Default: `` | Name of the server (≠hostname) | +| description | | Description associated with the server, max 255 characters | +| type | | Server commercial type | +| tags.{index} | | Tags to associate to the server | +| install.os-id | | ID of the OS to installation on the server | +| install.hostname | | Hostname of the server | +| install.ssh-key-ids.{index} | | SSH key IDs authorized on the server | +| install.user | | User for the installation | +| install.password | | Password for the installation | +| install.service-user | | Regular user that runs the service to be installed on the server | +| install.service-password | | Password used for the service to install | +| option-ids.{index} | | IDs of options to enable on server | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create instance +``` +scw baremetal server create +``` + + + + +### Delete an Elastic Metal server + +Delete the server associated with the ID. + +**Usage:** + +``` +scw baremetal server delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete an Elastic Metal server +``` +scw baremetal server delete 11111111-1111-1111-1111-111111111111 +``` + + + + +### Get a specific Elastic Metal server + +Get full details of an existing Elastic Metal server associated with the ID. + +**Usage:** + +``` +scw baremetal server get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a specific server +``` +scw baremetal server get 11111111-1111-1111-1111-111111111111 +``` + + + + +### Return server metrics + +Get the ping status of the server associated with the ID. + +**Usage:** + +``` +scw baremetal server get-metrics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to get the metrics | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Install an Elastic Metal server + +Install an Operating System (OS) on the Elastic Metal server with a specific ID. + +**Usage:** + +``` +scw baremetal server install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to install | +| os-id | Required | ID of the OS to installation on the server | +| hostname | Required | Hostname of the server | +| all-ssh-keys | | Add all SSH keys on your baremetal instance (cannot be used with ssh-key-ids) | +| ssh-key-ids.{index} | Required | SSH key IDs authorized on the server (cannot be used with all-ssh-keys) | +| user | | User used for the installation | +| password | | Password used for the installation | +| service-user | | User used for the service to install | +| service-password | | Password used for the service to install | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Install an OS on a server with a particular SSH key ID +``` +scw baremetal server install 11111111-1111-1111-1111-111111111111 os-id=11111111-1111-1111-1111-111111111111 ssh-key-ids.0=11111111-1111-1111-1111-111111111111 +``` + + + + +### List Elastic Metal servers for an Organization + +List Elastic Metal servers for a specific Organization. + +**Usage:** + +``` +scw baremetal server list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | +| tags.{index} | | Tags to filter for | +| status.{index} | | Status to filter for | +| name | | Names to filter for | +| project-id | | Project ID to filter for | +| option-id | | Option ID to filter for | +| organization-id | | Organization ID to filter for | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all servers in your default zone +``` +scw baremetal server list +``` + + + + +### List server events + +List event (i.e. start/stop/reboot) associated to the server ID. + +**Usage:** + +``` +scw baremetal server list-events [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server events searched | +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server events | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Reboot an Elastic Metal server + +Reboot the Elastic Metal server associated with the ID, use the `boot_type` `rescue` to reboot the server in rescue mode. + +**Usage:** + +``` +scw baremetal server reboot [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to reboot | +| boot-type | Default: `normal`
One of: `unknown_boot_type`, `normal`, `rescue` | The type of boot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Reboot a server using the same os +``` +scw baremetal server reboot 11111111-1111-1111-1111-111111111111 +``` + +Reboot a server in rescue mode +``` +scw baremetal server reboot 11111111-1111-1111-1111-111111111111 boot-type=rescue +``` + + + + +### Start an Elastic Metal server + +Start the server associated with the ID. + +**Usage:** + +``` +scw baremetal server start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to start | +| boot-type | One of: `unknown_boot_type`, `normal`, `rescue` | The type of boot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Start an Elastic Metalx server +``` +scw baremetal server start 11111111-1111-1111-1111-111111111111 +``` + +Start a server in rescue mode +``` +scw baremetal server start 11111111-1111-1111-1111-111111111111 boot-type=rescue +``` + + + + +### Stop an Elastic Metal server + +Stop the server associated with the ID. The server remains allocated to your account and all data remains on the local storage of the server. + +**Usage:** + +``` +scw baremetal server stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to stop | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Stop an Elastic Metal server +``` +scw baremetal server stop 11111111-1111-1111-1111-111111111111 +``` + + + + +### Update an Elastic Metal server + +Update the server associated with the ID. You can update parameters such as the server's name, tags and description. Any parameters left null in the request body are not updated. + +**Usage:** + +``` +scw baremetal server update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to update | +| name | | Name of the server (≠hostname), not updated if null | +| description | | Description associated with the server, max 255 characters, not updated if null | +| tags.{index} | | Tags associated with the server, not updated if null | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update IP + +Configure the IP address associated with the server ID and IP ID. You can use this method to set a reverse DNS for an IP address. + +**Usage:** + +``` +scw baremetal server update-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| ip-id | Required | ID of the IP to update | +| reverse | | New reverse IP to update, not updated if null | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for a server to reach a stable state (delivery and installation) + +Wait for a server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. + +**Usage:** + +``` +scw baremetal server wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `20m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a server to reach a stable state +``` +scw baremetal server wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Settings management commands + +Allows to configure the general settings for your Elastic Metal server. + + +### List all settings + +Return all settings for a Project ID. + +**Usage:** + +``` +scw baremetal settings list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for items in the response | +| project-id | Required | ID of the Project | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update setting + +Update a setting for a Project ID (enable or disable). + +**Usage:** + +``` +scw baremetal settings update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| setting-id | Required | ID of the setting | +| enabled | | Defines whether the setting is enabled | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/billing.md b/docs/docs/billing.md new file mode 100644 index 0000000000..4433f022ae --- /dev/null +++ b/docs/docs/billing.md @@ -0,0 +1,184 @@ + +# Documentation for `scw billing` +This API allows you to manage and query your Scaleway billing and consumption. + +- [Consumption management commands](#consumption-management-commands) + - [Get monthly consumption](#get-monthly-consumption) + - [Get monthly consumption taxes](#get-monthly-consumption-taxes) +- [Discount management commands](#discount-management-commands) + - [List discounts](#list-discounts) +- [Invoice management commands](#invoice-management-commands) + - [Download an invoice](#download-an-invoice) + - [Export invoices](#export-invoices) + - [Get an invoice](#get-an-invoice) + - [List invoices](#list-invoices) + + +## Consumption management commands + +Consumption management commands. + + +### Get monthly consumption + +Consumption allows you to retrieve your past or current consumption cost, by project or category. + +**Usage:** + +``` +scw billing consumption list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `updated_at_desc`, `updated_at_asc`, `category_name_desc`, `category_name_asc` | Order consumptions list in the response by their update date | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| category-name | | Filter by name of a Category as they are shown in the invoice (Compute, Network, Observability) | +| billing-period | | Filter by the billing period in the YYYY-MM format. If it is empty the current billing period will be used as default | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Get monthly consumption taxes + +Consumption Tax allows you to retrieve your past or current tax charges, by project or category. + +**Usage:** + +``` +scw billing consumption list-taxes [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `updated_at_desc`, `updated_at_asc`, `category_name_desc`, `category_name_asc` | Order consumed taxes list in the response by their update date | +| billing-period | | Filter by the billing period in the YYYY-MM format. If it is empty the current billing period will be used as default | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +## Discount management commands + +Discount management commands. + + +### List discounts + +List all discounts for your organization and usable categories, products, offers, references, regions and zones where the discount can be applied. + +**Usage:** + +``` +scw billing discount list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `creation_date_desc`, `creation_date_asc` | Order discounts in the response by their description | +| organization-id | | ID of the organization | + + + +## Invoice management commands + +Invoice management commands. + + +### Download an invoice + +Download a specific invoice, specified by its ID. + +**Usage:** + +``` +scw billing invoice download [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| invoice-id | Required | Invoice ID | +| file-path | Default: `./` | Wanted file path | +| file-type | Default: `pdf` | Wanted file extension | +| force-replace | Default: `false` | Force file replacement | + + + +### Export invoices + +Export invoices in a CSV file. + +**Usage:** + +``` +scw billing invoice export [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| organization-id | | Organization ID. If specified, only invoices from this Organization will be returned | +| billing-period-start-after | | Return only invoice with start date greater than billing_period_start | +| billing-period-start-before | | Return only invoice with start date less than billing_period_start | +| invoice-type | | Invoice type. It can either be `periodic` or `purchase` | +| file-path | Default: `./` | Wanted file path | +| file-type | Default: `csv` | Wanted file extension | +| force-replace | Default: `false` | Force file replacement | + + + +### Get an invoice + +Get a specific invoice, specified by its ID. + +**Usage:** + +``` +scw billing invoice get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| invoice-id | Required | Invoice ID | + + + +### List invoices + +List all your invoices, filtering by `start_date` and `invoice_type`. Each invoice has its own ID. + +**Usage:** + +``` +scw billing invoice list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| billing-period-start-after | | Return only invoice with start date greater than billing_period_start | +| billing-period-start-before | | Return only invoice with start date less than billing_period_start | +| invoice-type | One of: `unknown_type`, `periodic`, `purchase` | Invoice type. It can either be `periodic` or `purchase` | +| order-by | One of: `invoice_number_desc`, `invoice_number_asc`, `start_date_desc`, `start_date_asc`, `issued_date_desc`, `issued_date_asc`, `due_date_desc`, `due_date_asc`, `total_untaxed_desc`, `total_untaxed_asc`, `total_taxed_desc`, `total_taxed_asc`, `invoice_type_desc`, `invoice_type_asc` | How invoices are ordered in the response | +| organization-id | | Organization ID. If specified, only invoices from this Organization will be returned | + + + diff --git a/docs/docs/block.md b/docs/docs/block.md new file mode 100644 index 0000000000..042a458508 --- /dev/null +++ b/docs/docs/block.md @@ -0,0 +1,304 @@ + +# Documentation for `scw block` +This API allows you to manage your Block Storage volumes. + +- [A Block Storage snapshot is a read-only picture of a Block volume, taken at a specific time](#a-block-storage-snapshot-is-a-read-only-picture-of-a-block-volume,-taken-at-a-specific-time) + - [Create a snapshot of a volume](#create-a-snapshot-of-a-volume) + - [Delete a snapshot](#delete-a-snapshot) + - [Export a snapshot to a Scaleway Object Storage bucket](#export-a-snapshot-to-a-scaleway-object-storage-bucket) + - [Get a snapshot](#get-a-snapshot) + - [List all snapshots](#list-all-snapshots) + - [Update a snapshot](#update-a-snapshot) +- [A Block Storage volume is a logical storage drive on a network-connected storage system. It is exposed to Instances as if it were a physical disk, and can be attached and detached like a hard drive. Several Block volumes can be attached to one Instance at a time](#a-block-storage-volume-is-a-logical-storage-drive-on-a-network-connected-storage-system.-it-is-exposed-to-instances-as-if-it-were-a-physical-disk,-and-can-be-attached-and-detached-like-a-hard-drive.-several-block-volumes-can-be-attached-to-one-instance-at-a-time) + - [Create a volume](#create-a-volume) + - [Delete a detached volume](#delete-a-detached-volume) + - [Get a volume](#get-a-volume) + - [List volumes](#list-volumes) + - [Update a volume](#update-a-volume) +- [Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class](#block-storage-volume-types-are-determined-by-their-storage-class-and-their-iops.-there-are-two-storage-classes-available:-`bssd`-and-`sbs`.-the-iops-can-be-chosen-for-volumes-of-the-`sbs`-storage-class) + - [List volume types](#list-volume-types) + + +## A Block Storage snapshot is a read-only picture of a Block volume, taken at a specific time + +You can then revert your data to the previous snapshot. You can also create a new read/write Block volume from a previous snapshot. + + +### Create a snapshot of a volume + +To create a snapshot, the volume must be in the `in_use` or the `available` status. +If your volume is in a transient state, you need to wait until the end of the current operation. + +**Usage:** + +``` +scw block snapshot create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | UUID of the volume to snapshot | +| name | | Name of the snapshot | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | List of tags assigned to the snapshot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a snapshot + +You must specify the `snapshot_id` of the snapshot you want to delete. The snapshot must not be in use. + +**Usage:** + +``` +scw block snapshot delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Export a snapshot to a Scaleway Object Storage bucket + +The snapshot is exported in QCOW2 format. +The snapshot must not be in transient state. + +**Usage:** + +``` +scw block snapshot export-to-object-storage [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| bucket | | Scaleway Object Storage bucket where the object is stored | +| key | | The object key inside the given bucket | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a snapshot + +Retrieve technical information about a specific snapshot. Details such as size, volume type, and status are returned in the response. + +**Usage:** + +``` +scw block snapshot get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all snapshots + +List all available snapshots in a specified zone. By default, the snapshots listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. + +**Usage:** + +``` +scw block snapshot list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | +| project-id | | Filter by Project ID | +| volume-id | | Filter snapshots by the ID of the original volume | +| name | | Filter snapshots by their names | +| organization-id | | Filter by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a snapshot + +Update the name or tags of the snapshot. + +**Usage:** + +``` +scw block snapshot update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| name | | When defined, is the name of the snapshot | +| tags.{index} | | List of tags assigned to the snapshot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## A Block Storage volume is a logical storage drive on a network-connected storage system. It is exposed to Instances as if it were a physical disk, and can be attached and detached like a hard drive. Several Block volumes can be attached to one Instance at a time + +Block volumes can be snapshotted, mounted or unmounted. + + +### Create a volume + +To create a new volume from scratch, you must specify `from_empty` and the `size`. +To create a volume from an existing snapshot, specify `from_snapshot` and the `snapshot_id` in the request payload instead, size is optional and can be specified if you need to extend the original size. The volume will take on the same volume class and underlying IOPS limitations as the original snapshot. + +**Usage:** + +``` +scw block volume create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | Name of the volume | +| perf-iops | Required | The maximum IO/s expected, according to the different options available in stock (`5000 | 15000`) | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| from-empty.size | | Volume size in bytes, with a granularity of 1 GB (10^9 bytes) | +| from-snapshot.size | | Volume size in bytes, with a granularity of 1 GB (10^9 bytes) | +| from-snapshot.snapshot-id | | Source snapshot from which volume will be created | +| tags.{index} | | List of tags assigned to the volume | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a detached volume + +You must specify the `volume_id` of the volume you want to delete. The volume must not be in the `in_use` status. + +**Usage:** + +``` +scw block volume delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a volume + +Retrieve technical information about a specific volume. Details such as size, type, and status are returned in the response. + +**Usage:** + +``` +scw block volume get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List volumes + +List all existing volumes in a specified zone. By default, the volumes listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. + +**Usage:** + +``` +scw block volume list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | +| project-id | | Filter by Project ID | +| name | | Filter the return volumes by their names | +| product-resource-id | | Filter by a product resource ID linked to this volume (such as an Instance ID) | +| organization-id | | Filter by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a volume + +Update the technical details of a volume, such as its name, tags, or its new size and `volume_type` (within the same Block Storage class). +You can only resize a volume to a larger size. It is currently not possible to change your Block Storage Class. + +**Usage:** + +``` +scw block volume update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume | +| name | | When defined, is the new name of the volume | +| size | | Optional field for increasing the size of a volume (size must be equal or larger than the current one) | +| tags.{index} | | List of tags assigned to the volume | +| perf-iops | | The maximum IO/s expected, according to the different options available in stock (`5000 | 15000`) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class + +Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class. + + +### List volume types + +List all available volume types in a specified zone. The volume types listed are ordered by name in ascending order. + +**Usage:** + +``` +scw block volume-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/cli-artwork.png b/docs/docs/cli-artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7e5a6fe11a8257e8e92ee4cf67a5cbb54a7699 GIT binary patch literal 102270 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

)piKZY<_h|cN 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%0AmX1-z`$-5L)>o#g!U>4 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

;V}uCJe2OZ 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 +# Documentation for `scw cockpit` +This API allows you to manage your Scaleway Cockpit, for storing and visualizing metrics and logs. + +- [Alerting management commands](#alerting-management-commands) + - [Disable the Alert manager](#disable-the-alert-manager) + - [Enable the Alert manager](#enable-the-alert-manager) + - [Get the Alert manager](#get-the-alert-manager) +- [Contact point management commands](#contact-point-management-commands) + - [Create a contact point](#create-a-contact-point) + - [Delete a contact point](#delete-a-contact-point) + - [List contact points](#list-contact-points) +- [Datasource management commands](#datasource-management-commands) + - [Create a data source](#create-a-data-source) + - [Delete a data source](#delete-a-data-source) + - [Get a data source](#get-a-data-source) + - [List data sources](#list-data-sources) + - [Update a data source](#update-a-data-source) +- [Grafana user management commands](#grafana-user-management-commands) + - [Get your Cockpit's Grafana](#get-your-cockpit's-grafana) + - [Synchronize Grafana data sources](#synchronize-grafana-data-sources) +- [Grafana user management commands](#grafana-user-management-commands) + - [Create a Grafana user](#create-a-grafana-user) + - [Delete a Grafana user](#delete-a-grafana-user) + - [List Grafana users](#list-grafana-users) + - [Reset a Grafana user password](#reset-a-grafana-user-password) +- [Managed alerts management commands](#managed-alerts-management-commands) + - [Disable managed alerts](#disable-managed-alerts) + - [Enable managed alerts](#enable-managed-alerts) +- [Pricing plans management commands](#pricing-plans-management-commands) + - [Get current plan](#get-current-plan) + - [List plan types](#list-plan-types) + - [Apply a pricing plan](#apply-a-pricing-plan) +- [Product dashboards management commands](#product-dashboards-management-commands) + - [Get Scaleway resource dashboard](#get-scaleway-resource-dashboard) + - [List Scaleway resources dashboards](#list-scaleway-resources-dashboards) +- [Test alert management commands](#test-alert-management-commands) + - [Trigger a test alert](#trigger-a-test-alert) +- [Token management commands](#token-management-commands) + - [Create a token](#create-a-token) + - [Delete a token](#delete-a-token) + - [Get a token](#get-a-token) + - [List tokens](#list-tokens) +- [Usage overview management commands](#usage-overview-management-commands) + - [Get data source usage overview](#get-data-source-usage-overview) + + +## Alerting management commands + +Alerting management commands. + + +### Disable the Alert manager + +Disabling the Alert manager deletes the contact points you have created and disables managed alerts in the specified Project and region. + +**Usage:** + +``` +scw cockpit alert-manager disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable the Alert manager + +Enabling the Alert manager allows you to enable managed alerts and create contact points in the specified Project and region, to be notified when your Scaleway resources may require your attention. + +**Usage:** + +``` +scw cockpit alert-manager enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get the Alert manager + +Retrieve information about the Alert manager which is unique per Project and region. By default the Alert manager is disabled. +The output returned displays a URL to access the Alert manager, and whether the Alert manager and managed alerts are enabled. + +**Usage:** + +``` +scw cockpit alert-manager get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Contact point management commands + +Contact point management commands. + + +### Create a contact point + +Contact points are email addresses associated with the default receiver, that the Alert manager sends alerts to. +The source of the alerts are data sources within the same Project and region as the Alert manager. +If you need to receive alerts for other receivers, you can create additional contact points and receivers in Grafana. Make sure that you select the Scaleway Alert manager. + +**Usage:** + +``` +scw cockpit contact-point create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| email.to | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a contact point + +Delete a contact point associated with the default receiver. + +**Usage:** + +``` +scw cockpit contact-point delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| email.to | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List contact points + +Retrieve a list of contact points for the specified Project. The response lists all contact points and receivers created in Grafana or via the API. + +**Usage:** + +``` +scw cockpit contact-point list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Datasource management commands + +Datasource management commands. + + +### Create a data source + +You must specify the data source type upon creation. Available data source types include: + - metrics + - logs + - traces +The name of the data source will then be used as reference to name the associated Grafana data source. + +**Usage:** + +``` +scw cockpit data-source create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Data source name | +| type | One of: `unknown_type`, `metrics`, `logs`, `traces`, `alerts` | Data source type | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a data source + +Delete a given data source, specified by the data source ID. Note that deleting a data source is irreversible, and cannot be undone. + +**Usage:** + +``` +scw cockpit data-source delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| data-source-id | Required | ID of the data source to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a data source + +Retrieve information about a given data source, specified by the data source ID. The data source's information such as its name, type, URL, origin, and retention period, is returned. + +**Usage:** + +``` +scw cockpit data-source get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| data-source-id | Required | ID of the relevant data source | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List data sources + +Retrieve the list of data sources available in the specified region. By default, the data sources returned in the list are ordered by creation date, in ascending order. +You can list data sources by Project, type and origin. + +**Usage:** + +``` +scw cockpit data-source list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `type_asc`, `type_desc` | Sort order for data sources in the response | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| origin | One of: `unknown_origin`, `scaleway`, `external` | Origin to filter for, only data sources with matching origin will be returned | +| types.{index} | One of: `unknown_type`, `metrics`, `logs`, `traces`, `alerts` | Types to filter for, only data sources with matching types will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a data source + +Update a given data source name, specified by the data source ID. + +**Usage:** + +``` +scw cockpit data-source update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| data-source-id | Required | ID of the data source to update | +| name | | Updated name of the data source | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Grafana user management commands + +Grafana user management commands. + + +### Get your Cockpit's Grafana + +Retrieve information on your Cockpit's Grafana, specified by the ID of the Project the Cockpit belongs to. +The output returned displays the URL to access your Cockpit's Grafana. + +**Usage:** + +``` +scw cockpit grafana get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Synchronize Grafana data sources + +Trigger the synchronization of all your data sources and the alert manager in the relevant regions. The alert manager will only be synchronized if you have enabled it. + +**Usage:** + +``` +scw cockpit grafana sync-data-sources [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +## Grafana user management commands + +Grafana user management commands. + + +### Create a Grafana user + +Create a Grafana user to connect to your Cockpit's Grafana. Upon creation, your user password displays only once, so make sure that you save it. +Each Grafana user is associated with a role: viewer or editor. A viewer can only view dashboards, whereas an editor can create and edit dashboards. Note that the `admin` username is not available for creation. + +**Usage:** + +``` +scw cockpit grafana-user create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| login | | Username of the Grafana user. Note that the `admin` username is not available for creation | +| role | One of: `unknown_role`, `editor`, `viewer` | Role assigned to the Grafana user | + + + +### Delete a Grafana user + +Delete a Grafana user from your Cockpit's Grafana, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. + +**Usage:** + +``` +scw cockpit grafana-user delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| grafana-user-id | Required | ID of the Grafana user | + + + +### List Grafana users + +List all Grafana users created in your Cockpit's Grafana. By default, the Grafana users returned in the list are ordered in ascending order. + +**Usage:** + +``` +scw cockpit grafana-user list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `login_asc`, `login_desc` | Order of the Grafana users | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Reset a Grafana user password + +Reset the password of a Grafana user, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. +A new password regenerates and only displays once. Make sure that you save it. + +**Usage:** + +``` +scw cockpit grafana-user reset-password [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| grafana-user-id | Required | ID of the Grafana user | + + + +## Managed alerts management commands + +Managed alerts management commands. + + +### Disable managed alerts + +Disable the sending of managed alerts for the specified Project. + +**Usage:** + +``` +scw cockpit managed-alerts disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable managed alerts + +Enable the sending of managed alerts for the specified Project. Managed alerts are predefined alerts that apply to Scaleway recources integrated with Cockpit by default. + +**Usage:** + +``` +scw cockpit managed-alerts enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Pricing plans management commands + +Pricing plans management commands. + + +### Get current plan + +Retrieve a pricing plan for the given Project, specified by the ID of the Project. + +**Usage:** + +``` +scw cockpit plan get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### List plan types + +Retrieve a list of available pricing plan types. + +**Usage:** + +``` +scw cockpit plan list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc` | | + + + +### Apply a pricing plan + +Apply a pricing plan on a given Project. You must specify the ID of the pricing plan type. Note that you will be billed for the plan you apply. + +**Usage:** + +``` +scw cockpit plan select [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| plan-name | One of: `unknown_name`, `free`, `premium`, `custom` | Name of the pricing plan | + + + +## Product dashboards management commands + +Product dashboards management commands. + + +### Get Scaleway resource dashboard + +Retrieve information about the dashboard of a Scaleway resource in Grafana, specified by the ID of the Project the Cockpit belongs to, and the name of the dashboard. + +**Usage:** + +``` +scw cockpit product-dashboards get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| dashboard-name | Required | Name of the dashboard | + + + +### List Scaleway resources dashboards + +Retrieve a list of available dashboards in Grafana, for all Scaleway resources which are integrated with Cockpit. + +**Usage:** + +``` +scw cockpit product-dashboards list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags to filter for | + + + +## Test alert management commands + +Test alert management commands. + + +### Trigger a test alert + +Send a test alert to the Alert manager to make sure your contact points get notified. + +**Usage:** + +``` +scw cockpit test-alert trigger [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Token management commands + +Token management commands. + + +### Create a token + +Give your token the relevant scopes to ensure it has the right permissions to interact with your data sources and the Alert manager. Make sure that you create your token in the same regions as the data sources you want to use it for. +Upon creation, your token's secret key display only once. Make sure that you save it. + +**Usage:** + +``` +scw cockpit token create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name of the token | +| token-scopes.{index} | One of: `unknown_scope`, `read_only_metrics`, `write_only_metrics`, `full_access_metrics_rules`, `read_only_logs`, `write_only_logs`, `full_access_logs_rules`, `full_access_alert_manager`, `read_only_traces`, `write_only_traces` | Token permission scopes | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a token + +Delete a given token, specified by the token ID. Deleting a token is irreversible and cannot be undone. + +**Usage:** + +``` +scw cockpit token delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | ID of the token to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a token + +Retrieve information about a given token, specified by the token ID. The token's information such as its scopes, is returned. + +**Usage:** + +``` +scw cockpit token get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | Token ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List tokens + +Retrieve a list of all tokens in the specified region. By default, tokens returned in the list are ordered by creation date, in ascending order. +You can filter tokens by Project ID and token scopes. + +**Usage:** + +``` +scw cockpit token list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| token-scopes.{index} | One of: `unknown_scope`, `read_only_metrics`, `write_only_metrics`, `full_access_metrics_rules`, `read_only_logs`, `write_only_logs`, `full_access_logs_rules`, `full_access_alert_manager`, `read_only_traces`, `write_only_traces` | Token scopes to filter for | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Usage overview management commands + +Usage overview management commands. + + +### Get data source usage overview + +Retrieve the data source usage overview per type for the specified Project. + +**Usage:** + +``` +scw cockpit usage-overview get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| interval | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/config.md b/docs/docs/config.md new file mode 100644 index 0000000000..24c0a01323 --- /dev/null +++ b/docs/docs/config.md @@ -0,0 +1,310 @@ + +# Documentation for `scw config` +Config management engine is common across all Scaleway developer tools (CLI, terraform, SDK, ... ). It allows to handle Scaleway config through two ways: environment variables and/or config file. +Default path for configuration file is based on the following priority order: + +- $SCW_CONFIG_PATH +- $XDG_CONFIG_HOME/scw/config.yaml +- $HOME/.config/scw/config.yaml +- $USERPROFILE/.config/scw/config.yaml + +In this CLI, environment variables have priority over the configuration file. + +The following environment variables are supported: + +|Environment Variable|Description| +|--|--| +|SCW_ACCESS_KEY|The access key of a token (create a token at https://console.scaleway.com/iam/api-keys)| +|SCW_SECRET_KEY|The secret key of a token (create a token at https://console.scaleway.com/iam/api-keys)| +|SCW_DEFAULT_ORGANIZATION_ID|The default organization ID (get your organization ID at https://console.scaleway.com/iam/api-keys)| +|SCW_DEFAULT_PROJECT_ID|The default project ID (get your project ID at https://console.scaleway.com/iam/api-keys)| +|SCW_DEFAULT_REGION|The default region| +|SCW_DEFAULT_ZONE|The default availability zone| +|SCW_API_URL|URL of the API| +|SCW_INSECURE|Set this to true to enable the insecure mode| +|SCW_PROFILE|Set the config profile to use| + +Read more about the config management engine at https://github.com/scaleway/scaleway-sdk-go/tree/master/scw#scaleway-config + +- [Destroy the config file](#destroy-the-config-file) +- [Dump the config file](#dump-the-config-file) +- [Get a value from the config file](#get-a-value-from-the-config-file) +- [Import configurations from another file](#import-configurations-from-another-file) +- [Get config values from the config file for the current profile](#get-config-values-from-the-config-file-for-the-current-profile) +- [Allows the activation and deletion of a profile from the config file](#allows-the-activation-and-deletion-of-a-profile-from-the-config-file) + - [Mark a profile as active in the config file](#mark-a-profile-as-active-in-the-config-file) + - [Delete a profile from the config file](#delete-a-profile-from-the-config-file) +- [Reset the config](#reset-the-config) +- [Set a line from the config file](#set-a-line-from-the-config-file) +- [Unset a line from the config file](#unset-a-line-from-the-config-file) +- [Validate the config](#validate-the-config) + + +## Destroy the config file + + + + + +**Usage:** + +``` +scw config destroy +``` + + + +## Dump the config file + + + + + +**Usage:** + +``` +scw config dump +``` + + + +## Get a value from the config file + + + + + +**Usage:** + +``` +scw config get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key | Required
One of: `access-key`, `secret-key`, `api-url`, `insecure`, `default-organization-id`, `default-project-id`, `default-region`, `default-zone`, `send-telemetry` | the key to get from the config | + + +**Examples:** + + +Get the default organization ID +``` +scw config get default_organization_id +``` + +Get the default region of the profile 'prod' +``` +scw -p prod config get default_region +``` + + + + +## Import configurations from another file + + + + + +**Usage:** + +``` +scw config import [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| file | Required | Path to the configuration file to import | + + + +## Get config values from the config file for the current profile + + + + + +**Usage:** + +``` +scw config info +``` + + +**Examples:** + + +Get the default config values +``` +scw config info +``` + +Get the config values of the profile 'prod' +``` +scw -p prod config info +``` + + + + +## Allows the activation and deletion of a profile from the config file + + + + +### Mark a profile as active in the config file + + + +**Usage:** + +``` +scw config profile activate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| profile-name | Required | | + + + +### Delete a profile from the config file + + + +**Usage:** + +``` +scw config profile delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | | + + + +## Reset the config + + + + + +**Usage:** + +``` +scw config reset +``` + + + +## Set a line from the config file + +This commands overwrites the configuration file parameters with user input. +The only allowed attributes are access_key, secret_key, default_organization_id, default_region, default_zone, api_url, insecure + +This commands overwrites the configuration file parameters with user input. +The only allowed attributes are access_key, secret_key, default_organization_id, default_region, default_zone, api_url, insecure + +**Usage:** + +``` +scw config set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| access-key | | A Scaleway access key | +| secret-key | | A Scaleway secret key | +| api-url | | Scaleway API URL | +| insecure | | Set to true to allow insecure HTTPS connections | +| default-organization-id | | A default Scaleway organization id | +| default-project-id | | A default Scaleway project id | +| default-region | One of: `fr-par`, `nl-ams`, `pl-waw` | A default Scaleway region | +| default-zone | One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | A default Scaleway zone | +| send-telemetry | | Set to false to disable telemetry | + + +**Examples:** + + +Update the default organization ID +``` +scw config set default_organization_id=12903058-d0e8-4366-89c3-6e666abe1f6f +``` + +Update the default region of the profile 'prod' +``` +scw -p prod config set default_region=nl-ams +``` + + + + +## Unset a line from the config file + + + + + +**Usage:** + +``` +scw config unset [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key | Required
One of: `access-key`, `secret-key`, `api-url`, `insecure`, `default-organization-id`, `default-project-id`, `default-region`, `default-zone`, `send-telemetry` | the config config key name to unset | + + + +## Validate the config + +This command validates the configuration of your Scaleway CLI tool. + +It performs the following checks: + + - YAML syntax correctness: It checks whether your config file is a valid YAML file. + - Field validity: It checks whether the fields present in the config file are valid and expected fields. This includes fields like AccessKey, SecretKey, DefaultOrganizationID, DefaultProjectID, DefaultRegion, DefaultZone, and APIURL. + - Field values: For each of the fields mentioned above, it checks whether the value assigned to it is valid. For example, it checks if the AccessKey and SecretKey are non-empty and meet the format expectations. + +The command goes through each profile present in the config file and validates it. + +This command validates the configuration of your Scaleway CLI tool. + +It performs the following checks: + + - YAML syntax correctness: It checks whether your config file is a valid YAML file. + - Field validity: It checks whether the fields present in the config file are valid and expected fields. This includes fields like AccessKey, SecretKey, DefaultOrganizationID, DefaultProjectID, DefaultRegion, DefaultZone, and APIURL. + - Field values: For each of the fields mentioned above, it checks whether the value assigned to it is valid. For example, it checks if the AccessKey and SecretKey are non-empty and meet the format expectations. + +The command goes through each profile present in the config file and validates it. + +**Usage:** + +``` +scw config validate +``` + + + diff --git a/docs/docs/container.md b/docs/docs/container.md new file mode 100644 index 0000000000..f69c7f4477 --- /dev/null +++ b/docs/docs/container.md @@ -0,0 +1,764 @@ + +# Documentation for `scw container` +This API allows you to manage your Serverless Containers. + +- [Container management commands](#container-management-commands) + - [Create a new container](#create-a-new-container) + - [Delete a container](#delete-a-container) + - [Deploy a container](#deploy-a-container) + - [Get a container](#get-a-container) + - [List all your containers](#list-all-your-containers) + - [Update an existing container](#update-an-existing-container) +- [Cron management commands](#cron-management-commands) + - [Create a new cron](#create-a-new-cron) + - [Delete an existing cron](#delete-an-existing-cron) + - [Get a cron](#get-a-cron) + - [List all your crons](#list-all-your-crons) + - [Update an existing cron](#update-an-existing-cron) +- [Deploy a container](#deploy-a-container) +- [Domain management commands](#domain-management-commands) + - [Create a domain name binding](#create-a-domain-name-binding) + - [Delete a domain name binding](#delete-a-domain-name-binding) + - [Get a domain name binding](#get-a-domain-name-binding) + - [List all domain name bindings](#list-all-domain-name-bindings) +- [Namespace management commands](#namespace-management-commands) + - [Create a new namespace](#create-a-new-namespace) + - [Delete an existing namespace](#delete-an-existing-namespace) + - [Get a namespace](#get-a-namespace) + - [List all your namespaces](#list-all-your-namespaces) + - [Update an existing namespace](#update-an-existing-namespace) +- [Token management commands](#token-management-commands) + - [Create a new revocable token](#create-a-new-revocable-token) + - [Delete a token](#delete-a-token) + - [Get a token](#get-a-token) + - [List all tokens](#list-all-tokens) +- [Trigger management commands](#trigger-management-commands) + - [Create a trigger](#create-a-trigger) + - [Delete a trigger](#delete-a-trigger) + - [Get a trigger](#get-a-trigger) + - [List all triggers](#list-all-triggers) + - [Update a trigger](#update-a-trigger) + + +## Container management commands + +Container management commands. + + +### Create a new container + +Create a new container in the specified region. + +**Usage:** + +``` +scw container container create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | | UUID of the namespace the container belongs to | +| name | | Name of the container | +| environment-variables.{key} | | Environment variables of the container | +| min-scale | | Minimum number of instances to scale the container to | +| max-scale | | Maximum number of instances to scale the container to | +| memory-limit | | Memory limit of the container in MB | +| cpu-limit | | CPU limit of the container in mvCPU | +| timeout | | Processing time limit for the container | +| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the container | +| description | | Description of the container | +| registry-image | | Name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). | +| max-concurrency | | Number of maximum concurrent executions of the container | +| protocol | One of: `unknown_protocol`, `http1`, `h2c` | Protocol the container uses | +| port | | Port the container listens on | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | +| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the container | +| local-storage-limit | | Local storage limit of the container (in MB) | +| deploy | Default: `true` | Deploy container after creation | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a container + +Delete the container associated with the specified ID. + +**Usage:** + +``` +scw container container delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | Required | UUID of the container to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Deploy a container + +Deploy a container associated with the specified ID. + +**Usage:** + +``` +scw container container deploy [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | Required | UUID of the container to deploy | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a container + +Get the container associated with the specified ID. + +**Usage:** + +``` +scw container container get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | Required | UUID of the container to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your containers + +List all containers for a specified region. + +**Usage:** + +``` +scw container container list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the containers | +| namespace-id | | UUID of the namespace the container belongs to | +| name | | Name of the container | +| project-id | | UUID of the Project the container belongs to | +| organization-id | | UUID of the Organization the container belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing container + +Update the container associated with the specified ID. + +**Usage:** + +``` +scw container container update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | Required | UUID of the container to update | +| environment-variables.{key} | | Environment variables of the container | +| min-scale | | Minimum number of instances to scale the container to | +| max-scale | | Maximum number of instances to scale the container to | +| memory-limit | | Memory limit of the container in MB | +| cpu-limit | | CPU limit of the container in mvCPU | +| timeout | | Processing time limit for the container | +| redeploy | | Defines whether to redeploy failed containers | +| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy settings of the container | +| description | | Description of the container | +| registry-image | | Name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). | +| max-concurrency | | Number of maximum concurrent executions of the container | +| protocol | One of: `unknown_protocol`, `http1`, `h2c` | | +| port | | | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | +| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the container | +| local-storage-limit | | Local storage limit of the container (in MB) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Cron management commands + +Cron management commands. + + +### Create a new cron + +Create a new cron. + +**Usage:** + +``` +scw container cron create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | | UUID of the container to invoke by the cron | +| schedule | | UNIX cron shedule | +| args | | Arguments to pass with the cron | +| name | | Name of the cron to create | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing cron + +Delete the cron associated with the specified ID. + +**Usage:** + +``` +scw container cron delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a cron + +Get the cron associated with the specified ID. + +**Usage:** + +``` +scw container cron get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your crons + +List all your crons. + +**Usage:** + +``` +scw container cron list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the crons | +| container-id | | UUID of the container invoked by the cron | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing cron + +Update the cron associated with the specified ID. + +**Usage:** + +``` +scw container cron update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to update | +| container-id | | UUID of the container invoked by the cron | +| schedule | | UNIX cron schedule | +| args | | Arguments to pass with the cron | +| name | | Name of the cron | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Deploy a container + +Automatically build and deploy a container. + +Automatically build and deploy a container. + +**Usage:** + +``` +scw container deploy [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the application (defaults to build-source's directory name) | +| builder | Default: `paketobuildpacks/builder:base` | Builder image to use | +| dockerfile | Default: `Dockerfile` | Path to the Dockerfile | +| force-builder | Default: `false` | Force the use of the builder image (even if a Dockerfile is present) | +| build-source | Default: `.` | Path to the build context | +| cache | Default: `true` | Use cache when building the image | +| build-args.{key} | | Build-time variables | +| port | Default: `8080` | Port to expose | +| namespace-id | | Container Namespace ID to deploy to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Domain management commands + +Domain management commands. + + +### Create a domain name binding + +Create a domain name binding for the container with the specified ID. + +**Usage:** + +``` +scw container domain create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hostname | | Domain to assign | +| container-id | | UUID of the container to assign the domain to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a domain name binding + +Delete the domain name binding with the specific ID. + +**Usage:** + +``` +scw container domain delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | UUID of the domain to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a domain name binding + +Get a domain name binding for the container with the specified ID. + +**Usage:** + +``` +scw container domain get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | UUID of the domain to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all domain name bindings + +List all domain name bindings in a specified region. + +**Usage:** + +``` +scw container domain list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `hostname_asc`, `hostname_desc` | Order of the domains | +| container-id | | UUID of the container the domain belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Namespace management commands + +Namespace management commands. + + +### Create a new namespace + +Create a new namespace in a specified region. + +**Usage:** + +``` +scw container namespace create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the namespace to create | +| environment-variables.{key} | | Environment variables of the namespace to create | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| description | | Description of the namespace to create | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing namespace + +Delete the namespace associated with the specified ID. + +**Usage:** + +``` +scw container namespace delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a namespace + +Get the namespace associated with the specified ID. + +**Usage:** + +``` +scw container namespace get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your namespaces + +List all namespaces in a specified region. + +**Usage:** + +``` +scw container namespace list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the namespaces | +| name | | Name of the namespaces | +| project-id | | UUID of the Project the namespace belongs to | +| organization-id | | UUID of the Organization the namespace belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing namespace + +Update the space associated with the specified ID. + +**Usage:** + +``` +scw container namespace update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace to update | +| environment-variables.{key} | | Environment variables of the namespace to update | +| description | | Description of the namespace to update | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Token management commands + +Token management commands. + + +### Create a new revocable token + +Create a new revocable token. + +**Usage:** + +``` +scw container token create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| container-id | | UUID of the container to create the token for | +| namespace-id | | UUID of the namespace to create the token for | +| description | | Description of the token | +| expires-at | | Expiry date of the token | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a token + +Delete a token with a specified ID. + +**Usage:** + +``` +scw container token delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | UUID of the token to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a token + +Get a token with a specified ID. + +**Usage:** + +``` +scw container token get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | UUID of the token to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all tokens + +List all tokens belonging to a specified Organization or Project. + +**Usage:** + +``` +scw container token list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the tokens | +| container-id | | UUID of the container the token belongs to | +| namespace-id | | UUID of the namespace the token belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Trigger management commands + +Trigger management commands. + + +### Create a trigger + +Create a new trigger for a specified container. + +**Usage:** + +``` +scw container trigger create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | Name of the trigger | +| container-id | Required | ID of the container to trigger | +| description | | Description of the trigger | +| scw-sqs-config.queue | | Name of the SQS queue the trigger should listen to | +| scw-sqs-config.mnq-project-id | | ID of the Messaging and Queuing project | +| scw-sqs-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | +| scw-nats-config.subject | | Name of the NATS subject the trigger should listen to | +| scw-nats-config.mnq-nats-account-id | | ID of the Messaging and Queuing NATS account | +| scw-nats-config.mnq-project-id | | ID of the Messaging and Queuing project | +| scw-nats-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a trigger + +Delete a trigger with a specified ID. + +**Usage:** + +``` +scw container trigger delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a trigger + +Get a trigger with a specified ID. + +**Usage:** + +``` +scw container trigger get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all triggers + +List all triggers belonging to a specified Organization or Project. + +**Usage:** + +``` +scw container trigger list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order in which to return results | +| container-id | | ID of the container the triggers belongs to | +| namespace-id | | ID of the namespace the triggers belongs to | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a trigger + +Update a trigger with a specified ID. + +**Usage:** + +``` +scw container trigger update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to update | +| name | | Name of the trigger | +| description | | Description of the trigger | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/dedibox.md b/docs/docs/dedibox.md new file mode 100644 index 0000000000..5775f188fb --- /dev/null +++ b/docs/docs/dedibox.md @@ -0,0 +1,2130 @@ + +# Documentation for `scw dedibox` +Dedibox Phoenix API. + +- [Billing commands](#billing-commands) + - [Download-invoice dedibox resources](#download-invoice-dedibox-resources) + - [Download-refund dedibox resources](#download-refund-dedibox-resources) + - [Get-invoice dedibox resources](#get-invoice-dedibox-resources) + - [Get-order-capacity dedibox resources](#get-order-capacity-dedibox-resources) + - [Get-refund dedibox resources](#get-refund-dedibox-resources) + - [List-invoice dedibox resources](#list-invoice-dedibox-resources) + - [List-refund dedibox resources](#list-refund-dedibox-resources) +- [BMC (Baseboard Management Controller) access commands](#bmc-(baseboard-management-controller)-access-commands) + - [Get BMC (Baseboard Management Controller) access for a given baremetal server](#get-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) + - [Start BMC (Baseboard Management Controller) access for a given baremetal server](#start-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) + - [Stop BMC (Baseboard Management Controller) access for a given baremetal server](#stop-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) +- [Failover IPs commands](#failover-ips-commands) + - [Attach failovers on baremetal server](#attach-failovers-on-baremetal-server) + - [Attach a failover IP to a MAC address](#attach-a-failover-ip-to-a-mac-address) + - [Order failover IPs](#order-failover-ips) + - [Delete a failover server](#delete-a-failover-server) + - [Detach failovers on baremetal server](#detach-failovers-on-baremetal-server) + - [Detach a failover IP from a MAC address](#detach-a-failover-ip-from-a-mac-address) + - [Get a specific baremetal server](#get-a-specific-baremetal-server) + - [Get remaining quota](#get-remaining-quota) + - [List failovers for project](#list-failovers-for-project) +- [IPv6 block commands](#ipv6-block-commands) + - [Create IPv6 block for baremetal server](#create-ipv6-block-for-baremetal-server) + - [Create IPv6 block subnet](#create-ipv6-block-subnet) + - [Delete IPv6 block](#delete-ipv6-block) + - [Get a specific IPv6 block](#get-a-specific-ipv6-block) + - [Get IPv6 block quota](#get-ipv6-block-quota) + - [List available IPv6 block subnets](#list-available-ipv6-block-subnets) + - [Update IPv6 block](#update-ipv6-block) +- [Offer commands](#offer-commands) + - [Get offer](#get-offer) + - [List offers](#list-offers) +- [Subscribable server options commands](#subscribable-server-options-commands) + - [List subscribable server options](#list-subscribable-server-options) + - [Subscribe server option](#subscribe-server-option) + - [Subscribe storage server option](#subscribe-storage-server-option) +- [OS commands](#os-commands) + - [Get an OS with a given ID](#get-an-os-with-a-given-id) + - [List all available OS that can be install on a baremetal server](#list-all-available-os-that-can-be-install-on-a-baremetal-server) +- [RAID commands](#raid-commands) + - [Get raid](#get-raid) + - [Update RAID](#update-raid) +- [Rescue commands](#rescue-commands) + - [Get rescue information](#get-rescue-information) + - [Start in rescue baremetal server](#start-in-rescue-baremetal-server) + - [Stop rescue on baremetal server](#stop-rescue-on-baremetal-server) +- [Reverse-IP commands](#reverse-ip-commands) + - [Update reverse of ip](#update-reverse-of-ip) +- [RPN's information commands](#rpn's-information-commands) + - [Get dedibox resources](#get-dedibox-resources) + - [List dedibox resources](#list-dedibox-resources) +- [RPN V1 commands](#rpn-v1-commands) + - [Accept-invite dedibox resources](#accept-invite-dedibox-resources) + - [Add-members dedibox resources](#add-members-dedibox-resources) + - [Create dedibox resources](#create-dedibox-resources) + - [Delete dedibox resources](#delete-dedibox-resources) + - [Delete-members dedibox resources](#delete-members-dedibox-resources) + - [Get dedibox resources](#get-dedibox-resources) + - [Invite dedibox resources](#invite-dedibox-resources) + - [Leave dedibox resources](#leave-dedibox-resources) + - [List dedibox resources](#list-dedibox-resources) + - [List-capable-san-server dedibox resources](#list-capable-san-server-dedibox-resources) + - [List-capable-server dedibox resources](#list-capable-server-dedibox-resources) + - [List-invites dedibox resources](#list-invites-dedibox-resources) + - [List-members dedibox resources](#list-members-dedibox-resources) + - [Refuse-invite dedibox resources](#refuse-invite-dedibox-resources) + - [Update dedibox resources](#update-dedibox-resources) +- [](#) + - [Add-members dedibox resources](#add-members-dedibox-resources) + - [Create dedibox resources](#create-dedibox-resources) + - [Delete dedibox resources](#delete-dedibox-resources) + - [Delete-members dedibox resources](#delete-members-dedibox-resources) + - [Disable-compatibility dedibox resources](#disable-compatibility-dedibox-resources) + - [Enable-compatibility dedibox resources](#enable-compatibility-dedibox-resources) + - [Get dedibox resources](#get-dedibox-resources) + - [List dedibox resources](#list-dedibox-resources) + - [List-capable-resources dedibox resources](#list-capable-resources-dedibox-resources) + - [List-logs dedibox resources](#list-logs-dedibox-resources) + - [List-members dedibox resources](#list-members-dedibox-resources) + - [Update dedibox resources](#update-dedibox-resources) + - [Update-vlan-members dedibox resources](#update-vlan-members-dedibox-resources) +- [RPN SAN (Storage Area Network) commands](#rpn-san-(storage-area-network)-commands) + - [Add-ip dedibox resources](#add-ip-dedibox-resources) + - [Create dedibox resources](#create-dedibox-resources) + - [Delete dedibox resources](#delete-dedibox-resources) + - [Get dedibox resources](#get-dedibox-resources) + - [List dedibox resources](#list-dedibox-resources) + - [List-available-ips dedibox resources](#list-available-ips-dedibox-resources) + - [List-ips dedibox resources](#list-ips-dedibox-resources) + - [Remove-ip dedibox resources](#remove-ip-dedibox-resources) +- [Baremetal server commands](#baremetal-server-commands) + - [Cancels the current (running) server installation](#cancels-the-current-(running)-server-installation) + - [Create a baremetal server](#create-a-baremetal-server) + - [Delete a baremetal server](#delete-a-baremetal-server) + - [Get a specific baremetal server](#get-a-specific-baremetal-server) + - [Get a specific server installation status](#get-a-specific-server-installation-status) + - [Get server default partitioning](#get-server-default-partitioning) + - [Install a baremetal server](#install-a-baremetal-server) + - [List baremetal servers for project](#list-baremetal-servers-for-project) + - [List server disks](#list-server-disks) + - [List server events](#list-server-events) + - [Reboot a baremetal server](#reboot-a-baremetal-server) + - [Start a baremetal server](#start-a-baremetal-server) + - [Stop a baremetal server](#stop-a-baremetal-server) + - [Update a baremetal server](#update-a-baremetal-server) +- [Service commands](#service-commands) + - [Delete a specific service](#delete-a-specific-service) + - [Get a specific service](#get-a-specific-service) + - [List services](#list-services) + + +## Billing commands + +Billing commands. + + +### Download-invoice dedibox resources + +Download-invoice dedibox resources. + +**Usage:** + +``` +scw dedibox billing download-invoice [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| invoice-id | Required | | + + + +### Download-refund dedibox resources + +Download-refund dedibox resources. + +**Usage:** + +``` +scw dedibox billing download-refund [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| refund-id | Required | | + + + +### Get-invoice dedibox resources + +Get-invoice dedibox resources. + +**Usage:** + +``` +scw dedibox billing get-invoice [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| invoice-id | Required | | + + + +### Get-order-capacity dedibox resources + +Get-order-capacity dedibox resources. + +**Usage:** + +``` +scw dedibox billing get-order-capacity [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Get-refund dedibox resources + +Get-refund dedibox resources. + +**Usage:** + +``` +scw dedibox billing get-refund [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| refund-id | Required | | + + + +### List-invoice dedibox resources + +List-invoice dedibox resources. + +**Usage:** + +``` +scw dedibox billing list-invoice [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | | +| project-id | Default: `` | | + + + +### List-refund dedibox resources + +List-refund dedibox resources. + +**Usage:** + +``` +scw dedibox billing list-refund [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | | +| project-id | Default: `` | | + + + +## BMC (Baseboard Management Controller) access commands + +BMC (Baseboard Management Controller) access commands. + + +### Get BMC (Baseboard Management Controller) access for a given baremetal server + +Get the BMC (Baseboard Management Controller) access associated with the given ID. + +**Usage:** + +``` +scw dedibox bmc get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to get BMC access | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Start BMC (Baseboard Management Controller) access for a given baremetal server + +Start BMC (Baseboard Management Controller) access associated with the given ID. +The BMC (Baseboard Management Controller) access is available one hour after the installation of the server. + +**Usage:** + +``` +scw dedibox bmc start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to start the BMC access | +| ip | | The IP authorized to connect to the given server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Stop BMC (Baseboard Management Controller) access for a given baremetal server + +Stop BMC (Baseboard Management Controller) access associated with the given ID. + +**Usage:** + +``` +scw dedibox bmc stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to stop BMC access | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## Failover IPs commands + +Failover IPs commands. + + +### Attach failovers on baremetal server + +Attach failovers on the server associated with the given ID. + +**Usage:** + +``` +scw dedibox fip attach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | | ID of the server | +| fips-ids.{index} | Required | List of ID of failovers IP to attach | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Attach a failover IP to a MAC address + +Attach a failover IP to a MAC address. + +**Usage:** + +``` +scw dedibox fip attach-mac [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the failover IP | +| type | One of: `mac_type_unknown`, `vmware`, `kvm`, `xen` | A mac type | +| mac | | A valid mac address (existing or not) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Order failover IPs + +Order X failover IPs. + +**Usage:** + +``` +scw dedibox fip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | | Failover IP offer ID | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| quantity | | Quantity | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a failover server + +Delete the failover associated with the given ID. + +**Usage:** + +``` +scw dedibox fip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the failover IP to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach failovers on baremetal server + +Detach failovers on the server associated with the given ID. + +**Usage:** + +``` +scw dedibox fip detach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fips-ids.{index} | Required | List of IDs of failovers IP to detach | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach a failover IP from a MAC address + +Detach a failover IP from a MAC address. + +**Usage:** + +``` +scw dedibox fip detach-mac [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the failover IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a specific baremetal server + +Get the server associated with the given ID. + +**Usage:** + +``` +scw dedibox fip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the failover IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get remaining quota + +Get remaining quota. + +**Usage:** + +``` +scw dedibox fip get-quota [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | Default: `` | Project ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List failovers for project + +List failovers servers for project. + +**Usage:** + +``` +scw dedibox fip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `ip_asc`, `ip_desc` | Order of the failovers IP | +| project-id | Required
Default: `` | Filter failovers IP by project ID | +| search | | Filter failovers IP which matching with this field | +| only-available | | True: return all failovers IP not attached on server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## IPv6 block commands + +IPv6 block commands. + + +### Create IPv6 block for baremetal server + +Create IPv6 block associated with the given project ID. + +**Usage:** + +``` +scw dedibox ipv6-block create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | Default: `` | ID of the project | + + + +### Create IPv6 block subnet + +Create IPv6 block subnet for the given IP ID. +/48 could create subnet in /56 (quota link to your number of server). +/56 could create subnet in /64 (quota link to your number of failover IP). + +**Usage:** + +``` +scw dedibox ipv6-block create-subnet [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| block-id | Required | ID of the IPv6 block | +| address | | Address of the IPv6 | +| cidr | | Classless InterDomain Routing notation of the IPv6 | + + + +### Delete IPv6 block + +Delete IPv6 block subnet with the given ID. + +**Usage:** + +``` +scw dedibox ipv6-block delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| block-id | Required | ID of the IPv6 block to delete | + + + +### Get a specific IPv6 block + +Get the IPv6 block associated with the given ID. + +**Usage:** + +``` +scw dedibox ipv6-block get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | Default: `` | ID of the project | + + + +### Get IPv6 block quota + +Get IPv6 block quota with the given project ID. +/48 one per organization. +/56 link to your number of server. +/64 link to your number of failover IP. + +**Usage:** + +``` +scw dedibox ipv6-block get-quota [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | Default: `` | ID of the project | + + + +### List available IPv6 block subnets + +List all available IPv6 block subnets for given IP ID. + +**Usage:** + +``` +scw dedibox ipv6-block list-subnet [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| block-id | Required | ID of the IPv6 block | + + + +### Update IPv6 block + +Update DNS associated to IPv6 block. +If DNS is used, minimum of 2 is necessary and maximum of 5 (no duplicate). + +**Usage:** + +``` +scw dedibox ipv6-block update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| block-id | Required | ID of the IPv6 block | +| nameservers.{index} | | DNS to link to the IPv6 | + + + +## Offer commands + +Offer commands. + + +### Get offer + +Return specific offer for the given ID. + +**Usage:** + +``` +scw dedibox offer get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | Required | ID of offer | +| project-id | Default: `` | Project ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List offers + +List all available server offers. + +**Usage:** + +``` +scw dedibox offer list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `price_asc`, `price_desc` | Order of the offers | +| commercial-range | | Filter on commercial range | +| catalog | One of: `all`, `default`, `beta`, `reseller`, `premium`, `volume`, `admin`, `inactive` | Filter on catalog | +| project-id | Default: `` | Project ID | +| is-failover-ip | | Get the current failover IP offer | +| is-failover-block | | Get the current failover IP block offer | +| sold-in | | Filter offers depending on their datacenter | +| available-only | | Set this filter to true to only return available offers | +| is-rpn-san | | Get the RPN SAN offers | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Subscribable server options commands + +Subscribable server options commands. + + +### List subscribable server options + +List subscribable options associated to the given server ID. + +**Usage:** + +``` +scw dedibox option list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID of the subscribable server options | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Subscribe server option + +Subscribe option for the given server ID. + +**Usage:** + +``` +scw dedibox option subscribe [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to subscribe server option | +| option-id | | Option ID to subscribe | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Subscribe storage server option + +Subscribe storage option for the given server ID. + +**Usage:** + +``` +scw dedibox option subscribe-storage [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID of the storage options to subscribe | +| options-ids.{index} | Required | Option IDs of the storage options to subscribe | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## OS commands + +OS commands. + + +### Get an OS with a given ID + +Return specific OS for the given ID. + +**Usage:** + +``` +scw dedibox os get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| os-id | Required | ID of the OS | +| server-id | | ID of the server | +| project-id | | Project ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List all available OS that can be install on a baremetal server + +List all available OS that can be install on a baremetal server. + +**Usage:** + +``` +scw dedibox os list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `released_at_asc`, `released_at_desc` | Order of the OS | +| type | One of: `unknown_type`, `server`, `virtu`, `panel`, `desktop`, `custom`, `rescue` | Type of the OS | +| server-id | | Filter OS by compatible server ID | +| project-id | Default: `` | Project ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## RAID commands + +RAID commands. + + +### Get raid + +Return raid for the given server ID. + +**Usage:** + +``` +scw dedibox raid get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Update RAID + +Update RAID associated with the given server ID. + +**Usage:** + +``` +scw dedibox raid update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| raid-arrays.{index}.raid-level | One of: `no_raid`, `raid0`, `raid1`, `raid5`, `raid6`, `raid10` | The RAID level | +| raid-arrays.{index}.disk-ids.{index} | Required | The list of Disk ID of the updatable RAID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## Rescue commands + +Rescue commands. + + +### Get rescue information + +Return rescue information for the given server ID. + +**Usage:** + +``` +scw dedibox rescue get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to get rescue | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Start in rescue baremetal server + +Start in rescue the server associated with the given ID. + +**Usage:** + +``` +scw dedibox rescue start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to start rescue | +| os-id | | OS ID to use to start rescue | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Stop rescue on baremetal server + +Stop rescue on the server associated with the given ID. + +**Usage:** + +``` +scw dedibox rescue stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to stop rescue | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## Reverse-IP commands + +Reverse-IP commands. + + +### Update reverse of ip + +Update reverse of ip associated with the given ID. + +**Usage:** + +``` +scw dedibox reverse-ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the IP | +| reverse | | Reverse to apply on the IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## RPN's information commands + +RPN's information commands. + + +### Get dedibox resources + +Get dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-info get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | Default: `` | A project ID | +| rpnv1-group-id | | An RPN v1 group ID | +| rpnv2-group-id | | An RPN v2 group ID | + + + +### List dedibox resources + +List dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-info list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | +| project-id | Default: `` | Filter servers by project ID | + + + +## RPN V1 commands + +RPN V1 commands. + + +### Accept-invite dedibox resources + +Accept-invite dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 accept-invite [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| member-id | Required | The member ID | + + + +### Add-members dedibox resources + +Add-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 add-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | The rpn v1 group ID | +| server-ids.{index} | | A collection of rpn v1 capable server IDs | +| san-server-ids.{index} | | A collection of rpn v1 capable RPN SAN server IDs | + + + +### Create dedibox resources + +Create dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | Rpn v1 group name | +| server-ids.{index} | | A collection of rpn v1 capable servers | +| san-server-ids.{index} | | A collection of rpn v1 capable rpn sans servers | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Delete dedibox resources + +Delete dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | Rpn v1 group ID | + + + +### Delete-members dedibox resources + +Delete-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 delete-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | The rpn v1 group ID | +| member-ids.{index} | Required | A collection of rpn v1 group members IDs | + + + +### Get dedibox resources + +Get dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | Rpn v1 group ID | + + + +### Invite dedibox resources + +Invite dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 invite [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | The RPN V1 group ID | +| server-ids.{index} | Required | A collection of external server IDs | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Leave dedibox resources + +Leave dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 leave [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | The RPN V1 group ID | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| member-ids.{index} | Required | A collection of rpn v1 group members IDs | + + + +### List dedibox resources + +List dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v1 groups | +| project-id | Default: `` | Filter rpn v1 groups by project ID | + + + +### List-capable-san-server dedibox resources + +List-capable-san-server dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 list-capable-san-server [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | +| project-id | Default: `` | Filter rpn capable resources by project ID | + + + +### List-capable-server dedibox resources + +List-capable-server dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 list-capable-server [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | +| project-id | Default: `` | Filter rpn capable resources by project ID | + + + +### List-invites dedibox resources + +List-invites dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 list-invites [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### List-members dedibox resources + +List-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 list-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v1 group members | +| group-id | Required | Filter rpn v1 group members by group ID | +| project-id | Default: `` | A project ID | + + + +### Refuse-invite dedibox resources + +Refuse-invite dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 refuse-invite [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| member-id | Required | The member ID | + + + +### Update dedibox resources + +Update dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v1 update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | Rpn v1 group ID | +| name | Required | New rpn v1 group name | + + + +## + + + + +### Add-members dedibox resources + +Add-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 add-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | +| servers.{index} | Required | A collection of server IDs | + + + +### Create dedibox resources + +Create dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| type | One of: `unknown_type`, `standard`, `qinq` | RPN V2 group type (qing / standard) | +| name | | RPN V2 group name | +| servers.{index} | Required | A collection of server IDs | + + + +### Delete dedibox resources + +Delete dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | + + + +### Delete-members dedibox resources + +Delete-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 delete-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | +| member-ids.{index} | Required | A collection of member IDs | + + + +### Disable-compatibility dedibox resources + +Disable-compatibility dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 disable-compatibility [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | + + + +### Enable-compatibility dedibox resources + +Enable-compatibility dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 enable-compatibility [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | +| rpnv1-group-id | | RPN V1 group ID | + + + +### Get dedibox resources + +Get dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | + + + +### List dedibox resources + +List dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 groups | +| project-id | Default: `` | Filter rpn v2 groups by project ID | + + + +### List-capable-resources dedibox resources + +List-capable-resources dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 list-capable-resources [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 capable resources | +| project-id | Default: `` | Filter rpn v2 capable resources by project ID | + + + +### List-logs dedibox resources + +List-logs dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 list-logs [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 group logs | +| group-id | Required | RPN V2 group ID | + + + +### List-members dedibox resources + +List-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 list-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 group members | +| group-id | Required | RPN V2 group ID | +| type | One of: `unknown_type`, `rpnv1_group`, `server` | Filter members by type | + + + +### Update dedibox resources + +Update dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | +| name | | RPN V2 group name | + + + +### Update-vlan-members dedibox resources + +Update-vlan-members dedibox resources. + +**Usage:** + +``` +scw dedibox rpn-v2 update-vlan-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | RPN V2 group ID | +| member-ids.{index} | Required | RPN V2 member IDs | +| vlan | | A vlan | + + + +## RPN SAN (Storage Area Network) commands + +RPN SAN (Storage Area Network) commands. + + +### Add-ip dedibox resources + +Add-ip dedibox resources. + +**Usage:** + +``` +scw dedibox san add-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | +| ip-ids.{index} | Required | An array of IP ID | + + + +### Create dedibox resources + +Create dedibox resources. + +**Usage:** + +``` +scw dedibox san create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | Required | Offer ID | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Delete dedibox resources + +Delete dedibox resources. + +**Usage:** + +``` +scw dedibox san delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | + + + +### Get dedibox resources + +Get dedibox resources. + +**Usage:** + +``` +scw dedibox san get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | + + + +### List dedibox resources + +List dedibox resources. + +**Usage:** + +``` +scw dedibox san list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the RPN SANs | +| project-id | Default: `` | Filter RPN SANs by project ID | + + + +### List-available-ips dedibox resources + +List-available-ips dedibox resources. + +**Usage:** + +``` +scw dedibox san list-available-ips [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | +| type | One of: `unknown`, `server_ip`, `rpnv2_subnet` | Filter by IP type (server | rpnv2_subnet) | + + + +### List-ips dedibox resources + +List-ips dedibox resources. + +**Usage:** + +``` +scw dedibox san list-ips [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | +| type | One of: `unknown`, `server_ip`, `rpnv2_subnet` | Filter by IP type (server | rpnv2_subnet) | + + + +### Remove-ip dedibox resources + +Remove-ip dedibox resources. + +**Usage:** + +``` +scw dedibox san remove-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| rpn-san-id | Required | RPN SAN ID | +| ip-ids.{index} | Required | An array of IP ID | + + + +## Baremetal server commands + +Baremetal server commands. + + +### Cancels the current (running) server installation + +Cancels the current server installation associated with the given server ID. + +**Usage:** + +``` +scw dedibox server cancel-install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID of the server to cancel install | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Create a baremetal server + +Create a new baremetal server. The order return you a service ID to follow the provisionning status you could call GetService. + +**Usage:** + +``` +scw dedibox server create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | | Offer ID of the new server | +| server-option-ids.{index} | Required | Server option IDs of the new server | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| datacenter-name | | Datacenter name of the new server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a baremetal server + +Delete the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a specific baremetal server + +Get the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a specific server installation status + +Get the server installation status associated with the given server ID. + +**Usage:** + +``` +scw dedibox server get-install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID of the server to install | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get server default partitioning + +Get the server default partitioning schema associated with the given server ID and OS ID. + +**Usage:** + +``` +scw dedibox server get-partitioning [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| os-id | Required | OS ID of the default partitioning | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Install a baremetal server + +Install an OS on the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to install | +| os-id | | OS ID to install on the server | +| hostname | | Hostname of the server | +| user-login | | User to install on the server | +| user-password | | User password to install on the server | +| panel-password | | Panel password to install on the server | +| root-password | | Root password to install on the server | +| partitions.{index}.file-system | One of: `unknown`, `efi`, `swap`, `ext4`, `ext3`, `ext2`, `xfs`, `ntfs`, `fat32`, `ufs` | File system of the installation partition | +| partitions.{index}.mount-point | | Mount point of the installation partition | +| partitions.{index}.raid-level | One of: `no_raid`, `raid0`, `raid1`, `raid5`, `raid6`, `raid10` | RAID level of the installation partition | +| partitions.{index}.capacity | | Capacity of the installation partition | +| partitions.{index}.connectors.{index} | | Connectors of the installation partition | +| ssh-key-ids.{index} | | SSH key IDs authorized on the server | +| license-offer-id | | Offer ID of license to install on server | +| ip-id | | IP to link at the license to install on server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List baremetal servers for project + +List baremetal servers for project. + +**Usage:** + +``` +scw dedibox server list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | +| project-id | Required
Default: `` | Filter servers by project ID | +| search | | Filter servers by hostname | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### List server disks + +List disks associated to the given server ID. + +**Usage:** + +``` +scw dedibox server list-disks [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server disks | +| server-id | Required | Server ID of the server disks | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### List server events + +List events associated to the given server ID. + +**Usage:** + +``` +scw dedibox server list-events [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server events | +| server-id | Required | Server ID of the server events | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Reboot a baremetal server + +Reboot the server associated with the given ID, use boot param to reboot in rescue. + +**Usage:** + +``` +scw dedibox server reboot [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to reboot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Start a baremetal server + +Start the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to start | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Stop a baremetal server + +Stop the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to stop | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a baremetal server + +Update the server associated with the given ID. + +**Usage:** + +``` +scw dedibox server update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to update | +| hostname | | Hostname of the server to update | +| enable-ipv6 | | Flag to enable or not the IPv6 of server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## Service commands + +Service commands. + + +### Delete a specific service + +Delete the service associated with the given ID. + +**Usage:** + +``` +scw dedibox service delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| service-id | Required | ID of the service | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a specific service + +Get the service associated with the given ID. + +**Usage:** + +``` +scw dedibox service get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| service-id | Required | ID of the service | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List services + +List services. + +**Usage:** + +``` +scw dedibox service list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the services | +| project-id | Default: `` | Project ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/dns.md b/docs/docs/dns.md new file mode 100644 index 0000000000..c9d28e6a2e --- /dev/null +++ b/docs/docs/dns.md @@ -0,0 +1,746 @@ + +# Documentation for `scw dns` +This API allows you to manage your domains, DNS zones and records. + +- [TLS certificate management](#tls-certificate-management) + - [Create or get the DNS zone's TLS certificate](#create-or-get-the-dns-zone's-tls-certificate) + - [Delete a TLS certificate](#delete-a-tls-certificate) + - [Get a DNS zone's TLS certificate](#get-a-dns-zone's-tls-certificate) + - [List a user's TLS certificates](#list-a-user's-tls-certificates) +- [DNS records management](#dns-records-management) + - [Add a new DNS record](#add-a-new-dns-record) + - [Update records within a DNS zone](#update-records-within-a-dns-zone) + - [Clear records within a DNS zone](#clear-records-within-a-dns-zone) + - [Delete a DNS record](#delete-a-dns-record) + - [List records within a DNS zone](#list-records-within-a-dns-zone) + - [List name servers within a DNS zone](#list-name-servers-within-a-dns-zone) + - [Update a DNS record](#update-a-dns-record) + - [Update name servers within a DNS zone](#update-name-servers-within-a-dns-zone) +- [Transaction SIGnature key management](#transaction-signature-key-management) + - [Delete the DNS zone's TSIG key](#delete-the-dns-zone's-tsig-key) + - [Get the DNS zone's TSIG key](#get-the-dns-zone's-tsig-key) +- [DNS zones version management](#dns-zones-version-management) + - [Access differences from a specific DNS zone version](#access-differences-from-a-specific-dns-zone-version) + - [List versions of a DNS zone](#list-versions-of-a-dns-zone) + - [Restore a DNS zone version](#restore-a-dns-zone-version) + - [List records from a given version of a specific DNS zone](#list-records-from-a-given-version-of-a-specific-dns-zone) +- [DNS Zones management](#dns-zones-management) + - [Clone a DNS zone](#clone-a-dns-zone) + - [Create a DNS zone](#create-a-dns-zone) + - [Delete a DNS zone](#delete-a-dns-zone) + - [Export a raw DNS zone](#export-a-raw-dns-zone) + - [Import a raw DNS zone](#import-a-raw-dns-zone) + - [List DNS zones](#list-dns-zones) + - [Refresh a DNS zone](#refresh-a-dns-zone) + - [Update a DNS zone](#update-a-dns-zone) + + +## TLS certificate management + +TLS certificate management. + + +### Create or get the DNS zone's TLS certificate + +Create a new TLS certificate or retrieve information about an existing TLS certificate. + +**Usage:** + +``` +scw dns certificate create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | +| alternative-dns-zones.{index} | | | + + + +### Delete a TLS certificate + +Delete an existing TLS certificate specified by its DNS zone. Deleting a TLS certificate is permanent and cannot be undone. + +**Usage:** + +``` +scw dns certificate delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | + + + +### Get a DNS zone's TLS certificate + +Get the DNS zone's TLS certificate. If you do not have a certificate, the ouptut returns `no certificate found`. + +**Usage:** + +``` +scw dns certificate get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | + + + +### List a user's TLS certificates + +List all the TLS certificates a user has created, specified by the user's Project ID and the DNS zone. + +**Usage:** + +``` +scw dns certificate list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | +| project-id | | | + + + +## DNS records management + +DNS records management. + + +### Add a new DNS record + + + +**Usage:** + +``` +scw dns record add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone in which to add the record | +| data | Required | | +| name | | | +| priority | | | +| ttl | Required
Default: `3600` | | +| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | +| comment | | | +| geo-ip-config.matches.{index}.countries.{index} | | | +| geo-ip-config.matches.{index}.continents.{index} | | | +| geo-ip-config.matches.{index}.data | | | +| geo-ip-config.default | | | +| http-service-config.ips.{index} | | | +| http-service-config.must-contain | | | +| http-service-config.url | | | +| http-service-config.user-agent | | | +| http-service-config.strategy | One of: `random`, `hashed` | | +| weighted-config.weighted-ips.{index}.ip | | | +| weighted-config.weighted-ips.{index}.weight | | | +| view-config.views.{index}.subnet | | | +| view-config.views.{index}.data | | | + + +**Examples:** + + +Add a CNAME +``` +scw dns record add my-domain.tld data=www name=www2 type=CNAME +``` + +Add an IP +``` +scw dns record add my-domain.tld data=1.2.3.4 name=vpn type=A +``` + + + + +### Update records within a DNS zone + +Update records within a DNS zone that has default name servers and perform several actions on your records. + +Actions include: + - add: allows you to add a new record or add a new IP to an existing A record, for example + - set: allows you to edit a record or edit an IP from an existing A record, for example + - delete: allows you to delete a record or delete an IP from an existing A record, for example + - clear: allows you to delete all records from a DNS zone + +All edits will be versioned. + +**Usage:** + +``` +scw dns record bulk-update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone in which to update the DNS zone records | +| changes.{index}.add.records.{index}.data | | | +| changes.{index}.add.records.{index}.name | | | +| changes.{index}.add.records.{index}.priority | | | +| changes.{index}.add.records.{index}.ttl | | | +| changes.{index}.add.records.{index}.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | +| changes.{index}.add.records.{index}.comment | | | +| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.countries.{index} | | | +| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.continents.{index} | | | +| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.data | | | +| changes.{index}.add.records.{index}.geo-ip-config.default | | | +| changes.{index}.add.records.{index}.http-service-config.ips.{index} | | | +| changes.{index}.add.records.{index}.http-service-config.must-contain | | | +| changes.{index}.add.records.{index}.http-service-config.url | | | +| changes.{index}.add.records.{index}.http-service-config.user-agent | | | +| changes.{index}.add.records.{index}.http-service-config.strategy | One of: `random`, `hashed`, `all` | | +| changes.{index}.add.records.{index}.weighted-config.weighted-ips.{index}.ip | | | +| changes.{index}.add.records.{index}.weighted-config.weighted-ips.{index}.weight | | | +| changes.{index}.add.records.{index}.view-config.views.{index}.subnet | | | +| changes.{index}.add.records.{index}.view-config.views.{index}.data | | | +| changes.{index}.add.records.{index}.id | | | +| changes.{index}.set.id | | | +| changes.{index}.set.id-fields.name | | | +| changes.{index}.set.id-fields.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | +| changes.{index}.set.id-fields.data | | | +| changes.{index}.set.id-fields.ttl | | | +| changes.{index}.set.records.{index}.data | | | +| changes.{index}.set.records.{index}.name | | | +| changes.{index}.set.records.{index}.priority | | | +| changes.{index}.set.records.{index}.ttl | | | +| changes.{index}.set.records.{index}.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | +| changes.{index}.set.records.{index}.comment | | | +| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.countries.{index} | | | +| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.continents.{index} | | | +| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.data | | | +| changes.{index}.set.records.{index}.geo-ip-config.default | | | +| changes.{index}.set.records.{index}.http-service-config.ips.{index} | | | +| changes.{index}.set.records.{index}.http-service-config.must-contain | | | +| changes.{index}.set.records.{index}.http-service-config.url | | | +| changes.{index}.set.records.{index}.http-service-config.user-agent | | | +| changes.{index}.set.records.{index}.http-service-config.strategy | One of: `random`, `hashed`, `all` | | +| changes.{index}.set.records.{index}.weighted-config.weighted-ips.{index}.ip | | | +| changes.{index}.set.records.{index}.weighted-config.weighted-ips.{index}.weight | | | +| changes.{index}.set.records.{index}.view-config.views.{index}.subnet | | | +| changes.{index}.set.records.{index}.view-config.views.{index}.data | | | +| changes.{index}.set.records.{index}.id | | | +| changes.{index}.delete.id | | | +| changes.{index}.delete.id-fields.name | | | +| changes.{index}.delete.id-fields.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | +| changes.{index}.delete.id-fields.data | | | +| changes.{index}.delete.id-fields.ttl | | | +| return-all-records | | Specifies whether or not to return all the records | +| disallow-new-zone-creation | | Disable the creation of the target zone if it does not exist. Target zone creation is disabled by default | +| serial | | Use the provided serial (0) instead of the auto-increment serial | + + + +### Clear records within a DNS zone + +Delete all records within a DNS zone that has default name servers.
+All edits will be versioned. + +**Usage:** + +``` +scw dns record clear [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to clear | + + + +### Delete a DNS record + + + +**Usage:** + +``` +scw dns record delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone in which to delete the record | +| data | | | +| name | | | +| ttl | | | +| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | + + +**Examples:** + + +Delete a CNAME +``` +scw dns record delete my-domain.tld name=www type=CNAME +``` + +Delete a single IP from a record with more than one +``` +scw dns record delete my-domain.tld data=1.2.3.4 name=vpn type=A +``` + + + + +### List records within a DNS zone + +Retrieve a list of DNS records within a DNS zone that has default name servers. +You can filter records by type and name. + +**Usage:** + +``` +scw dns record list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID on which to filter the returned DNS zone records | +| order-by | One of: `name_asc`, `name_desc` | Sort order of the returned DNS zone records | +| dns-zone | Required | DNS zone on which to filter the returned DNS zone records | +| name | | Name on which to filter the returned DNS zone records | +| type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | Record type on which to filter the returned DNS zone records | +| id | | Record ID on which to filter the returned DNS zone records | + + + +### List name servers within a DNS zone + +Retrieve a list of name servers within a DNS zone and their optional glue records. + +**Usage:** + +``` +scw dns record list-nameservers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID on which to filter the returned DNS zone name servers | +| dns-zone | Required | DNS zone on which to filter the returned DNS zone name servers | + + + +### Update a DNS record + +This command will replace all the data for this record with the given values. + +**Usage:** + +``` +scw dns record set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone in which to set the record | +| values.{index} | Required | A list of values for replacing the record data. (multiple values cannot be used for all type) | +| name | Required | | +| priority | | | +| ttl | Required
Default: `3600` | | +| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | +| comment | | | +| geo-ip-config.matches.{index}.countries.{index} | | | +| geo-ip-config.matches.{index}.continents.{index} | | | +| geo-ip-config.matches.{index}.data | | | +| geo-ip-config.default | | | +| http-service-config.ips.{index} | | | +| http-service-config.must-contain | | | +| http-service-config.url | | | +| http-service-config.user-agent | | | +| http-service-config.strategy | One of: `random`, `hashed` | | +| weighted-config.weighted-ips.{index}.ip | | | +| weighted-config.weighted-ips.{index}.weight | | | +| view-config.views.{index}.subnet | | | +| view-config.views.{index}.data | | | + + +**Examples:** + + +Add or replace a CNAME +``` +scw dns record set my-domain.tld values.0=www name=www2 type=CNAME +``` + +Add or replace a list of IP +``` +scw dns record set my-domain.tld values.0=1.2.3.4 values.1=1.2.3.5 name=vpn type=A +``` + + + + +### Update name servers within a DNS zone + +Update name servers within a DNS zone and set optional glue records. + +**Usage:** + +``` +scw dns record update-nameservers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone in which to update the DNS zone name servers | +| ns.{index}.name | | | +| ns.{index}.ip.{index} | | | + + + +## Transaction SIGnature key management + +Transaction SIGnature key management. + + +### Delete the DNS zone's TSIG key + +Delete an existing TSIG key specified by its DNS zone. Deleting a TSIG key is permanent and cannot be undone. + +**Usage:** + +``` +scw dns tsig-key delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | + + + +### Get the DNS zone's TSIG key + +Retrieve information about the TSIG key of a given DNS zone to allow AXFR requests. + +**Usage:** + +``` +scw dns tsig-key get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | + + + +## DNS zones version management + +DNS zones version management. + + +### Access differences from a specific DNS zone version + +Access a previous DNS zone version to see the differences from another specific version. + +**Usage:** + +``` +scw dns version diff [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone-version-id | Required | | + + + +### List versions of a DNS zone + +Retrieve a list of a DNS zone's versions.
+The maximum version count is 100. If the count reaches this limit, the oldest version will be deleted after each new modification. + +**Usage:** + +``` +scw dns version list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | | + + + +### Restore a DNS zone version + +Restore and activate a version of a specific DNS zone. + +**Usage:** + +``` +scw dns version restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone-version-id | Required | | + + + +### List records from a given version of a specific DNS zone + +Retrieve a list of records from a specific DNS zone version. + +**Usage:** + +``` +scw dns version show [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone-version-id | Required | | + + + +## DNS Zones management + +DNS Zones management. + + +### Clone a DNS zone + +Clone an existing DNS zone with all its records into a new DNS zone. + +**Usage:** + +``` +scw dns zone clone [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to clone | +| dest-dns-zone | Required | Destination DNS zone in which to clone the chosen DNS zone | +| overwrite | | Specifies whether or not the destination DNS zone will be overwritten | +| project-id | | Project ID of the destination DNS zone | + + + +### Create a DNS zone + +Create a new DNS zone specified by the domain name, the subdomain and the Project ID. + +**Usage:** + +``` +scw dns zone create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain | Required | Domain in which to crreate the DNS zone | +| subdomain | Required | Subdomain of the DNS zone to create | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Delete a DNS zone + +Delete a DNS zone and all its records. + +**Usage:** + +``` +scw dns zone delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to delete | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + +### Export a raw DNS zone + +Export a DNS zone with default name servers, in a specific format. + +**Usage:** + +``` +scw dns zone export [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to export | +| format | Default: `bind`
One of: `unknown_raw_format`, `bind` | DNS zone format | + + + +### Import a raw DNS zone + +Import and replace the format of records from a given provider, with default name servers. + +**Usage:** + +``` +scw dns zone import [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to import | +| ~~content~~ | Deprecated | | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| ~~format~~ | Deprecated
One of: `unknown_raw_format`, `bind` | | +| bind-source.content | | | +| axfr-source.name-server | | | +| axfr-source.tsig-key.name | | | +| axfr-source.tsig-key.key | | | +| axfr-source.tsig-key.algorithm | | | + + + +### List DNS zones + +Retrieve the list of DNS zones you can manage and filter DNS zones associated with specific domain names. + +**Usage:** + +``` +scw dns zone list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID on which to filter the returned DNS zones | +| order-by | One of: `domain_asc`, `domain_desc`, `subdomain_asc`, `subdomain_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Sort order of the returned DNS zones | +| domain | | Domain on which to filter the returned DNS zones | +| ~~dns-zone~~ | Deprecated | DNS zone on which to filter the returned DNS zones | +| dns-zones.{index} | | DNS zones on which to filter the returned DNS zones | +| created-after | | Only list DNS zones created after this date | +| created-before | | Only list DNS zones created before this date | +| updated-after | | Only list DNS zones updated after this date | +| updated-before | | Only list DNS zones updated before this date | +| organization-id | | Organization ID on which to filter the returned DNS zones | + + + +### Refresh a DNS zone + +Refresh an SOA DNS zone to reload the records in the DNS zone and update the SOA serial. +You can recreate the given DNS zone and its sub DNS zone if needed. + +**Usage:** + +``` +scw dns zone refresh [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to refresh | +| recreate-dns-zone | | Specifies whether or not to recreate the DNS zone | +| recreate-sub-dns-zone | | Specifies whether or not to recreate the sub DNS zone | + + + +### Update a DNS zone + +Update the name and/or the Organizations for a DNS zone. + +**Usage:** + +``` +scw dns zone update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-zone | Required | DNS zone to update | +| new-dns-zone | Required | Name of the new DNS zone to create | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + + diff --git a/docs/docs/document-db.md b/docs/docs/document-db.md new file mode 100644 index 0000000000..abd10bb3b3 --- /dev/null +++ b/docs/docs/document-db.md @@ -0,0 +1,1217 @@ + +# Documentation for `scw document-db` +This API allows you to manage your Document Databases. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) + - [Add an ACL rule to a Database Instance](#add-an-acl-rule-to-a-database-instance) + - [Delete ACL rules of a Database Instance](#delete-acl-rules-of-a-database-instance) + - [List ACL rules of a Database Instance](#list-acl-rules-of-a-database-instance) + - [Set ACL rules for a Database Instance](#set-acl-rules-for-a-database-instance) +- [Database management commands](#database-management-commands) + - [Create a database in a Database Instance](#create-a-database-in-a-database-instance) + - [Delete a database in a Database Instance](#delete-a-database-in-a-database-instance) + - [List databases in a Database Instance](#list-databases-in-a-database-instance) +- [Endpoint management](#endpoint-management) + - [Create a new Database Instance endpoint](#create-a-new-database-instance-endpoint) + - [Delete a Database Instance endpoint](#delete-a-database-instance-endpoint) + - [Get a Database Instance endpoint](#get-a-database-instance-endpoint) + - [Migrate Database Instance endpoint](#migrate-database-instance-endpoint) +- [Database engines commands](#database-engines-commands) + - [List available database engines](#list-available-database-engines) +- [Instance management commands](#instance-management-commands) + - [Clone a Database Instance](#clone-a-database-instance) + - [Create a Database Instance](#create-a-database-instance) + - [Delete a Database Instance](#delete-a-database-instance) + - [Get a Database Instance](#get-a-database-instance) + - [Get the TLS certificate of a Database Instance](#get-the-tls-certificate-of-a-database-instance) + - [Get Database Instance metrics](#get-database-instance-metrics) + - [List Database Instances](#list-database-instances) + - [Renew the TLS certificate of a Database Instance](#renew-the-tls-certificate-of-a-database-instance) + - [Restart Database Instance](#restart-database-instance) + - [Update a Database Instance](#update-a-database-instance) + - [Upgrade a Database Instance](#upgrade-a-database-instance) +- [Instance logs management commands](#instance-logs-management-commands) + - [Get given logs of a Database Instance](#get-given-logs-of-a-database-instance) + - [List available logs of a Database Instance](#list-available-logs-of-a-database-instance) + - [List remote Database Instance logs details](#list-remote-database-instance-logs-details) + - [Purge remote Database Instance logs](#purge-remote-database-instance-logs) +- [Node types management commands](#node-types-management-commands) + - [List available node types](#list-available-node-types) +- [User privileges management commands](#user-privileges-management-commands) + - [List user privileges for a database](#list-user-privileges-for-a-database) + - [Set user privileges for a database](#set-user-privileges-for-a-database) +- [Read replica management](#read-replica-management) + - [Create a Read Replica](#create-a-read-replica) + - [Create an endpoint for a Read Replica](#create-an-endpoint-for-a-read-replica) + - [Delete a Read Replica](#delete-a-read-replica) + - [Get a Read Replica](#get-a-read-replica) + - [Resync a Read Replica](#resync-a-read-replica) +- [Setting management](#setting-management) + - [Add Database Instance advanced settings](#add-database-instance-advanced-settings) + - [Delete Database Instance advanced settings](#delete-database-instance-advanced-settings) + - [Set Database Instance advanced settings](#set-database-instance-advanced-settings) +- [Block snapshot management](#block-snapshot-management) + - [Create a Database Instance snapshot](#create-a-database-instance-snapshot) + - [Delete a Database Instance snapshot](#delete-a-database-instance-snapshot) + - [Get a Database Instance snapshot](#get-a-database-instance-snapshot) + - [List snapshots](#list-snapshots) + - [Create a new Database Instance from a snapshot](#create-a-new-database-instance-from-a-snapshot) + - [Update a Database Instance snapshot](#update-a-database-instance-snapshot) +- [User management commands](#user-management-commands) + - [Create a user for a Database Instance](#create-a-user-for-a-database-instance) + - [Delete a user on a Database Instance](#delete-a-user-on-a-database-instance) + - [List users of a Database Instance](#list-users-of-a-database-instance) + - [Update a user on a Database Instance](#update-a-user-on-a-database-instance) + + +## Access Control List (ACL) management commands + +Network Access Control Lists allow you to control incoming network traffic by setting up ACL rules. + + +### Add an ACL rule to a Database Instance + +Add an additional ACL rule to a Database Instance. + +**Usage:** + +``` +scw document-db acl add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to add ACL rules to | +| rules.{index}.ip | | | +| rules.{index}.description | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete ACL rules of a Database Instance + +Delete one or more ACL rules of a Database Instance. + +**Usage:** + +``` +scw document-db acl delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to delete an ACL rule from | +| acl-rule-ips.{index} | Required | IP addresses defined in the ACL rules of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List ACL rules of a Database Instance + +List the ACL rules for a given Database Instance. The response is an array of ACL objects, each one representing an ACL that denies, allows or redirects traffic based on certain conditions. + +**Usage:** + +``` +scw document-db acl list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set ACL rules for a Database Instance + +Replace all the ACL rules of a Database Instance. + +**Usage:** + +``` +scw document-db acl set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where the ACL rules must be set | +| rules.{index}.ip | | | +| rules.{index}.description | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Database management commands + +Databases can be used to store and manage sets of structured information, or data. The interaction between the user and a database is done using a Database Engine, which provides a structured query language to add, modify or delete information from the database. + + +### Create a database in a Database Instance + +Create a new database. You must define the `name` parameter in the request. + +**Usage:** + +``` +scw document-db database create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where to create the database | +| name | | Name of the database | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a database in a Database Instance + +Delete a given database on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the database you want to delete. + +**Usage:** + +``` +scw document-db database delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where to delete the database | +| name | Required | Name of the database to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List databases in a Database Instance + +List all databases of a given Database Instance. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `name`, `managed` and `owner`. + +**Usage:** + +``` +scw document-db database list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the database | +| managed | | Defines whether or not the database is managed | +| owner | | User that owns this database | +| order-by | One of: `name_asc`, `name_desc`, `size_asc`, `size_desc` | Criteria to use when ordering database listing | +| instance-id | Required | UUID of the Database Instance to list the databases of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Endpoint management + +A point of connection to a Database Instance. The endpoint is associated with an IPv4 address and a port. It contains the information about whether the endpoint is read-write or not. The endpoints always point to the main node of a Database Instance. + +All endpoints have TLS enabled. You can use TLS to make your data and your passwords unreadable in transit to anyone but you. + +For added security, you can set up ACL rules to restrict access to your endpoint to a set of trusted hosts or networks of your choice. + +Load Balancers are used to forward traffic to the right node based on the node state (active/hot standby). The Load Balancers' configuration is set to cut off inactive connections if no TCP traffic is sent within a 6-hour timeframe. We recommend using connection pooling on the application side to renew database connections regularly. + + +### Create a new Database Instance endpoint + +Create a new endpoint for a Database Instance. You can add `load_balancer` and `private_network` specifications to the body of the request. + +**Usage:** + +``` +scw document-db endpoint create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you to which you want to add an endpoint | +| endpoint-spec.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | +| endpoint-spec.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance endpoint + +Delete the endpoint of a Database Instance. You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. + +**Usage:** + +``` +scw document-db endpoint delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance endpoint + +Retrieve information about a Database Instance endpoint. Full details about the endpoint, like `ip`, `port`, `private_network` and `load_balancer` specifications are returned in the response. + +**Usage:** + +``` +scw document-db endpoint get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Migrate Database Instance endpoint + +Migrate an existing Database Instance endpoint to another Database Instance. + +**Usage:** + +``` +scw document-db endpoint migrate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to migrate | +| instance-id | Required | UUID of the instance you want to attach the endpoint to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Database engines commands + +A database engine is the software component that stores and retrieves your data from a database. Currently FerretDB 1.X is available. + + +### List available database engines + +List the FerretDB database engines available at Scaleway. + +**Usage:** + +``` +scw document-db engine list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the database engine | +| version | | Version of the database engine | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Instance management commands + +A Database Instance is made up of one or multiple dedicated compute nodes running a single database engine. Two node settings are available: **High-Availability (HA)**, with a main node and one replica, and **standalone** with a main node. The HA standby node is linked to the main node, using synchronous replication. Synchronous replication offers the ability to confirm that all changes intended by a transaction have been transferred and applied to the synchronous replica node, providing durability to the data. + +**Note**: HA standby nodes are not accessible to users unless the main node becomes unavailable and the standby takes over. If you wish to run queries on a read-only node, you can use [Read Replicas](#path-read-replicas-create-a-read-replica) + +Read Replicas can be used for certain read-only workflows such as Business Intelligence, or for a read-only scaling of your application. Read Replicas use asynchronous replication to replicate data from the main node. + + +### Clone a Database Instance + +Clone a given Database Instance, specified by the `region` and `instance_id` parameters. The clone feature allows you to create a new Database Instance from an existing one. The clone includes all existing databases, users and permissions. You can create a clone on a Database Instance bigger than your current one. + +**Usage:** + +``` +scw document-db instance clone [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to clone | +| name | | Name of the Database Instance clone | +| node-type | | Node type of the clone | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create a Database Instance + +Create a new Database Instance. You must set the `engine`, `user_name`, `password` and `node_type` parameters. Optionally, you can specify the volume type and size. + +**Usage:** + +``` +scw document-db instance create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name of the Database Instance | +| engine | Required | Database engine of the Database Instance | +| user-name | Required | Username created when the Database Instance is created | +| password | Required | Password of the user | +| node-type | Required | Type of node to use for the Database Instance | +| is-ha-cluster | | Defines whether or not High-Availability is enabled | +| disable-backup | | Defines whether or not backups are disabled | +| tags.{index} | | Tags to apply to the Database Instance | +| init-settings.{index}.name | | | +| init-settings.{index}.value | | | +| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Type of volume where data is stored (lssd, bssd, ...) | +| volume-size | | Volume size when volume_type is not lssd | +| init-endpoints.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | +| init-endpoints.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| backup-same-region | | Defines whether to or not to store logical backups in the same region as the Database Instance | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance + +Delete a given Database Instance, specified by the `region` and `instance_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. + +**Usage:** + +``` +scw document-db instance delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance + +Retrieve information about a given Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. + +**Usage:** + +``` +scw document-db instance get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get the TLS certificate of a Database Instance + +Retrieve information about the TLS certificate of a given Database Instance. Details like name and content are returned in the response. + +**Usage:** + +``` +scw document-db instance get-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get Database Instance metrics + +Retrieve the time series metrics of a given Database Instance. You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. + +**Usage:** + +``` +scw document-db instance get-metrics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| start-date | | Start date to gather metrics from | +| end-date | | End date to gather metrics from | +| metric-name | | Name of the metric to gather | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List Database Instances + +List all Database Instances in the specified region, for a given Scaleway Organization or Scaleway Project. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. + +**Usage:** + +``` +scw document-db instance list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tags.{index} | | List Database Instances that have a given tag | +| name | | Lists Database Instances that match a name pattern | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc`, `status_desc` | Criteria to use when ordering Database Instance listings | +| project-id | | Project ID to list the Database Instance of | +| organization-id | | Please use project_id instead | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Renew the TLS certificate of a Database Instance + +Renew a TLS for a Database Instance. Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. + +**Usage:** + +``` +scw document-db instance renew-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Restart Database Instance + +Restart a given Database Instance, specified by the `region` and `instance_id` parameters. The status of the Database Instance returned in the response. + +**Usage:** + +``` +scw document-db instance restart [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to restart | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update a Database Instance + +Update the parameters of a Database Instance, including name, tags and backup schedule details. + +**Usage:** + +``` +scw document-db instance update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-schedule-frequency | | In hours | +| backup-schedule-retention | | In days | +| is-backup-schedule-disabled | | Defines whether or not the backup schedule is disabled | +| name | | Name of the Database Instance | +| instance-id | Required | UUID of the Database Instance to update | +| tags.{index} | | Tags of a Database Instance | +| logs-policy.max-age-retention | | Max age (in days) of remote logs to keep on the Database Instance | +| logs-policy.total-disk-retention | | Max disk size of remote logs to keep on the Database Instance | +| backup-same-region | | Store logical backups in the same region as the Database Instance | +| backup-schedule-start-hour | | Defines the start time of the autobackup | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Upgrade a Database Instance + +Upgrade your current Database Instance specifications like node type, high availability, volume, or the database engine version. Note that upon upgrade the `enable_ha` parameter can only be set to `true`. + +**Usage:** + +``` +scw document-db instance upgrade [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to upgrade | +| node-type | | Node type of the Database Instance you want to upgrade to | +| enable-ha | | Defines whether or not High Availability should be enabled on the Database Instance | +| volume-size | | Increase your Block volume size | +| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Change your Database Instance storage type | +| upgradable-version-id | | Update your database engine to a newer version | +| major-upgrade-workflow.upgradable-version-id | | Update your database engine to a newer version | +| major-upgrade-workflow.with-endpoints | | Include endpoint during the migration | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Instance logs management commands + +Instance logs management commands. + + +### Get given logs of a Database Instance + +Retrieve information about the logs of a Database Instance. Specify the `instance_log_id` and `region` in your request to get information such as `download_url`, `status`, `expires_at` and `created_at` about your logs in the response. + +**Usage:** + +``` +scw document-db log get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-log-id | Required | UUID of the instance_log you want | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List available logs of a Database Instance + +List the available logs of a Database Instance. By default, the logs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw document-db log list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| order-by | One of: `created_at_asc`, `created_at_desc` | Criteria to use when ordering Database Instance logs listing | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List remote Database Instance logs details + +List remote log details. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw document-db log list-details [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Purge remote Database Instance logs + +Purge a given remote log from a Database Instance. You can specify the `log_name` of the log you wish to clean from your Database Instance. + +**Usage:** + +``` +scw document-db log purge [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| log-name | | Given log name to purge | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Node types management commands + +Two node type ranges are available: + +* **General Purpose:** production-grade nodes designed for scalable database infrastructures. +* **Development:** sandbox environments and reliable performance for development and testing purposes. + + +### List available node types + +List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw document-db node-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| include-disabled-types | | Defines whether or not to include disabled types | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## User privileges management commands + +Privileges are permissions that can be granted to database users. You can manage user permissions either via the console, the Scaleway APIs. Managed Database for FerretDB provides a simplified and unified permission model through the API and the console to make things easier to manage and understand. + +Each user has associated permissions that give them access to zero or more logical databases. These include: + +* **None:** No access to the database +* **Read:** Allow users to read tables and fields in a database +* **Write:** Allow users to write content in databases. +* **Admin:** Read and write access to the data, and extended privileges depending on the database engine. + + +### List user privileges for a database + +List privileges of a user on a database. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `database_name` and `user_name`. + +**Usage:** + +``` +scw document-db privilege list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `user_name_asc`, `user_name_desc`, `database_name_asc`, `database_name_desc` | Criteria to use when ordering privileges listing | +| database-name | | Name of the database | +| instance-id | Required | UUID of the Database Instance | +| user-name | | Name of the user | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set user privileges for a database + +Set the privileges of a user on a database. You must define `database_name`, `user_name` and `permission` in the request body. + +**Usage:** + +``` +scw document-db privilege set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| database-name | | Name of the database | +| user-name | | Name of the user | +| permission | One of: `readonly`, `readwrite`, `all`, `custom`, `none` | Permission to set (Read, Read/Write, All, Custom) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Read replica management + +A Read Replica is a live copy of a Database Instance that behaves like an Instance, but that only allows read-only connections. +The replica mirrors the data of the primary Database node and any changes made are replicated to the replica asynchronously. Read Replicas allow you to scale your Database Instance for read-heavy database workloads. They can also be used for business intelligence workloads. + +A Read Replica can have at most one direct access and one Private Network endpoint. `Loadbalancer` endpoints are not available on Read Replicas even if this resource is displayed in the Read Replica response example. + +If you want to remove a Read Replica endpoint, you can use [delete a Database Instance endpoint](#path-endpoints-delete-a-database-instance-endpoint) API call. + +Instance Access Control Lists (ACL) also apply to Read Replica direct access endpoints. + +**Limitations:** +There might be replication lags between the primary node and its Read Replica nodes. You can try to reduce this lag with some good practices: +* All your tables should have a primary key +* Don't run large transactions that modify, delete or insert lots of rows. Try to split it into several small transactions. + + +### Create a Read Replica + +Create a new Read Replica of a Database Instance. You must specify the `region` and the `instance_id`. You can only create a maximum of 3 Read Replicas per Database Instance. + +**Usage:** + +``` +scw document-db read-replica create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to create a Read Replica from | +| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | +| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| same-zone | | Defines whether or not to create the replica in the same Availability Zone as the main Database Instance nodes. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create an endpoint for a Read Replica + +Create a new endpoint for a Read Replica. Read Replicas can have at most one direct access and one Private Network endpoint. + +**Usage:** + +``` +scw document-db read-replica create-endpoint [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | +| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Read Replica + +Delete a Read Replica of a Database Instance. You must specify the `region` and `read_replica_id` parameters of the Read Replica you want to delete. + +**Usage:** + +``` +scw document-db read-replica delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Read Replica + +Retrieve information about a Database Instance Read Replica. Full details about the Read Replica, like `endpoints`, `status` and `region` are returned in the response. + +**Usage:** + +``` +scw document-db read-replica get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Resync a Read Replica + +When you resync a Read Replica, first it is reset, then its data is resynchronized from the primary node. Your Read Replica remains unavailable during the resync process. The duration of this process is proportional to the size of your Database Instance. +The configured endpoints do not change. + +**Usage:** + +``` +scw document-db read-replica reset [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Setting management + +Advanced Database Instance settings allow you to tune the behavior of your database engines to better fit your needs. + +Available settings depend on the database engine and its version. Note that some settings can only be defined upon database engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available database engines](#path-databases-list-databases-in-a-database-instance) endpoint. + +Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. + + +### Add Database Instance advanced settings + +Add an advanced setting to a Database Instance. You must set the `name` and the `value` of each setting. + +**Usage:** + +``` +scw document-db setting add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to add settings to | +| settings.{index}.name | | | +| settings.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete Database Instance advanced settings + +Delete an advanced setting in a Database Instance. You must specify the names of the settings you want to delete in the request. + +**Usage:** + +``` +scw document-db setting delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete settings from | +| setting-names.{index} | Required | Settings names to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Set Database Instance advanced settings + +Update an advanced setting for a Database Instance. Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. + +**Usage:** + +``` +scw document-db setting set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where the settings must be set | +| settings.{index}.name | | | +| settings.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Block snapshot management + +A snapshot is a consistent, instantaneous copy of the Block Storage volume of your Database Instance at a certain point in time. They are designed to recover your data in case of failure or accidental alterations of the data by a user. They allow you to quickly create a new Instance from a previous state of your database, regardless of the size of the volume. Their limitation is that, unlike backups, snapshots can only be stored in the same location as the original data. + + +### Create a Database Instance snapshot + +Create a new snapshot of a Database Instance. You must define the `name` parameter in the request. + +**Usage:** + +``` +scw document-db snapshot create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| name | Required
Default: `` | Name of the snapshot | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance snapshot + +Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `region` and `snapshot_id` parameters of the snapshot you want to delete. + +**Usage:** + +``` +scw document-db snapshot delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance snapshot + +Retrieve information about a given snapshot, specified by its `snapshot_id` and `region`. Full details about the snapshot, like size and expiration date, are returned in the response. + +**Usage:** + +``` +scw document-db snapshot get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List snapshots + +List snapshots. You can include the `instance_id` or `project_id` in your query to get the list of snapshots for specific Database Instances and/or Projects. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw document-db snapshot list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the snapshot | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `expires_at_asc`, `expires_at_desc` | Criteria to use when ordering snapshot listing | +| instance-id | | UUID of the Database Instance | +| project-id | | Project ID the snapshots belongs to | +| organization-id | | Organization ID the snapshots belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Create a new Database Instance from a snapshot + +Restore a snapshot. When you restore a snapshot, a new Instance is created and billed to your account. Note that is possible to select a larger node type for your new Database Instance. However, the Block volume size will be the same as the size of the restored snapshot. All Instance settings will be restored if you chose a node type with the same or more memory size than the initial Instance. Settings will be reset to the default if your node type has less memory. + +**Usage:** + +``` +scw document-db snapshot restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | Block snapshot of the Database Instance | +| instance-name | | Name of the Database Instance created with the snapshot | +| is-ha-cluster | | Defines whether or not High Availability is enabled on the new Database Instance | +| node-type | | The node type used to restore the snapshot | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update a Database Instance snapshot + +Update the parameters of a snapshot of a Database Instance. You can update the `name` and `expires_at` parameters. + +**Usage:** + +``` +scw document-db snapshot update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot to update | +| name | | Name of the snapshot | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## User management commands + +Users are profiles to which you can attribute database-level permissions. They allow you to define permissions specific to each type of database usage. For example, users with an `admin` role can create new databases and users. + + +### Create a user for a Database Instance + +Create a new user for a Database Instance. You must define the `name`, `password` and `is_admin` parameters. + +**Usage:** + +``` +scw document-db user create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance in which you want to create a user | +| name | | Name of the user you want to create | +| password | | Password of the user you want to create | +| is-admin | | Defines whether the user will have administrative privileges | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a user on a Database Instance + +Delete a given user on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the user you want to delete. + +**Usage:** + +``` +scw document-db user delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete the user from | +| name | Required | Name of the user | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List users of a Database Instance + +List all users of a given Database Instance. By default, the users returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw document-db user list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the user | +| order-by | One of: `name_asc`, `name_desc`, `is_admin_asc`, `is_admin_desc` | Criteria to use when requesting user listing | +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a user on a Database Instance + +Update the parameters of a user on a Database Instance. You can update the `password` and `is_admin` parameters, but you cannot change the name of the user. + +**Usage:** + +``` +scw document-db user update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance the user belongs to | +| name | Required | Name of the database user | +| password | | Password of the database user | +| is-admin | | Defines whether or not this user got administrative privileges | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/edge-services.md b/docs/docs/edge-services.md new file mode 100644 index 0000000000..061f42965a --- /dev/null +++ b/docs/docs/edge-services.md @@ -0,0 +1,669 @@ + +# Documentation for `scw edge-services` +Edge Services API + +- [Backend-stage management commands](#backend-stage-management-commands) + - [Create backend stage](#create-backend-stage) + - [Delete backend stage](#delete-backend-stage) + - [Get backend stage](#get-backend-stage) + - [List backend stages](#list-backend-stages) + - [Update backend stage](#update-backend-stage) +- [Cache-stage management commands](#cache-stage-management-commands) + - [Create cache stage](#create-cache-stage) + - [Delete cache stage](#delete-cache-stage) + - [Get cache stage](#get-cache-stage) + - [List cache stages](#list-cache-stages) + - [Update cache stage](#update-cache-stage) +- [DNS-stage management commands](#dns-stage-management-commands) + - [Create DNS stage](#create-dns-stage) + - [Delete DNS stage](#delete-dns-stage) + - [Get DNS stage](#get-dns-stage) + - [List DNS stages](#list-dns-stages) + - [Update DNS stage](#update-dns-stage) +- [Pipeline management commands](#pipeline-management-commands) + - [Create pipeline](#create-pipeline) + - [Delete pipeline](#delete-pipeline) + - [Get pipeline](#get-pipeline) + - [List pipelines](#list-pipelines) + - [Update pipeline](#update-pipeline) +- [Purge-request management commands](#purge-request-management-commands) + - [Create purge request](#create-purge-request) + - [Get purge request](#get-purge-request) + - [List purge requests](#list-purge-requests) +- [TLS-stage management commands](#tls-stage-management-commands) + - [Create TLS stage](#create-tls-stage) + - [Delete TLS stage](#delete-tls-stage) + - [Get TLS stage](#get-tls-stage) + - [List TLS stages](#list-tls-stages) + - [Update TLS stage](#update-tls-stage) + + +## Backend-stage management commands + +Backend-stage management commands. + + +### Create backend stage + +Create a new backend stage. You must specify either a `scaleway_s3` (for a Scaleway Object Storage bucket) or `scaleway_lb` (for a Scaleway Load Balancer) field to configure the origin. + +**Usage:** + +``` +scw edge-services backend-stage create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| scaleway-s3.bucket-name | | Name of the Bucket | +| scaleway-s3.bucket-region | | Region of the Bucket | +| scaleway-s3.is-website | | Defines whether the bucket website feature is enabled | +| scaleway-lb.lbs.{index}.id | | ID of the Load Balancer | +| scaleway-lb.lbs.{index}.zone | | Zone of the Load Balancer | +| scaleway-lb.lbs.{index}.frontend-id | | ID of the frontend linked to the Load Balancer | +| scaleway-lb.lbs.{index}.is-ssl | | Defines whether the Load Balancer's frontend handles SSL connections | +| scaleway-lb.lbs.{index}.domain-name | | Fully Qualified Domain Name (in the format subdomain.example.com) to use in HTTP requests sent towards your Load Balancer | + + + +### Delete backend stage + +Delete an existing backend stage, specified by its `backend_stage_id`. Deleting a backend stage is permanent, and cannot be undone. + +**Usage:** + +``` +scw edge-services backend-stage delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-stage-id | Required | ID of the backend stage to delete | + + + +### Get backend stage + +Retrieve information about an existing backend stage, specified by its `backend_stage_id`. Its full details, including `scaleway_s3` or `scaleway_lb`, are returned in the response object. + +**Usage:** + +``` +scw edge-services backend-stage get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-stage-id | Required | ID of the requested backend stage | + + + +### List backend stages + +List all backend stages, for a Scaleway Organization or Scaleway Project. By default, the backend stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services backend-stage list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of backend stages in the response | +| pipeline-id | | Pipeline ID to filter for, only backend stages from this pipeline will be returned | +| project-id | | Project ID to filter for, only backend stages from this Project will be returned | +| bucket-name | | Bucket name to filter for, only backend stages from this Bucket will be returned | +| bucket-region | | Bucket region to filter for, only backend stages with buckets in this region will be returned | +| lb-id | | Load Balancer ID to filter for, only backend stages with this Load Balancer will be returned | + + + +### Update backend stage + +Update the parameters of an existing backend stage, specified by its `backend_stage_id`. + +**Usage:** + +``` +scw edge-services backend-stage update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-stage-id | Required | ID of the backend stage to update | +| scaleway-s3.bucket-name | | Name of the Bucket | +| scaleway-s3.bucket-region | | Region of the Bucket | +| scaleway-s3.is-website | | Defines whether the bucket website feature is enabled | +| scaleway-lb.lbs.{index}.id | | ID of the Load Balancer | +| scaleway-lb.lbs.{index}.zone | | Zone of the Load Balancer | +| scaleway-lb.lbs.{index}.frontend-id | | ID of the frontend linked to the Load Balancer | +| scaleway-lb.lbs.{index}.is-ssl | | Defines whether the Load Balancer's frontend handles SSL connections | +| scaleway-lb.lbs.{index}.domain-name | | Fully Qualified Domain Name (in the format subdomain.example.com) to use in HTTP requests sent towards your Load Balancer | + + + +## Cache-stage management commands + +Cache-stage management commands. + + +### Create cache stage + +Create a new cache stage. You must specify the `fallback_ttl` field to customize the TTL of the cache. + +**Usage:** + +``` +scw edge-services cache-stage create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| fallback-ttl | Default: `3600s` | Time To Live (TTL) in seconds. Defines how long content is cached | +| backend-stage-id | | Backend stage ID the cache stage will be linked to | + + + +### Delete cache stage + +Delete an existing cache stage, specified by its `cache_stage_id`. Deleting a cache stage is permanent, and cannot be undone. + +**Usage:** + +``` +scw edge-services cache-stage delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cache-stage-id | Required | ID of the cache stage to delete | + + + +### Get cache stage + +Retrieve information about an existing cache stage, specified by its `cache_stage_id`. Its full details, including Time To Live (TTL), are returned in the response object. + +**Usage:** + +``` +scw edge-services cache-stage get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cache-stage-id | Required | ID of the requested cache stage | + + + +### List cache stages + +List all cache stages, for a Scaleway Organization or Scaleway Project. By default, the cache stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services cache-stage list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of cache stages in the response | +| pipeline-id | | Pipeline ID to filter for, only cache stages from this pipeline will be returned | +| project-id | | Project ID to filter for, only cache stages from this Project will be returned | + + + +### Update cache stage + +Update the parameters of an existing cache stage, specified by its `cache_stage_id`. Parameters which can be updated include the `fallback_ttl` and `backend_stage_id`. + +**Usage:** + +``` +scw edge-services cache-stage update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cache-stage-id | Required | ID of the cache stage to update | +| fallback-ttl | | Time To Live (TTL) in seconds. Defines how long content is cached | +| backend-stage-id | | Backend stage ID the cache stage will be linked to | + + + +## DNS-stage management commands + +DNS-stage management commands. + + +### Create DNS stage + +Create a new DNS stage. You must specify the `fqdns` field to customize the domain endpoint, using a domain you already own. + +**Usage:** + +``` +scw edge-services dns-stage create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| fqdns.{index} | | Fully Qualified Domain Name (in the format subdomain.example.com) to attach to the stage | +| tls-stage-id | | TLS stage ID the DNS stage will be linked to | +| cache-stage-id | | Cache stage ID the DNS stage will be linked to | +| backend-stage-id | | Backend stage ID the DNS stage will be linked to | + + + +### Delete DNS stage + +Delete an existing DNS stage, specified by its `dns_stage_id`. Deleting a DNS stage is permanent, and cannot be undone. + +**Usage:** + +``` +scw edge-services dns-stage delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-stage-id | Required | ID of the DNS stage to delete | + + + +### Get DNS stage + +Retrieve information about an existing DNS stage, specified by its `dns_stage_id`. Its full details, including FQDNs, are returned in the response object. + +**Usage:** + +``` +scw edge-services dns-stage get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-stage-id | Required | ID of the requested DNS stage | + + + +### List DNS stages + +List all DNS stages, for a Scaleway Organization or Scaleway Project. By default, the DNS stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services dns-stage list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of DNS stages in the response | +| pipeline-id | | Pipeline ID to filter for, only DNS stages from this pipeline will be returned | +| project-id | | Project ID to filter for, only DNS stages from this Project will be returned | +| fqdn | | Fully Qualified Domain Name to filter for (in the format subdomain.example.com), only DNS stages with this FQDN will be returned | + + + +### Update DNS stage + +Update the parameters of an existing DNS stage, specified by its `dns_stage_id`. + +**Usage:** + +``` +scw edge-services dns-stage update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dns-stage-id | Required | ID of the DNS stage to update | +| fqdns.{index} | | Fully Qualified Domain Name (in the format subdomain.example.com) attached to the stage | +| tls-stage-id | | TLS stage ID the DNS stage will be linked to | +| cache-stage-id | | Cache stage ID the DNS stage will be linked to | +| backend-stage-id | | Backend stage ID the DNS stage will be linked to | + + + +## Pipeline management commands + +Pipeline management commands. + + +### Create pipeline + +Create a new pipeline. You must specify a `dns_stage_id` to form a stage-chain that goes all the way to the backend stage (origin), so the HTTP request will be processed according to the stages you created. + +**Usage:** + +``` +scw edge-services pipeline create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Required | Name of the pipeline | +| description | Required | Description of the pipeline | +| dns-stage-id | | DNS stage ID the pipeline will be attached to | + + + +### Delete pipeline + +Delete an existing pipeline, specified by its `pipeline_id`. Deleting a pipeline is permanent, and cannot be undone. Note that all stages linked to the pipeline are also deleted. + +**Usage:** + +``` +scw edge-services pipeline delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pipeline-id | Required | ID of the pipeline to delete | + + + +### Get pipeline + +Retrieve information about an existing pipeline, specified by its `pipeline_id`. Its full details, including errors, are returned in the response object. + +**Usage:** + +``` +scw edge-services pipeline get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pipeline-id | Required | ID of the requested pipeline | + + + +### List pipelines + +List all pipelines, for a Scaleway Organization or Scaleway Project. By default, the pipelines returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services pipeline list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of pipelines in the response | +| name | | Pipeline name to filter for, only pipelines with this string within their name will be returned | +| project-id | | Project ID to filter for, only pipelines from this Project will be returned | +| has-backend-stage-lb | | Filter on backend stage, only pipelines with a Load Balancer origin will be returned | +| organization-id | | Organization ID to filter for, only pipelines from this Organization will be returned | + + + +### Update pipeline + +Update the parameters of an existing pipeline, specified by its `pipeline_id`. Parameters which can be updated include the `name`, `description` and `dns_stage_id`. + +**Usage:** + +``` +scw edge-services pipeline update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pipeline-id | Required | ID of the pipeline to update | +| name | | Name of the pipeline | +| description | | Description of the pipeline | +| dns-stage-id | | DNS stage ID the pipeline will be attached to | + + + +## Purge-request management commands + +Purge-request management commands. + + +### Create purge request + +Create a new purge request. You must specify either the `all` field (to purge all content) or a list of `assets` (to define the precise assets to purge). + +**Usage:** + +``` +scw edge-services purge-request create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pipeline-id | Required | Pipeline ID in which the purge request will be created | +| assets.{index} | | List of asserts to purge | +| all | | Defines whether to purge all content | + + + +### Get purge request + +Retrieve information about a purge request, specified by its `purge_request_id`. Its full details, including `status` and `target`, are returned in the response object. + +**Usage:** + +``` +scw edge-services purge-request get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| purge-request-id | Required | ID of the requested purge request | + + + +### List purge requests + +List all purge requests, for a Scaleway Organization or Scaleway Project. This enables you to retrieve a history of all previously-made purge requests. By default, the purge requests returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services purge-request list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of purge requests in the response | +| project-id | | Project ID to filter for, only purge requests from this Project will be returned | +| pipeline-id | | Pipeline ID to filter for, only purge requests from this pipeline will be returned | +| organization-id | | Organization ID to filter for, only purge requests from this Project will be returned | + + + +## TLS-stage management commands + +TLS-stage management commands. + + +### Create TLS stage + +Create a new TLS stage. You must specify either the `secrets` or `managed_certificate` fields to customize the SSL/TLS certificate of your endpoint. Choose `secrets` if you are using a pre-existing certificate held in Scaleway Secret Manager, or `managed_certificate` to let Scaleway generate and manage a Let's Encrypt certificate for your customized endpoint. + +**Usage:** + +``` +scw edge-services tls-stage create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| secrets.{index}.secret-id | | ID of the Secret | +| secrets.{index}.region | | Region of the Secret | +| managed-certificate | | True when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint | +| cache-stage-id | | Cache stage ID the TLS stage will be linked to | +| backend-stage-id | | Backend stage ID the TLS stage will be linked to | + + + +### Delete TLS stage + +Delete an existing TLS stage, specified by its `tls_stage_id`. Deleting a TLS stage is permanent, and cannot be undone. + +**Usage:** + +``` +scw edge-services tls-stage delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tls-stage-id | Required | ID of the TLS stage to delete | + + + +### Get TLS stage + +Retrieve information about an existing TLS stage, specified by its `tls_stage_id`. Its full details, including secrets and certificate expiration date are returned in the response object. + +**Usage:** + +``` +scw edge-services tls-stage get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tls-stage-id | Required | ID of the requested TLS stage | + + + +### List TLS stages + +List all TLS stages, for a Scaleway Organization or Scaleway Project. By default, the TLS stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw edge-services tls-stage list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of TLS stages in the response | +| pipeline-id | | Pipeline ID to filter for, only TLS stages from this pipeline will be returned | +| project-id | | Project ID to filter for, only TLS stages from this Project will be returned | +| secret-id | | Secret ID to filter for, only TLS stages with this Secret ID will be returned | +| secret-region | | Secret region to filter for, only TLS stages with a Secret in this region will be returned | + + + +### Update TLS stage + +Update the parameters of an existing TLS stage, specified by its `tls_stage_id`. Both `tls_secrets_config` and `managed_certificate` parameters can be updated. + +**Usage:** + +``` +scw edge-services tls-stage update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tls-stage-id | Required | ID of the TLS stage to update | +| tls-secrets-config.tls-secrets.{index}.secret-id | | ID of the Secret | +| tls-secrets-config.tls-secrets.{index}.region | | Region of the Secret | +| managed-certificate | | True when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint | +| cache-stage-id | | Cache stage ID the TLS stage will be linked to | +| backend-stage-id | | Backend stage ID the TLS stage will be linked to | + + + diff --git a/docs/docs/feedback.md b/docs/docs/feedback.md new file mode 100644 index 0000000000..f0b7b37d20 --- /dev/null +++ b/docs/docs/feedback.md @@ -0,0 +1,36 @@ + +# Documentation for `scw feedback` +Send feedback to the Scaleway CLI Team! + +- [Send a bug-report](#send-a-bug-report) +- [Send a feature request](#send-a-feature-request) + + +## Send a bug-report + +Send a bug-report to the Scaleway CLI team. + +Send a bug-report to the Scaleway CLI team. + +**Usage:** + +``` +scw feedback bug +``` + + + +## Send a feature request + +Send a feature request to the Scaleway CLI team. + +Send a feature request to the Scaleway CLI team. + +**Usage:** + +``` +scw feedback feature +``` + + + diff --git a/docs/docs/fip.md b/docs/docs/fip.md new file mode 100644 index 0000000000..49bb6baffa --- /dev/null +++ b/docs/docs/fip.md @@ -0,0 +1,267 @@ + +# Documentation for `scw fip` +This API allows you to manage your Elastic Metal servers' flexible public IP addresses. + +- [Flexible IP management commands](#flexible-ip-management-commands) + - [Attach an existing flexible IP to a server](#attach-an-existing-flexible-ip-to-a-server) + - [Create a new flexible IP](#create-a-new-flexible-ip) + - [Delete an existing flexible IP](#delete-an-existing-flexible-ip) + - [Detach an existing flexible IP from a server](#detach-an-existing-flexible-ip-from-a-server) + - [Get an existing flexible IP](#get-an-existing-flexible-ip) + - [List flexible IPs](#list-flexible-ips) + - [Update an existing flexible IP](#update-an-existing-flexible-ip) +- [MAC address management commands](#mac-address-management-commands) + - [Generate a virtual MAC address on an existing flexible IP](#generate-a-virtual-mac-address-on-an-existing-flexible-ip) + - [Detach a given virtual MAC address from an existing flexible IP](#detach-a-given-virtual-mac-address-from-an-existing-flexible-ip) + - [Duplicate a virtual MAC address to another flexible IP](#duplicate-a-virtual-mac-address-to-another-flexible-ip) + - [Relocate an existing virtual MAC address to a different flexible IP](#relocate-an-existing-virtual-mac-address-to-a-different-flexible-ip) + + +## Flexible IP management commands + +A flexible IP can be attached to any Elastic Metal server within the same zone. +Multiple flexible IPs can be attached to a server. + + +### Attach an existing flexible IP to a server + +Attach an existing flexible IP to a specified Elastic Metal server. + +**Usage:** + +``` +scw fip ip attach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fips-ids.{index} | Required | List of flexible IP IDs to attach to a server | +| server-id | Required | ID of the server on which to attach the flexible IPs | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Create a new flexible IP + +Generate a new flexible IP within a given zone, specifying its configuration including Project ID and description. + +**Usage:** + +``` +scw fip ip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| description | | Flexible IP description (max. of 255 characters) | +| tags.{index} | | Tags to associate to the flexible IP | +| server-id | | ID of the server to which the newly created flexible IP will be attached. | +| reverse | | Value of the reverse DNS | +| is-ipv6 | | Defines whether the flexible IP has an IPv6 address. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an existing flexible IP + +Delete an existing flexible IP, specified by its ID and zone. Note that deleting a flexible IP is permanent and cannot be undone. + +**Usage:** + +``` +scw fip ip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach an existing flexible IP from a server + +Detach an existing flexible IP from a specified Elastic Metal server. + +**Usage:** + +``` +scw fip ip detach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fips-ids.{index} | Required | List of flexible IP IDs to detach from a server. Multiple IDs can be provided. Note that flexible IPs must belong to the same MAC group. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an existing flexible IP + +Retrieve information about an existing flexible IP, specified by its ID and zone. Its full details, including Project ID, description and status, are returned in the response object. + +**Usage:** + +``` +scw fip ip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List flexible IPs + +List all flexible IPs within a given zone. + +**Usage:** + +``` +scw fip ip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned flexible IPs | +| tags.{index} | | Filter by tag, only flexible IPs with one or more matching tags will be returned | +| status.{index} | One of: `unknown`, `ready`, `updating`, `attached`, `error`, `detaching`, `locked` | Filter by status, only flexible IPs with this status will be returned | +| server-ids.{index} | | Filter by server IDs, only flexible IPs with these server IDs will be returned | +| project-id | | Filter by Project ID, only flexible IPs from this Project will be returned | +| organization-id | | Filter by Organization ID, only flexible IPs from this Organization will be returned | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an existing flexible IP + +Update the parameters of an existing flexible IP, specified by its ID and zone. These parameters include tags and description. + +**Usage:** + +``` +scw fip ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP to update | +| description | | Flexible IP description (max. 255 characters) | +| tags.{index} | | Tags associated with the flexible IP | +| reverse | | Value of the reverse DNS | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +## MAC address management commands + +MAC address management commands. + + +### Generate a virtual MAC address on an existing flexible IP + +Generate a virtual MAC (Media Access Control) address on an existing flexible IP. + +**Usage:** + +``` +scw fip mac create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP for which to generate a virtual MAC | +| mac-type | Required
One of: `unknown_type`, `vmware`, `xen`, `kvm` | TODO | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach a given virtual MAC address from an existing flexible IP + +Detach a given MAC (Media Access Control) address from an existing flexible IP. + +**Usage:** + +``` +scw fip mac delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP from which to delete the virtual MAC | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Duplicate a virtual MAC address to another flexible IP + +Duplicate a virtual MAC address from a given flexible IP to another flexible IP attached to the same server. + +**Usage:** + +``` +scw fip mac duplicate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | ID of the flexible IP on which to duplicate the virtual MAC | +| duplicate-from-fip-id | Required | ID of the flexible IP to duplicate the Virtual MAC from | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + +### Relocate an existing virtual MAC address to a different flexible IP + +Relocate a virtual MAC (Media Access Control) address from an existing flexible IP to a different flexible IP. + +**Usage:** + +``` +scw fip mac move [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| fip-id | Required | | +| dst-fip-id | | | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/function.md b/docs/docs/function.md new file mode 100644 index 0000000000..180cda0729 --- /dev/null +++ b/docs/docs/function.md @@ -0,0 +1,819 @@ + +# Documentation for `scw function` +Function as a Service API. + +- [Cron management commands](#cron-management-commands) + - [Create a new cron](#create-a-new-cron) + - [Delete an existing cron](#delete-an-existing-cron) + - [Get a cron](#get-a-cron) + - [List all crons](#list-all-crons) + - [Update an existing cron](#update-an-existing-cron) +- [Deploy a function](#deploy-a-function) +- [Domain management commands](#domain-management-commands) + - [Create a domain name binding](#create-a-domain-name-binding) + - [Delete a domain name binding](#delete-a-domain-name-binding) + - [Get a domain name binding](#get-a-domain-name-binding) + - [List all domain name bindings](#list-all-domain-name-bindings) +- [Function management commands](#function-management-commands) + - [Create a new function](#create-a-new-function) + - [Delete a function](#delete-a-function) + - [Deploy a function](#deploy-a-function) + - [Get a function](#get-a-function) + - [Get a download URL of a function](#get-a-download-url-of-a-function) + - [Get an upload URL of a function](#get-an-upload-url-of-a-function) + - [List all your functions](#list-all-your-functions) + - [Update an existing function](#update-an-existing-function) +- [Function namespace management commands](#function-namespace-management-commands) + - [Create a new namespace](#create-a-new-namespace) + - [Delete an existing namespace](#delete-an-existing-namespace) + - [Get a namespace](#get-a-namespace) + - [List all your namespaces](#list-all-your-namespaces) + - [Update an existing namespace](#update-an-existing-namespace) +- [Runtime management commands](#runtime-management-commands) + - [List function runtimes](#list-function-runtimes) +- [Token management commands](#token-management-commands) + - [Create a new revocable token](#create-a-new-revocable-token) + - [Delete a token](#delete-a-token) + - [Get a token](#get-a-token) + - [List all tokens](#list-all-tokens) +- [Trigger management commands](#trigger-management-commands) + - [Create a trigger](#create-a-trigger) + - [Delete a trigger](#delete-a-trigger) + - [Get a trigger](#get-a-trigger) + - [List all triggers](#list-all-triggers) + - [Update a trigger](#update-a-trigger) + + +## Cron management commands + +Cron management commands. + + +### Create a new cron + +Create a new cronjob for a function with the specified ID. + +**Usage:** + +``` +scw function cron create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | | UUID of the function to use the cron with | +| schedule | | Schedule of the cron in UNIX cron format | +| args | | Arguments to use with the cron | +| name | | Name of the cron | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing cron + +Delete the cron associated with the specified ID. + +**Usage:** + +``` +scw function cron delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a cron + +Get the cron associated with the specified ID. + +**Usage:** + +``` +scw function cron get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all crons + +List all the cronjobs in a specified region. + +**Usage:** + +``` +scw function cron list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the crons | +| function-id | | UUID of the function | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing cron + +Update the cron associated with the specified ID. + +**Usage:** + +``` +scw function cron update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cron-id | Required | UUID of the cron to update | +| function-id | | UUID of the function to use the cron with | +| schedule | | Schedule of the cron in UNIX cron format | +| args | | Arguments to use with the cron | +| name | | Name of the cron | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Deploy a function + +Create or fetch, upload and deploy your function + +Create or fetch, upload and deploy your function + +**Usage:** + +``` +scw function deploy [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | | Function Namespace ID to deploy to | +| name | Required | Name of the function to deploy, will be used in namespace's name if no ID is provided | +| runtime | Required
One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | | +| zip-file | Required | Path of the zip file that contains your code | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Domain management commands + +Domain management commands. + + +### Create a domain name binding + +Create a domain name binding for the function with the specified ID. + +**Usage:** + +``` +scw function domain create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hostname | | Hostame to create | +| function-id | | UUID of the function to associate the domain with | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a domain name binding + +Delete a domain name binding for the function with the specified ID. + +**Usage:** + +``` +scw function domain delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | UUID of the domain to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a domain name binding + +Get a domain name binding for the function with the specified ID. + +**Usage:** + +``` +scw function domain get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | UUID of the domain to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all domain name bindings + +List all domain name bindings in a specified region. + +**Usage:** + +``` +scw function domain list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `hostname_asc`, `hostname_desc` | Order of the domains | +| function-id | | UUID of the function the domain is assoicated with | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Function management commands + +Function management commands. + + +### Create a new function + +Create a new function in the specified region for a specified Organization or Project. + +**Usage:** + +``` +scw function function create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the function to create | +| namespace-id | | UUID of the namespace the function will be created in | +| environment-variables.{key} | | Environment variables of the function | +| min-scale | | Minumum number of instances to scale the function to | +| max-scale | | Maximum number of instances to scale the function to | +| runtime | One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | Runtime to use with the function | +| memory-limit | | Memory limit of the function in MB | +| timeout | | Request processing time limit for the function | +| handler | | Handler to use with the function | +| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the function | +| description | | Description of the function | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | +| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the function | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a function + +Delete the function associated with the specified ID. + +**Usage:** + +``` +scw function function delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Deploy a function + +Deploy a function associated with the specified ID. + +**Usage:** + +``` +scw function function deploy [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function to deploy | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a function + +Get the function associated with the specified ID. + +**Usage:** + +``` +scw function function get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a download URL of a function + +Get a download URL for a function associated with the specified ID. + +**Usage:** + +``` +scw function function get-download-url [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function to get the the download URL for | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get an upload URL of a function + +Get an upload URL of a function associated with the specified ID. + +**Usage:** + +``` +scw function function get-upload-url [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function to get the upload URL for | +| content-length | Required | Size of the archive to upload in bytes | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your functions + +List all your functions. + +**Usage:** + +``` +scw function function list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the functions | +| namespace-id | | UUID of the namespace the function belongs to | +| name | | Name of the function | +| project-id | | UUID of the Project the function belongs to | +| organization-id | | UUID of the Organziation the function belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing function + +Update the function associated with the specified ID. + +**Usage:** + +``` +scw function function update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | Required | UUID of the function to update | +| environment-variables.{key} | | Environment variables of the function to update | +| min-scale | | Minumum number of instances to scale the function to | +| max-scale | | Maximum number of instances to scale the function to | +| runtime | One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | Runtime to use with the function | +| memory-limit | | Memory limit of the function in MB | +| timeout | | Processing time limit for the function | +| redeploy | | Redeploy failed function | +| handler | | Handler to use with the function | +| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the function | +| description | | Description of the function | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | +| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the function | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Function namespace management commands + +Function namespace management commands. + + +### Create a new namespace + +Create a new namespace in a specified Organization or Project. + +**Usage:** + +``` +scw function namespace create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | | +| environment-variables.{key} | | Environment variables of the namespace | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| description | | Description of the namespace | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing namespace + +Delete the namespace associated with the specified ID. + +**Usage:** + +``` +scw function namespace delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a namespace + +Get the namespace associated with the specified ID. + +**Usage:** + +``` +scw function namespace get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your namespaces + +List all existing namespaces in the specified region. + +**Usage:** + +``` +scw function namespace list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the namespaces | +| name | | Name of the namespace | +| project-id | | UUID of the Project the namespace belongs to | +| organization-id | | UUID of the Organization the namespace belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing namespace + +Update the namespace associated with the specified ID. + +**Usage:** + +``` +scw function namespace update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespapce | +| environment-variables.{key} | | Environment variables of the namespace | +| description | | Description of the namespace | +| secret-environment-variables.{index}.key | | | +| secret-environment-variables.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Runtime management commands + +Runtime management commands. + + +### List function runtimes + +List available function runtimes. + +**Usage:** + +``` +scw function runtime list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Token management commands + +Token management commands. + + +### Create a new revocable token + +Create a new revocable token. + +**Usage:** + +``` +scw function token create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| function-id | | UUID of the function to associate the token with | +| namespace-id | | UUID of the namespace to associate the token with | +| description | | Description of the token | +| expires-at | | Date on which the token expires | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a token + +Delete a token. + +**Usage:** + +``` +scw function token delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | UUID of the token to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a token + +Get a token. + +**Usage:** + +``` +scw function token get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| token-id | Required | UUID of the token to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all tokens + +List all tokens. + +**Usage:** + +``` +scw function token list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for the tokens | +| function-id | | UUID of the function the token is assoicated with | +| namespace-id | | UUID of the namespace the token is associated with | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Trigger management commands + +Trigger management commands. + + +### Create a trigger + +Create a new trigger for a specified function. + +**Usage:** + +``` +scw function trigger create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | Name of the trigger | +| function-id | Required | ID of the function to trigger | +| description | | Description of the trigger | +| scw-sqs-config.queue | | Name of the SQS queue the trigger should listen to | +| scw-sqs-config.mnq-project-id | | ID of the Messaging and Queuing project | +| scw-sqs-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | +| scw-nats-config.subject | | Name of the NATS subject the trigger should listen to | +| scw-nats-config.mnq-nats-account-id | | ID of the Messaging and Queuing NATS account | +| scw-nats-config.mnq-project-id | | ID of the Messaging and Queuing project | +| scw-nats-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a trigger + +Delete a trigger with a specified ID. + +**Usage:** + +``` +scw function trigger delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a trigger + +Get a trigger with a specified ID. + +**Usage:** + +``` +scw function trigger get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all triggers + +List all triggers belonging to a specified Organization or Project. + +**Usage:** + +``` +scw function trigger list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Order in which to return results | +| function-id | | ID of the function the triggers belongs to | +| namespace-id | | ID of the namespace the triggers belongs to | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a trigger + +Update a trigger with a specified ID. + +**Usage:** + +``` +scw function trigger update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| trigger-id | Required | ID of the trigger to update | +| name | | Name of the trigger | +| description | | Description of the trigger | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/help.md b/docs/docs/help.md new file mode 100644 index 0000000000..310efefcc1 --- /dev/null +++ b/docs/docs/help.md @@ -0,0 +1,248 @@ + +# Documentation for `scw help` +Get help about how the CLI works + +- [Get help about how date parsing works in the CLI](#get-help-about-how-date-parsing-works-in-the-cli) +- [Get help about how the CLI output works](#get-help-about-how-the-cli-output-works) + + +## Get help about how date parsing works in the CLI + +Date parsing + +You have two ways for managing date in the CLI: Absolute and Relative + +- Absolute time + + Absolute time refers to a specific and absolute point in time. + CLI uses RFC3339 to parse those time and pass a time.Time go structure to the underlying functions. + + Example: "2006-01-02T15:04:05Z07:00" + +- Relative time + + Relative time refers to a time calculated from adding a given duration to the time when a command is launched. + + Example: + - +1d4m => current time plus 1 day and 4 minutes + - -1d4m => current time minus 1 day and 4 minutes + +- Units of time + + Nanosecond: ns + Microsecond: us, µs (U+00B5 = micro symbol), μs (U+03BC = Greek letter mu) + Millisecond: ms + Second: s, sec, second, seconds + Minute: m, min, minute, minutes + Hour: h, hr, hour, hours + Day: d, day, days + Week: w, wk, week, weeks + Month: mo, mon, month, months + Year: y, yr, year, years + + +Date parsing + +You have two ways for managing date in the CLI: Absolute and Relative + +- Absolute time + + Absolute time refers to a specific and absolute point in time. + CLI uses RFC3339 to parse those time and pass a time.Time go structure to the underlying functions. + + Example: "2006-01-02T15:04:05Z07:00" + +- Relative time + + Relative time refers to a time calculated from adding a given duration to the time when a command is launched. + + Example: + - +1d4m => current time plus 1 day and 4 minutes + - -1d4m => current time minus 1 day and 4 minutes + +- Units of time + + Nanosecond: ns + Microsecond: us, µs (U+00B5 = micro symbol), μs (U+03BC = Greek letter mu) + Millisecond: ms + Second: s, sec, second, seconds + Minute: m, min, minute, minutes + Hour: h, hr, hour, hours + Day: d, day, days + Week: w, wk, week, weeks + Month: mo, mon, month, months + Year: y, yr, year, years + + +**Usage:** + +``` +scw help date +``` + + + +## Get help about how the CLI output works + +Output formatting in the CLI + +Human output (default one) + + scw instance server list + + ID NAME TYPE STATE ZONE PUBLIC IP + 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 + +Human with column selection + +You can select the columns that you want to print with commands that return a list + + scw instance server list -o human=Name,PublicIP + + NAME PUBLIC IP + scw-cool-franklin 51.15.251.251 + +Wide output (Human without column shrinking) + + scw instance server list -o wide + + ID NAME TYPE STATE ZONE PUBLIC IP + 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 + +Wide with column selection + +You can select the columns that you want to print with commands that return a list + + scw instance server list -o wide=Name,PublicIP + + NAME PUBLIC IP + scw-cool-franklin 51.15.251.251 + + +Standard JSON output + + scw config dump -o json + + {"access_key":"SCWXXXXXXXXXXXXXXXXX","secret_key":"11111111-1111-1111-1111-111111111111","default_organization_id":"11111111-1111-1111-1111-111111111111","default_region":"fr-par","default_zone":"fr-par-1","send_telemetry":true} + +Pretty JSON output + + scw config dump -o json=pretty + + { + "access_key": "SCWXXXXXXXXXXXXXXXXX", + "secret_key": "11111111-1111-1111-1111-111111111111", + "default_organization_id": "11111111-1111-1111-1111-111111111111", + "default_region": "fr-par", + "default_zone": "fr-par-1", + "send_telemetry": true + } + +Standard YAML output + + scw config dump -o yaml + + access_key: SCWXXXXXXXXXXXXXXXXX + secret_key: 11111111-1111-1111-1111-111111111111 + default_organization_id: 11111111-1111-1111-1111-111111111111 + default_region: fr-par + default_zone: fr-par-1 + send_telemetry: true + + +Template output + +You can use Go template to manipulate the output of a command and create a custom rendering of your resources. +Visit https://golang.org/pkg/text/template/ to learn more about Go template format. + + scw instance server list -o template="{{ .Name }}||{{ .ID }}" + + foo||11111111-1111-1111-1111-111111111111 + bar||22222222-2222-2222-2222-222222222222 + + +Output formatting in the CLI + +Human output (default one) + + scw instance server list + + ID NAME TYPE STATE ZONE PUBLIC IP + 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 + +Human with column selection + +You can select the columns that you want to print with commands that return a list + + scw instance server list -o human=Name,PublicIP + + NAME PUBLIC IP + scw-cool-franklin 51.15.251.251 + +Wide output (Human without column shrinking) + + scw instance server list -o wide + + ID NAME TYPE STATE ZONE PUBLIC IP + 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 + +Wide with column selection + +You can select the columns that you want to print with commands that return a list + + scw instance server list -o wide=Name,PublicIP + + NAME PUBLIC IP + scw-cool-franklin 51.15.251.251 + + +Standard JSON output + + scw config dump -o json + + {"access_key":"SCWXXXXXXXXXXXXXXXXX","secret_key":"11111111-1111-1111-1111-111111111111","default_organization_id":"11111111-1111-1111-1111-111111111111","default_region":"fr-par","default_zone":"fr-par-1","send_telemetry":true} + +Pretty JSON output + + scw config dump -o json=pretty + + { + "access_key": "SCWXXXXXXXXXXXXXXXXX", + "secret_key": "11111111-1111-1111-1111-111111111111", + "default_organization_id": "11111111-1111-1111-1111-111111111111", + "default_region": "fr-par", + "default_zone": "fr-par-1", + "send_telemetry": true + } + +Standard YAML output + + scw config dump -o yaml + + access_key: SCWXXXXXXXXXXXXXXXXX + secret_key: 11111111-1111-1111-1111-111111111111 + default_organization_id: 11111111-1111-1111-1111-111111111111 + default_region: fr-par + default_zone: fr-par-1 + send_telemetry: true + + +Template output + +You can use Go template to manipulate the output of a command and create a custom rendering of your resources. +Visit https://golang.org/pkg/text/template/ to learn more about Go template format. + + scw instance server list -o template="{{ .Name }}||{{ .ID }}" + + foo||11111111-1111-1111-1111-111111111111 + bar||22222222-2222-2222-2222-222222222222 + + +**Usage:** + +``` +scw help output +``` + + + diff --git a/docs/docs/iam.md b/docs/docs/iam.md new file mode 100644 index 0000000000..9e1c0697bb --- /dev/null +++ b/docs/docs/iam.md @@ -0,0 +1,1149 @@ + +# Documentation for `scw iam` +This API allows you to manage Identity and Access Management (IAM) across your Scaleway Organizations, Projects and resources. + +- [API keys management commands](#api-keys-management-commands) + - [Create an API key](#create-an-api-key) + - [Delete an API key](#delete-an-api-key) + - [Get an API key](#get-an-api-key) + - [List API keys](#list-api-keys) + - [Update an API key](#update-an-api-key) +- [Applications management commands](#applications-management-commands) + - [Create a new application](#create-a-new-application) + - [Delete an application](#delete-an-application) + - [Get a given application](#get-a-given-application) + - [List applications of an Organization](#list-applications-of-an-organization) + - [Update an application](#update-an-application) +- [Groups management commands](#groups-management-commands) + - [Add a user or an application to a group](#add-a-user-or-an-application-to-a-group) + - [Add multiple users and applications to a group](#add-multiple-users-and-applications-to-a-group) + - [Create a group](#create-a-group) + - [Delete a group](#delete-a-group) + - [Get a group](#get-a-group) + - [List groups](#list-groups) + - [Remove a user or an application from a group](#remove-a-user-or-an-application-from-a-group) + - [Overwrite users and applications of a group](#overwrite-users-and-applications-of-a-group) + - [Update a group](#update-a-group) +- [JWTs management commands](#jwts-management-commands) + - [Delete a JWT](#delete-a-jwt) + - [Get a JWT](#get-a-jwt) + - [List JWTs](#list-jwts) +- [Log management commands](#log-management-commands) + - [Get a log](#get-a-log) + - [List logs](#list-logs) +- [Permission sets management commands](#permission-sets-management-commands) + - [List permission sets](#list-permission-sets) +- [Policies management commands](#policies-management-commands) + - [Clone a policy](#clone-a-policy) + - [Create a new policy](#create-a-new-policy) + - [Delete a policy](#delete-a-policy) + - [Get an existing policy](#get-an-existing-policy) + - [List policies of an Organization](#list-policies-of-an-organization) + - [Update an existing policy](#update-an-existing-policy) +- [Rules management commands](#rules-management-commands) + - [Create a rule for a specific IAM policy](#create-a-rule-for-a-specific-iam-policy) + - [Delete a rule for a specific IAM policy](#delete-a-rule-for-a-specific-iam-policy) + - [List rules of a given policy](#list-rules-of-a-given-policy) + - [Set rules of a given policy](#set-rules-of-a-given-policy) +- [SSH keys management commands](#ssh-keys-management-commands) + - [Create an SSH key](#create-an-ssh-key) + - [Delete an SSH key](#delete-an-ssh-key) + - [Get an SSH key](#get-an-ssh-key) + - [Initialize SSH key](#initialize-ssh-key) + - [List SSH keys](#list-ssh-keys) + - [Update an SSH key](#update-an-ssh-key) +- [Users management commands](#users-management-commands) + - [Create a new user](#create-a-new-user) + - [Delete a guest user from an Organization](#delete-a-guest-user-from-an-organization) + - [Get a given user](#get-a-given-user) + - [List users of an Organization](#list-users-of-an-organization) + - [Update a user](#update-a-user) + + +## API keys management commands + +API keys management commands. + + +### Create an API key + +Create an API key. You must specify the `application_id` or the `user_id` and the description. You can also specify the `default_project_id` which is the Project ID of your preferred Project, to use with Object Storage. The `access_key` and `secret_key` values are returned in the response. Note that he secret key is only showed once. Make sure that you copy and store both keys somewhere safe. + +**Usage:** + +``` +scw iam api-key create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| application-id | | ID of the application | +| user-id | | ID of the user | +| expires-at | | Expiration date of the API key | +| default-project-id | | Default Project ID to use with Object Storage | +| description | | Description of the API key (max length is 200 characters) | + + + +### Delete an API key + +Delete an API key. Note that this action is irreversible and cannot be undone. Make sure you update any configurations using the API keys you delete. + +**Usage:** + +``` +scw iam api-key delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| access-key | Required | Access key to delete | + + +**Examples:** + + +Delete a given API key +``` +scw iam api-key delete SCW00000000000 +``` + + + + +### Get an API key + +Retrive information about an API key, specified by the `access_key` parameter. The API key's details, including either the `user_id` or `application_id` of its bearer are returned in the response. Note that the string value for the `secret_key` is nullable, and therefore is not displayed in the response. The `secret_key` value is only displayed upon API key creation. + +**Usage:** + +``` +scw iam api-key get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| access-key | Required | Access key to search for | + + + +### List API keys + +List API keys. By default, the API keys listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters for your query such as `editable`, `expired`, `access_key` and `bearer_id`. + +**Usage:** + +``` +scw iam api-key list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `expires_at_asc`, `expires_at_desc`, `access_key_asc`, `access_key_desc` | Criteria for sorting results | +| ~~application-id~~ | Deprecated | ID of application that bears the API key | +| ~~user-id~~ | Deprecated | ID of user that bears the API key | +| editable | | Defines whether to filter out editable API keys or not | +| expired | | Defines whether to filter out expired API keys or not | +| ~~access-key~~ | Deprecated | Filter by access key (deprecated in favor of `access_keys`) | +| description | | Filter by description | +| bearer-id | | Filter by bearer ID | +| bearer-type | One of: `unknown_bearer_type`, `user`, `application` | Filter by type of bearer | +| access-keys.{index} | | Filter by a list of access keys | +| organization-id | Required
Default: `` | ID of Organization | + + + +### Update an API key + +Update the parameters of an API key, including `default_project_id` and `description`. + +**Usage:** + +``` +scw iam api-key update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| access-key | Required | Access key to update | +| default-project-id | | New default Project ID to set | +| description | | New description to update | + + + +## Applications management commands + +Applications management commands. + + +### Create a new application + +Create a new application. You must define the `name` parameter in the request. + +**Usage:** + +``` +scw iam application create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the application to create (max length is 64 characters) | +| description | | Description of the application (max length is 200 characters) | +| tags.{index} | | Tags associated with the application (maximum of 10 tags) | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Delete an application + +Delete an application. Note that this action is irreversible and will automatically delete the application's API keys. Policies attached to users and applications via this group will no longer apply. + +**Usage:** + +``` +scw iam application delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| application-id | Required | ID of the application to delete | + + + +### Get a given application + +Retrieve information about an application, specified by the `application_id` parameter. The application's full details, including `id`, `email`, `organization_id`, `status` and `two_factor_enabled` are returned in the response. + +**Usage:** + +``` +scw iam application get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| application-id | Required | ID of the application to find | + + + +### List applications of an Organization + +List the applications of an Organization. By default, the applications listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `application_ids`. + +**Usage:** + +``` +scw iam application list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Criteria for sorting results | +| name | | Name of the application to filter | +| editable | | Defines whether to filter out editable applications or not | +| application-ids.{index} | | Filter by list of IDs | +| tag | | Filter by tags containing a given string | +| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Update an application + +Update the parameters of an application, including `name` and `description`. + +**Usage:** + +``` +scw iam application update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| application-id | Required | ID of the application to update | +| name | | New name for the application (max length is 64 chars) | +| description | | New description for the application (max length is 200 chars) | +| tags.{index} | | New tags for the application (maximum of 10 tags) | + + + +## Groups management commands + +Groups management commands. + + +### Add a user or an application to a group + +Add a user or an application to a group. You can specify a `user_id` and and `application_id` in the body of your request. Note that you can only add one of each per request. + +**Usage:** + +``` +scw iam group add-member [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group | +| user-id | | ID of the user to add | +| application-id | | ID of the application to add | + + + +### Add multiple users and applications to a group + +Add multiple users and applications to a group in a single call. You can specify an array of `user_id`s and `application_id`s. Note that any existing users and applications in the group will remain. To add new users/applications and delete pre-existing ones, use the [Overwrite users and applications of a group](#path-groups-overwrite-users-and-applications-of-a-group) method. + +**Usage:** + +``` +scw iam group add-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group | +| user-ids.{index} | | IDs of the users to add | +| application-ids.{index} | | IDs of the applications to add | + + + +### Create a group + +Create a new group. You must define the `name` and `organization_id` parameters in the request. + +**Usage:** + +``` +scw iam group create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the group to create (max length is 64 chars). MUST be unique inside an Organization | +| description | | Description of the group to create (max length is 200 chars) | +| tags.{index} | | Tags associated with the group (maximum of 10 tags) | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + +**Examples:** + + +Create a group +``` +scw iam group create name=foobar +``` + + + + +### Delete a group + +Delete a group. Note that this action is irreversible and could delete permissions for group members. Policies attached to users and applications via this group will no longer apply. + +**Usage:** + +``` +scw iam group delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group to delete | + + +**Examples:** + + +Delete a given group +``` +scw iam group delete 11111111-1111-1111-1111-111111111111 +``` + + + + +### Get a group + +Retrive information about a given group, specified by the `group_id` parameter. The group's full details, including `user_ids` and `application_ids` are returned in the response. + +**Usage:** + +``` +scw iam group get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group | + + + +### List groups + +List groups. By default, the groups listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters to filter your query. Use `user_ids` or `application_ids` to list all groups certain users or applications belong to. + +**Usage:** + +``` +scw iam group list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Sort order of groups | +| name | | Name of group to find | +| application-ids.{index} | | Filter by a list of application IDs | +| user-ids.{index} | | Filter by a list of user IDs | +| group-ids.{index} | | Filter by a list of group IDs | +| tag | | Filter by tags containing a given string | +| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Remove a user or an application from a group + +Remove a user or an application from a group. You can specify a `user_id` and and `application_id` in the body of your request. Note that you can only remove one of each per request. Removing a user from a group means that any permissions given to them via the group (i.e. from an attached policy) will no longer apply. Be sure you want to remove these permissions from the user before proceeding. + +**Usage:** + +``` +scw iam group remove-member [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group | +| user-id | | ID of the user to remove | +| application-id | | ID of the application to remove | + + + +### Overwrite users and applications of a group + +Overwrite users and applications configuration in a group. Any information that you add using this command will overwrite the previous configuration. + +**Usage:** + +``` +scw iam group set-members [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | | +| user-ids.{index} | Required | | +| application-ids.{index} | Required | | + + + +### Update a group + +Update the parameters of group, including `name` and `description`. + +**Usage:** + +``` +scw iam group update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| group-id | Required | ID of the group to update | +| name | | New name for the group (max length is 64 chars). MUST be unique inside an Organization | +| description | | New description for the group (max length is 200 chars) | +| tags.{index} | | New tags for the group (maximum of 10 tags) | + + + +## JWTs management commands + +JWTs management commands. + + +### Delete a JWT + +Delete a JWT. + +**Usage:** + +``` +scw iam jwt delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| jti | Required | JWT ID of the JWT to delete | + + + +### Get a JWT + +Get a JWT. + +**Usage:** + +``` +scw iam jwt get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| jti | Required | JWT ID of the JWT to get | + + + +### List JWTs + +List JWTs. + +**Usage:** + +``` +scw iam jwt list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Criteria for sorting results | +| audience-id | Required | ID of the user to search | +| expired | | Filter out expired JWTs or not | + + + +## Log management commands + +Log management commands. + + +### Get a log + +Retrieve information about a log, specified by the `log_id` parameter. The log's full details, including `id`, `ip`, `user_agent`, `action`, `bearer_id`, `resource_type` and `resource_id` are returned in the response. + +**Usage:** + +``` +scw iam log get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| log-id | Required | ID of the log | + + + +### List logs + +List logs available for given Organization. You must define the `organization_id` in the query path of your request. + +**Usage:** + +``` +scw iam log list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc` | Criteria for sorting results | +| created-after | | Defined whether or not to filter out logs created after this timestamp | +| created-before | | Defined whether or not to filter out logs created before this timestamp | +| action | One of: `unknown_action`, `created`, `updated`, `deleted` | Defined whether or not to filter out by a specific action | +| resource-type | One of: `unknown_resource_type`, `api_key`, `user`, `application`, `group`, `policy` | Defined whether or not to filter out by a specific type of resource | +| search | | Defined whether or not to filter out log by bearer ID or resource ID | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +## Permission sets management commands + +Permission sets management commands. + + +### List permission sets + +List permission sets available for given Organization. You must define the `organization_id` in the query path of your request. + +**Usage:** + +``` +scw iam permission-set list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc` | Criteria for sorting results | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +## Policies management commands + +Policies management commands. + + +### Clone a policy + +Clone a policy. You must define specify the `policy_id` parameter in your request. + +**Usage:** + +``` +scw iam policy clone [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | | + + + +### Create a new policy + +Create a new application. You must define the `name` parameter in the request. You can specify parameters such as `user_id`, `groups_id`, `application_id`, `no_principal`, `rules` and its child attributes. + +**Usage:** + +``` +scw iam policy create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the policy to create (max length is 64 characters) | +| description | | Description of the policy to create (max length is 200 characters) | +| rules.{index}.permission-set-names.{index} | | Names of permission sets bound to the rule | +| rules.{index}.condition | | Condition expression to evaluate | +| rules.{index}.project-ids.{index} | | List of Project IDs the rule is scoped to | +| rules.{index}.organization-id | | ID of Organization the rule is scoped to | +| tags.{index} | | Tags associated with the policy (maximum of 10 tags) | +| user-id | | ID of user attributed to the policy | +| group-id | | ID of group attributed to the policy | +| application-id | | ID of application attributed to the policy | +| no-principal | | Defines whether or not a policy is attributed to a principal | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + +**Examples:** + + +Add a policy for a group that gives InstanceFullAccess on all projects +``` +scw iam policy create group-id=11111111-1111-1111-1111-111111111111 rules.0.organization-id=11111111-1111-1111-1111-111111111111 rules.0.permission-set-names.0=InstancesFullAccess +``` + + + + +### Delete a policy + +Delete a policy. You must define specify the `policy_id` parameter in your request. Note that when deleting a policy, all permissions it gives to its principal (user, group or application) will be revoked. + +**Usage:** + +``` +scw iam policy delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | Id of policy to delete | + + + +### Get an existing policy + +Retrieve information about a policy, speficified by the `policy_id` parameter. The policy's full details, including `id`, `name`, `organization_id`, `nb_rules` and `nb_scopes`, `nb_permission_sets` are returned in the response. + +**Usage:** + +``` +scw iam policy get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | Id of policy to search | + + + +### List policies of an Organization + +List the policies of an Organization. By default, the policies listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters to filter your query, such as `user_ids`, `groups_ids`, `application_ids`, and `policy_name`. + +**Usage:** + +``` +scw iam policy list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `policy_name_asc`, `policy_name_desc`, `created_at_asc`, `created_at_desc` | Criteria for sorting results | +| editable | | Defines whether or not filter out editable policies | +| user-ids.{index} | | Defines whether or not to filter by list of user IDs | +| group-ids.{index} | | Defines whether or not to filter by list of group IDs | +| application-ids.{index} | | Filter by a list of application IDs | +| no-principal | | Defines whether or not the policy is attributed to a principal | +| policy-name | | Name of the policy to fetch | +| tag | | Filter by tags containing a given string | +| policy-ids.{index} | | Filter by a list of IDs | +| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Update an existing policy + +Update the parameters of a policy, including `name`, `description`, `user_id`, `group_id`, `application_id` and `no_principal`. + +**Usage:** + +``` +scw iam policy update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | Id of policy to update | +| name | | New name for the policy (max length is 64 characters) | +| description | | New description of policy (max length is 200 characters) | +| tags.{index} | | New tags for the policy (maximum of 10 tags) | +| user-id | | New ID of user attributed to the policy | +| group-id | | New ID of group attributed to the policy | +| application-id | | New ID of application attributed to the policy | +| no-principal | | Defines whether or not the policy is attributed to a principal | + + + +## Rules management commands + +Rules management commands. + + +### Create a rule for a specific IAM policy + + + +**Usage:** + +``` +scw iam rule create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | | Id of policy to update | +| permission-set-names.{index} | | Names of permission sets bound to the rule | +| project-ids.{index} | | List of Project IDs the rule is scoped to | +| organization-id | | ID of Organization the rule is scoped to | + + + +### Delete a rule for a specific IAM policy + + + +**Usage:** + +``` +scw iam rule delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | | Id of policy to update | +| rule-id | | Id of rule to delete | + + + +### List rules of a given policy + +List the rules of a given policy. By default, the rules listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `policy_id` in the query path of your request. + +**Usage:** + +``` +scw iam rule list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | Id of policy to search | + + + +### Set rules of a given policy + +Overwrite the rules of a given policy. Any information that you add using this command will overwrite the previous configuration. If you include some of the rules you already had in your previous configuration in your new one, but you change their order, the new order of display will apply. While policy rules are ordered, they have no impact on the access logic of IAM because rules are allow-only. + +**Usage:** + +``` +scw iam rule update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| policy-id | Required | Id of policy to update | +| rules.{index}.permission-set-names.{index} | | Names of permission sets bound to the rule | +| rules.{index}.condition | | Condition expression to evaluate | +| rules.{index}.project-ids.{index} | | List of Project IDs the rule is scoped to | +| rules.{index}.organization-id | | ID of Organization the rule is scoped to | + + + +## SSH keys management commands + +SSH keys management commands. + + +### Create an SSH key + +Add a new SSH key to a Scaleway Project. You must specify the `name`, `public_key` and `project_id`. + +**Usage:** + +``` +scw iam ssh-key create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the SSH key. Max length is 1000 | +| public-key | Required | SSH public key. Currently only the ssh-rsa, ssh-dss (DSA), ssh-ed25519 and ecdsa keys with NIST curves are supported. Max length is 65000 | +| project-id | | Project ID to use. If none is passed the default project ID will be used | + + +**Examples:** + + +Add a given ssh key +``` +scw iam ssh-key create name=foobar public-key="$(cat )" +``` + + + + +### Delete an SSH key + +Delete a given SSH key, specified by the `ssh_key_id`. Deleting an SSH is permanent, and cannot be undone. Note that you might need to update any configurations that used the SSH key. + +**Usage:** + +``` +scw iam ssh-key delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ssh-key-id | Required | | + + +**Examples:** + + +Delete a given SSH key +``` +scw iam ssh-key delete 11111111-1111-1111-1111-111111111111 +``` + + + + +### Get an SSH key + +Retrieve information about a given SSH key, specified by the `ssh_key_id` parameter. The SSH key's full details, including `id`, `name`, `public_key`, and `project_id` are returned in the response. + +**Usage:** + +``` +scw iam ssh-key get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ssh-key-id | Required | ID of the SSH key | + + + +### Initialize SSH key + +Initialize SSH key. + +**Usage:** + +``` +scw iam ssh-key init +``` + + + +### List SSH keys + +List SSH keys. By default, the SSH keys listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters for your query such as `organization_id`, `name`, `project_id` and `disabled`. + +**Usage:** + +``` +scw iam ssh-key list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Sort order of the SSH keys | +| name | | Name of group to find | +| project-id | | Filter by Project ID | +| disabled | | Defines whether to include disabled SSH keys or not | +| organization-id | Default: `` | Filter by Organization ID | + + + +### Update an SSH key + +Update the parameters of an SSH key, including `name` and `disable`. + +**Usage:** + +``` +scw iam ssh-key update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ssh-key-id | Required | | +| name | | Name of the SSH key. Max length is 1000 | +| disabled | | Enable or disable the SSH key | + + + +## Users management commands + +Users management commands. + + +### Create a new user + +Create a new user. You must define the `organization_id` and the `email` in your request. + +**Usage:** + +``` +scw iam user create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| email | | Email of the user | +| tags.{index} | | Tags associated with the user | +| member.email | | Email of the user to create | +| member.send-password-email | | Whether or not to send an email containing the member's password. | +| member.username | | The member's username | +| member.password | | The member's password | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + + +### Delete a guest user from an Organization + +Remove a user from an Organization in which they are a guest. You must define the `user_id` in your request. Note that removing a user from an Organization automatically deletes their API keys, and any policies directly attached to them become orphaned. + +**Usage:** + +``` +scw iam user delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| user-id | Required | ID of the user to delete | + + + +### Get a given user + +Retrieve information about a user, specified by the `user_id` parameter. The user's full details, including `id`, `email`, `organization_id`, `status` and `mfa` are returned in the response. + +**Usage:** + +``` +scw iam user get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| user-id | Required | ID of the user to find | + + + +### List users of an Organization + +List the users of an Organization. By default, the users listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `user_ids`. + +**Usage:** + +``` +scw iam user list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `email_asc`, `email_desc`, `last_login_asc`, `last_login_desc` | Criteria for sorting results | +| user-ids.{index} | | Filter by list of IDs | +| mfa | | Filter by MFA status | +| tag | | Filter by tags containing a given string | +| organization-id | Required
Default: `` | ID of the Organization to filter | + + + +### Update a user + +Update the parameters of a user, including `tags`. + +**Usage:** + +``` +scw iam user update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| user-id | Required | ID of the user to update | +| tags.{index} | | New tags for the user (maximum of 10 tags) | + + + diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000000..1cb72e0cdb --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,149 @@ + + +# Scaleway CLI v2 Documentation + +

+ +

+ CircleCI + GoReportCard +

+ +Scaleway CLI is a tool to help you pilot your Scaleway infrastructure directly from your terminal. + +!!! warning + + This website is under construction and may contain out-of-date information. Refer to the [Scaleway CLI repository](https://github.com/scaleway/scaleway-cli) for the latest release. + +## Installation + +### With a Package Manager (Recommended) + +A package manager installs and upgrades the Scaleway CLI with a single command. +We recommend this installation mode for more simplicity and reliability: + +#### Homebrew + +Install the [latest stable release](https://formulae.brew.sh/formula/scw) on macOS/Linux using [Homebrew](http://brew.sh): + +```sh +brew install scw +``` + +#### Arch Linux + +Install the latest stable release on Arch Linux from [official repositories](https://archlinux.org/packages/extra/x86_64/scaleway-cli/). +For instance with `pacman`: + +```sh +pacman -S scaleway-cli +``` + +#### Chocolatey + +Install the latest stable release on Windows using [Chocolatey](https://chocolatey.org/) ([Package](https://chocolatey.org/packages/scaleway-cli)): + +```powershell +choco install scaleway-cli +``` + +### Manually + +#### Released Binaries + +We provide [static-compiled binaries](https://github.com/scaleway/scaleway-cli/releases/latest) for darwin (macOS), GNU/Linux, and Windows platforms. +You just have to download the binary compatible with your platform to a directory available in your `PATH`: + +##### Linux + +```bash +curl -s https://raw.githubusercontent.com/scaleway/scaleway-cli/master/scripts/get.sh | sh +``` + +##### Windows + +You can download the last release here:
+[This official guide](https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574%28v%3Doffice.14%29) explains how to add tools to your `PATH`. + +### Docker Image + +You can use the CLI as you would run any Docker image: + +```sh +docker run -i --rm scaleway/cli:latest +``` + +See more in-depth information about running the CLI in Docker [here](./docs/docker.md) + +# Getting Started + +## Setup your configuration + +After you [installed](#Installation) the latest release just run the initialization command and let yourself be guided! :dancer: + +```bash +scw init +``` + +It will set up your profile, the authentication, and the auto-completion. + +## Basic commands + +``` +# Create an instance server +scw instance server create type=DEV1-S image=ubuntu_focal zone=fr-par-1 tags.0="scw-cli" + +# List your servers +scw instance server list + +# Create a Kubernetes cluster named foo with cilium as CNI, in version 1.17.4 and with a pool named default composed of 3 DEV1-M and with 2 tags +scw k8s cluster create name=foo version=1.17.4 pools.0.size=3 pools.0.node-type=DEV1-M pools.0.name=default tags.0=tag1 tags.1=tag2 +``` + +## Environment + +You can configure your config or enable functionalities with environment variables. + +Variables to override config are describe in [config documentation](docs/commands/config.md). +To enable beta features, you can set `SCW_ENABLE_BETA=1` in your environment. + +## Build it yourself + +### Build Locally + +If you have a >= Go 1.13 environment, you can install the `HEAD` version to test the latest features or to [contribute](./.github/CONTRIBUTING.md). +Note that this development version could include bugs, use [tagged releases](https://github.com/scaleway/scaleway-cli/releases/latest) if you need stability. + +```bash +go install github.com/scaleway/scaleway-cli/v2/cmd/scw@latest +``` + +Dependencies: We only use go [Modules](https://github.com/golang/go/wiki/Modules) with vendoring. + +### Build with Docker + +You can build the `scw` CLI with Docker. If you have Docker installed, you can run: + +```sh +docker build -t scaleway/cli . +``` + +Once built, you can then use the CLI as you would run any image: + +```sh +docker run -i --rm scaleway/cli +``` + +See more in-depth information about running the CLI in Docker [here](./docs/docker.md) + +# Development + +This repository is at its early stage and is still in active development. +If you are looking for a way to contribute please read [CONTRIBUTING.md](./.github/CONTRIBUTING.md). + +# Reach Us + +We love feedback. +Don't hesitate to open a [Github issue](https://github.com/scaleway/scaleway-cli/issues/new) or +feel free to reach us on [Scaleway Slack community](https://slack.scaleway.com/), +we are waiting for you on [#opensource](https://scaleway-community.slack.com/app_redirect?channel=opensource). diff --git a/docs/docs/inference.md b/docs/docs/inference.md new file mode 100644 index 0000000000..409ebe4f9a --- /dev/null +++ b/docs/docs/inference.md @@ -0,0 +1,401 @@ + +# Documentation for `scw inference` +This API allows you to manage your Inference services. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) + - [Add new ACLs](#add-new-acls) + - [Delete an exising ACL](#delete-an-exising-acl) + - [List your ACLs](#list-your-acls) + - [Set new ACL](#set-new-acl) +- [Deployment commands](#deployment-commands) + - [Create a deployment](#create-a-deployment) + - [Delete a deployment](#delete-a-deployment) + - [Get a deployment](#get-a-deployment) + - [Get the CA certificate](#get-the-ca-certificate) + - [List inference deployments](#list-inference-deployments) + - [Update a deployment](#update-a-deployment) +- [Endpoint management commands](#endpoint-management-commands) + - [Create an endpoint](#create-an-endpoint) + - [Delete an endpoint](#delete-an-endpoint) + - [Update an endpoint](#update-an-endpoint) +- [Models commands](#models-commands) + - [Get a model](#get-a-model) + - [List models](#list-models) +- [Node types management commands](#node-types-management-commands) + - [List available node types](#list-available-node-types) + +## Access Control List (ACL) management commands + +Access Control List (ACL) management commands. + + +### Add new ACLs + +Add new ACL rules for a specific deployment. + +**Usage:** + +``` +scw inference acl add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to add ACL rules to | +| acls.{index}.ip | | IP address to be allowed | +| acls.{index}.description | | Description of the ACL rule | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete an exising ACL + +Delete an exising ACL. + +**Usage:** + +``` +scw inference acl delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | ID of the ACL rule to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List your ACLs + +List ACLs for a specific deployment. + +**Usage:** + +``` +scw inference acl list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to list ACL rules for | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set new ACL + +Set new ACL rules for a specific deployment. + +**Usage:** + +``` +scw inference acl set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to set ACL rules for | +| acls.{index}.ip | | IP address to be allowed | +| acls.{index}.description | | Description of the ACL rule | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Deployment commands + +Deployment commands. + + +### Create a deployment + +Create a new inference deployment related to a specific model. + +**Usage:** + +``` +scw inference deployment create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the deployment | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| model-name | Required | Name of the model to use | +| accept-eula | | Accept the model's End User License Agreement (EULA). | +| node-type | Required | Name of the node type to use | +| tags.{index} | | List of tags to apply to the deployment | +| min-size | | Defines the minimum size of the pool | +| max-size | | Defines the maximum size of the pool | +| endpoints.{index}.is-public | Default: `false` | Will configure your public endpoint if true | +| endpoints.{index}.private-network.private-network-id | | ID of the Private Network | +| endpoints.{index}.disable-auth | Default: `false` | Disable the authentication on the endpoint. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a deployment + +Delete an existing inference deployment. + +**Usage:** + +``` +scw inference deployment delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a deployment + +Get the deployment for the given ID. + +**Usage:** + +``` +scw inference deployment get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to get | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get the CA certificate + +Get the CA certificate used for the deployment of private endpoints. +The CA certificate will be returned as a PEM file. + +**Usage:** + +``` +scw inference deployment get-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List inference deployments + +List all your inference deployments. + +**Usage:** + +``` +scw inference deployment list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_desc`, `created_at_asc`, `name_asc`, `name_desc` | Order in which to return results | +| project-id | | Filter by Project ID | +| name | | Filter by deployment name | +| tags.{index} | | Filter by tags | +| organization-id | | Filter by Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a deployment + +Update an existing inference deployment. + +**Usage:** + +``` +scw inference deployment update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to update | +| name | | Name of the deployment | +| tags.{index} | | List of tags to apply to the deployment | +| min-size | | Defines the new minimum size of the pool | +| max-size | | Defines the new maximum size of the pool | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Endpoint management commands + +Endpoint management commands. + + +### Create an endpoint + +Create a new Endpoint related to a specific deployment. + +**Usage:** + +``` +scw inference endpoint create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| deployment-id | Required | ID of the deployment to create the endpoint for | +| endpoint.is-public | Default: `false` | Will configure your public endpoint if true | +| endpoint.private-network.private-network-id | | ID of the Private Network | +| endpoint.disable-auth | Default: `false` | Disable the authentication on the endpoint. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete an endpoint + +Delete an existing Endpoint. + +**Usage:** + +``` +scw inference endpoint delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | ID of the endpoint to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update an endpoint + +Update an existing Endpoint. + +**Usage:** + +``` +scw inference endpoint update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | ID of the endpoint to update | +| disable-auth | | Disable the authentication on the endpoint. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Models commands + +Models commands. + + +### Get a model + +Get the model for the given ID. + +**Usage:** + +``` +scw inference model get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| model-id | Required | ID of the model to get | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List models + +List all available models. + +**Usage:** + +``` +scw inference model list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `display_rank_asc`, `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| project-id | | Filter by Project ID | +| name | | Filter by model name | +| tags.{index} | | Filter by tags | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Node types management commands + +Node types management commands. + + +### List available node types + +List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw inference node-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| include-disabled-types | | Include disabled node types in the response | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/info.md b/docs/docs/info.md new file mode 100644 index 0000000000..105de22ad0 --- /dev/null +++ b/docs/docs/info.md @@ -0,0 +1,6 @@ + +# Documentation for `scw info` +Get info about current settings + + + diff --git a/docs/docs/init.md b/docs/docs/init.md new file mode 100644 index 0000000000..5a7109bbc9 --- /dev/null +++ b/docs/docs/init.md @@ -0,0 +1,12 @@ + +# Documentation for `scw init` +Initialize the active profile of the config. +Default path for configuration file is based on the following priority order: + +- $SCW_CONFIG_PATH +- $XDG_CONFIG_HOME/scw/config.yaml +- $HOME/.config/scw/config.yaml +- $USERPROFILE/.config/scw/config.yaml + + + diff --git a/docs/docs/instance.md b/docs/docs/instance.md new file mode 100644 index 0000000000..fbc7de8e2b --- /dev/null +++ b/docs/docs/instance.md @@ -0,0 +1,3247 @@ + +# Documentation for `scw instance` +This API allows you to manage your Instances. + +- [Image management commands](#image-management-commands) + - [Create an Instance image](#create-an-instance-image) + - [Delete an Instance image](#delete-an-instance-image) + - [Get an Instance image](#get-an-instance-image) + - [List Instance images](#list-instance-images) + - [Update image](#update-image) + - [Wait for image to reach a stable state](#wait-for-image-to-reach-a-stable-state) +- [IP management commands](#ip-management-commands) + - [Attach an IP to a given server](#attach-an-ip-to-a-given-server) + - [Reserve a flexible IP](#reserve-a-flexible-ip) + - [Delete a flexible IP](#delete-a-flexible-ip) + - [Detach an ip from its server](#detach-an-ip-from-its-server) + - [Get a flexible IP](#get-a-flexible-ip) + - [List all flexible IPs](#list-all-flexible-ips) + - [Update a flexible IP](#update-a-flexible-ip) +- [Placement group management commands](#placement-group-management-commands) + - [Create a placement group](#create-a-placement-group) + - [Delete the specified placement group](#delete-the-specified-placement-group) + - [Get a placement group](#get-a-placement-group) + - [Get placement group servers](#get-placement-group-servers) + - [List placement groups](#list-placement-groups) + - [Set placement group](#set-placement-group) + - [Set placement group servers](#set-placement-group-servers) + - [Update a placement group](#update-a-placement-group) + - [Update placement group servers](#update-placement-group-servers) +- [Private NIC management commands](#private-nic-management-commands) + - [Create a private NIC connecting an Instance to a Private Network](#create-a-private-nic-connecting-an-instance-to-a-private-network) + - [Delete a private NIC](#delete-a-private-nic) + - [Get a private NIC](#get-a-private-nic) + - [List all private NICs](#list-all-private-nics) + - [Update a private NIC](#update-a-private-nic) +- [Security group management commands](#security-group-management-commands) + - [Remove all rules of a security group](#remove-all-rules-of-a-security-group) + - [Create a security group](#create-a-security-group) + - [Create rule](#create-rule) + - [Delete a security group](#delete-a-security-group) + - [Delete rule](#delete-rule) + - [Edit all rules of a security group](#edit-all-rules-of-a-security-group) + - [Get a security group](#get-a-security-group) + - [Get rule](#get-rule) + - [List security groups](#list-security-groups) + - [Get default rules](#get-default-rules) + - [List rules](#list-rules) + - [Update all the rules of a security group](#update-all-the-rules-of-a-security-group) + - [Update a security group](#update-a-security-group) + - [Update security group rule](#update-security-group-rule) +- [Instance management commands](#instance-management-commands) + - [Perform a raw API action on a server](#perform-a-raw-api-action-on-a-server) + - [Attach an IP to a server](#attach-an-ip-to-a-server) + - [Attach a volume to a server](#attach-a-volume-to-a-server) + - [Backup server](#backup-server) + - [Connect to the serial console of an instance](#connect-to-the-serial-console-of-an-instance) + - [Create server](#create-server) + - [Delete server](#delete-server) + - [Detach an IP from a server](#detach-an-ip-from-a-server) + - [Detach a volume from its server](#detach-a-volume-from-its-server) + - [Migrate server to IP mobility](#migrate-server-to-ip-mobility) + - [Get an Instance](#get-an-instance) + - [Get your server rdp password and decrypt it using your ssh key](#get-your-server-rdp-password-and-decrypt-it-using-your-ssh-key) + - [List all Instances](#list-all-instances) + - [List Instance actions](#list-instance-actions) + - [Reboot server](#reboot-server) + - [SSH into a server](#ssh-into-a-server) + - [Put server in standby mode](#put-server-in-standby-mode) + - [Power on server](#power-on-server) + - [Power off server](#power-off-server) + - [Terminate server](#terminate-server) + - [Update an Instance](#update-an-instance) + - [Wait for server to reach a stable state](#wait-for-server-to-reach-a-stable-state) +- [Instance type management commands](#instance-type-management-commands) + - [Get availability](#get-availability) + - [List Instance types](#list-instance-types) +- [Snapshot management commands](#snapshot-management-commands) + - [Migrate a volume and/or snapshots to SBS (Scaleway Block Storage)](#migrate-a-volume-andor-snapshots-to-sbs-(scaleway-block-storage)) + - [Create a snapshot from a specified volume or from a QCOW2 file](#create-a-snapshot-from-a-specified-volume-or-from-a-qcow2-file) + - [Delete a snapshot](#delete-a-snapshot) + - [Export a snapshot](#export-a-snapshot) + - [Get a snapshot](#get-a-snapshot) + - [List snapshots](#list-snapshots) + - [Get a volume or snapshot's migration plan](#get-a-volume-or-snapshot's-migration-plan) + - [Update a snapshot](#update-a-snapshot) + - [Wait for snapshot to reach a stable state](#wait-for-snapshot-to-reach-a-stable-state) +- [SSH Utilities](#ssh-utilities) + - [Add a public key to a server](#add-a-public-key-to-a-server) + - [Install a ssh config with all your servers as host +It generate hosts for instance servers, baremetal, apple-silicon and bastions](#install-a-ssh-config-with-all-your-servers-as-host +it-generate-hosts-for-instance-servers,-baremetal,-apple-silicon-and-bastions) + - [List manually added public keys](#list-manually-added-public-keys) + - [Remove a manually added public key from a server](#remove-a-manually-added-public-key-from-a-server) +- [User data management commands](#user-data-management-commands) + - [Delete user data](#delete-user-data) + - [Get user data](#get-user-data) + - [List user data](#list-user-data) + - [Add/set user data](#addset-user-data) +- [Volume management commands](#volume-management-commands) + - [Migrate a volume and/or snapshots to SBS (Scaleway Block Storage)](#migrate-a-volume-andor-snapshots-to-sbs-(scaleway-block-storage)) + - [Create a volume](#create-a-volume) + - [Delete a volume](#delete-a-volume) + - [Get a volume](#get-a-volume) + - [List volumes](#list-volumes) + - [Get a volume or snapshot's migration plan](#get-a-volume-or-snapshot's-migration-plan) + - [Update a volume](#update-a-volume) + - [Wait for volume to reach a stable state](#wait-for-volume-to-reach-a-stable-state) +- [Volume type management commands](#volume-type-management-commands) + - [List volume types](#list-volume-types) + + +## Image management commands + +Images are backups of your Instances. +One image will contain all the volumes of your Instance and can be used to restore your Instance and its data. You can also use it to create a series of Instances with a predefined configuration. +To copy not all but only one specified volume of an Instance, you can use the snapshot feature instead. + + +### Create an Instance image + +Create an Instance image from the specified snapshot ID. + +**Usage:** + +``` +scw instance image create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the image | +| snapshot-id | Required | UUID of the snapshot that will be used as root volume in the image | +| arch | Required
One of: `unknown_arch`, `x86_64`, `arm`, `arm64` | Architecture of the image | +| ~~default-bootscript~~ | Deprecated | Default bootscript of the image | +| additional-volumes.{index}.id | | UUID of the snapshot to add | +| additional-volumes.{index}.name | | Name of the additional snapshot | +| additional-volumes.{index}.size | | Size of the additional snapshot | +| additional-volumes.{index}.volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Underlying volume type of the additional snapshot | +| additional-volumes.{index}.project-id | | Project ID that own the additional snapshot | +| ~~additional-volumes.{index}.organization-id~~ | Deprecated | Organization ID that own the additional snapshot | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags of the image | +| public | | True to create a public image | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create an image named 'foobar' for x86_64 Instances from the specified snapshot ID +``` +scw instance server image create name=foobar snapshot-id=11111111-1111-1111-1111-111111111111 arch=x86_64 +``` + + + + +### Delete an Instance image + +Delete the image with the specified ID. + +**Usage:** + +``` +scw instance image delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | UUID of the image you want to delete | +| with-snapshots | | Delete the snapshots attached to this image | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete an image in the default zone with the specified ID +``` +scw instance image delete 11111111-1111-1111-1111-111111111111 +``` + +Delete an image in fr-par-1 zone with the specified ID +``` +scw instance image delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Get an Instance image + +Get details of an image with the specified ID. + +**Usage:** + +``` +scw instance image get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | UUID of the image you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get an image in the default zone with the specified ID +``` +scw instance image get 11111111-1111-1111-1111-111111111111 +``` + +Get an image in fr-par-1 zone with the specified ID +``` +scw instance image get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### List Instance images + +List all existing Instance images. + +**Usage:** + +``` +scw instance image list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | | +| public | | | +| arch | | | +| project-id | | | +| tags | | | +| organization-id | | | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all public images in the default zone +``` +scw instance image list +``` + + + + +### Update image + +Update the properties of an image. + +**Usage:** + +``` +scw instance image update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | UUID of the image | +| name | | Name of the image | +| arch | One of: `unknown_arch`, `x86_64`, `arm`, `arm64` | Architecture of the image | +| extra-volumes.{key}.id | | UUID of the snapshot | +| tags.{index} | | Tags of the image | +| public | | True to set the image as public | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for image to reach a stable state + +Wait for image to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the image. + +**Usage:** + +``` +scw instance image wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | ID of the image. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `1h0m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a image to reach a stable state +``` +scw instance image wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## IP management commands + +A flexible IP address is an IP address which you hold independently of any Instance. +You can attach it to any of your Instances and do live migration of the IP address between your Instances. + +Note that attaching a flexible IP address to an Instance removes its previous public IP and interrupts any ongoing public connection to the Instance. This does not apply if you have migrated your server to the new Network stack and have at least one flexible IP attached to the Instance. + + +### Attach an IP to a given server + +Attach an IP to a given server. + +**Usage:** + +``` +scw instance ip attach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip | Required | IP or UUID of the IP. | +| server-id | Required | UUID of the server to attach the IP to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Attach an IP to the given server +``` +scw instance ip attach 1.2.3.4 server-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### Reserve a flexible IP + +Reserve a flexible IP and attach it to the specified Instance. + +**Usage:** + +``` +scw instance ip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags of the IP | +| server | | UUID of the Instance you want to attach the IP to | +| type | One of: `unknown_iptype`, `nat`, `routed_ipv4`, `routed_ipv6` | IP type to reserve (either 'routed_ipv4' or 'routed_ipv6', use of 'nat' is deprecated) | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create an IP in the default zone +``` +scw instance ip create +``` + +Create an IP in fr-par-1 zone +``` +scw instance ip create zone=fr-par-1 +``` + +Create an IP and attach it to the specified Instance +``` +scw instance ip create server=11111111-1111-1111-1111-111111111111 +``` + + + + +### Delete a flexible IP + +Delete the IP with the specified ID. + +**Usage:** + +``` +scw instance ip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip | Required | ID or address of the IP to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete an IP in the default zone with the specified ID +``` +scw instance ip delete 11111111-1111-1111-1111-111111111111 +``` + +Delete an IP in fr-par-1 zone with the specified ID +``` +scw instance ip delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + +Delete an IP using directly the specified IP address +``` +scw instance ip delete 51.15.253.183 +``` + + + + +### Detach an ip from its server + +Detach an ip from its server. + +**Usage:** + +``` +scw instance ip detach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip | Required | IP or UUID of the IP. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Detach an IP by using its UUID +``` +scw instance ip detach 11111111-1111-1111-1111-111111111111 +``` + +Detach an IP by using its IP address +``` +scw instance ip detach 1.2.3.4 +``` + + + + +### Get a flexible IP + +Get details of an IP with the specified ID or address. + +**Usage:** + +``` +scw instance ip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip | Required | IP ID or address to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get an IP in the default zone with the specified ID +``` +scw instance ip get 11111111-1111-1111-1111-111111111111 +``` + +Get an IP in fr-par-1 zone with the specified ID +``` +scw instance ip get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + +Get an IP, directly using the specified IP address +``` +scw instance ip get 51.15.253.183 +``` + + + + +### List all flexible IPs + +List all flexible IPs in a specified zone. + +**Usage:** + +``` +scw instance ip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID in which the IPs are reserved | +| tags | | Filter IPs with these exact tags (to filter with several tags, use commas to separate them) | +| name | | Filter on the IP address (Works as a LIKE operation on the IP address) | +| type | | Filter on the IP Mobility IP type (whose value should be either 'routed_ipv4', 'routed_ipv6' or 'nat') | +| organization-id | | Organization ID in which the IPs are reserved | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all IPs in the default zone +``` +scw instance ip list +``` + +List all IPs in fr-par-1 zone +``` +scw instance ip list zone=fr-par-1 +``` + + + + +### Update a flexible IP + +Update a flexible IP in the specified zone with the specified ID. + +**Usage:** + +``` +scw instance ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip | Required | IP ID or IP address | +| reverse | | Reverse domain name | +| type | One of: `unknown_iptype`, `nat`, `routed_ipv4`, `routed_ipv6` | Convert a 'nat' IP to a 'routed_ipv4' | +| tags.{index} | | An array of keywords you want to tag this IP with | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Update an IP in the default zone with the specified ID +``` +scw instance ip update 11111111-1111-1111-1111-111111111111 reverse=example.com +``` + +Update an IP in fr-par-1 zone with the specified ID +``` +scw instance ip update 11111111-1111-1111-1111-111111111111 zone=fr-par-1 reverse=example.com +``` + +Update an IP using directly the specified IP address +``` +scw instance ip update 51.15.253.183 reverse=example.com +``` + + + + +## Placement group management commands + +Placement groups allow the user to express a preference regarding +the physical position of a group of Instances. The feature lets the user +choose to either group Instances on the same physical hardware for +best network throughput and low latency or to spread Instances across +physically distanced hardware to reduce the risk of physical failure. + +The operating mode is selected by a `policy_type`. Two policy +types are available: + - `low_latency` will group Instances on the same hypervisors + - `max_availability` will spread Instances across physically distanced hypervisors + +The `policy_type` is set to `max_availability` by default. + +For each policy types, one of the two `policy_mode` may be selected: + - `optional` will start your Instances even if the constraint is not respected + - `enforced` guarantees that if the Instance starts, the constraint is respected + +The `policy_mode` is set by default to `optional`. + + +### Create a placement group + +Create a new placement group in a specified Availability Zone. + +**Usage:** + +``` +scw instance placement-group create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the placement group | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags of the placement group | +| policy-mode | One of: `optional`, `enforced` | Operating mode of the placement group | +| policy-type | One of: `max_availability`, `low_latency` | Policy type of the placement group | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create a placement group with default name +``` +scw instance placement-group create +``` + +Create a placement group with the specified name +``` +scw instance placement-group create name=foobar +``` + +Create an enforced placement group +``` +scw instance placement-group create policy-mode=enforced +``` + +Create an optional placement group +``` +scw instance placement-group create policy-mode=optional +``` + +Create an optional low latency placement group +``` +scw instance placement-group create policy-mode=optional policy-type=low_latency +``` + +Create an enforced low latency placement group +``` +scw instance placement-group create policy-mode=enforced policy-type=low_latency +``` + + + + +### Delete the specified placement group + +Delete the specified placement group. + +**Usage:** + +``` +scw instance placement-group delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete a placement group in the default zone with the specified ID +``` +scw instance placement-group delete 11111111-1111-1111-1111-111111111111 +``` + +Delete a placement group in fr-par-1 zone with the specified ID +``` +scw instance placement-group delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Get a placement group + +Get the specified placement group. + +**Usage:** + +``` +scw instance placement-group get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a placement group with the specified ID +``` +scw instance placement-group get 6c15f411-3b6f-402d-8eba-ae24ef9254e9 +``` + + + + +### Get placement group servers + +Get all Instances belonging to the specified placement group. + +**Usage:** + +``` +scw instance placement-group get-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List placement groups + +List all placement groups in a specified Availability Zone. + +**Usage:** + +``` +scw instance placement-group list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | List only placement groups of this Project ID | +| tags | | List placement groups with these exact tags (to filter with several tags, use commas to separate them) | +| name | | Filter placement groups by name (for eg. "cluster1" will return "cluster100" and "cluster1" but not "foo") | +| organization-id | | List only placement groups of this Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all placement groups in the default zone +``` +scw instance placement-group list +``` + +List placement groups that match a specified name ('cluster1' will return 'cluster100' and 'cluster1' but not 'foo') +``` +scw instance placement-group list name=cluster1 +``` + + + + +### Set placement group + +Set all parameters of the specified placement group. + +**Usage:** + +``` +scw instance placement-group set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | | +| name | | | +| policy-mode | One of: `optional`, `enforced` | | +| policy-type | One of: `max_availability`, `low_latency` | | +| project | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | | +| organization | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Set placement group servers + +Set all Instances belonging to the specified placement group. + +**Usage:** + +``` +scw instance placement-group set-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group you want to set | +| servers.{index} | Required | An array of the Instances' UUIDs you want to configure | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Update the complete set of Instances in a specified placement group (all Instances must be shut down) +``` +scw instance placement-group set-servers placement-group-id=ced0fd4d-bcf0-4479-85b6-7027e54456e6 servers.0=5a250608-24ec-4c31-9631-b3ded8c861cb servers.1=e54fd249-0787-4794-ab14-af6ee74df274 +``` + + + + +### Update a placement group + +Update one or more parameter of the specified placement group. + +**Usage:** + +``` +scw instance placement-group update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group | +| name | | Name of the placement group | +| tags.{index} | | Tags of the placement group | +| policy-mode | One of: `optional`, `enforced` | Operating mode of the placement group | +| policy-type | One of: `max_availability`, `low_latency` | Policy type of the placement group | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Update the name of a placement group +``` +scw instance placement-group update 95053f33-cd3c-4cdc-b2b0-57d2dda97b13 name=foobar +``` + +Update the policy mode of a placement group (all Instances in your placement group MUST be shut down) +``` +scw instance placement-group update 1f883434-8c2d-40f0-b686-d0754b3a7bc0 policy-mode=enforced +``` + +Update the policy type of a placement group (all Instances in your placement group MUST be shutdown) +``` +scw instance placement-group update 0954ec26-9917-47b6-8c5c-7bc81d7bb9d2 policy-type=low_latency +``` + + + + +### Update placement group servers + +Update all Instances belonging to the specified placement group. + +**Usage:** + +``` +scw instance placement-group update-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| placement-group-id | Required | UUID of the placement group you want to update | +| servers.{index} | Required | An array of the Instances' UUIDs you want to configure | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Private NIC management commands + +A Private NIC is the network interface that connects an Instance to a +Private Network. An Instance can have multiple private NICs at the same +time, but each NIC must belong to a different Private Network. + + +### Create a private NIC connecting an Instance to a Private Network + +Create a private NIC connecting an Instance to a Private Network. + +**Usage:** + +``` +scw instance private-nic create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance the private NIC will be attached to | +| private-network-id | Required | UUID of the private network where the private NIC will be attached | +| tags.{index} | | Private NIC tags | +| ~~ip-ids.{index}~~ | Deprecated | Ip_ids defined from IPAM | +| ipam-ip-ids.{index} | | UUID of IPAM ips, to be attached to the instance in the requested private network | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a private NIC + +Delete a private NIC. + +**Usage:** + +``` +scw instance private-nic delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Instance to which the private NIC is attached | +| private-nic-id | Required | Private NIC unique ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a private NIC + +Get private NIC properties. + +**Usage:** + +``` +scw instance private-nic get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Instance to which the private NIC is attached | +| private-nic-id | Required | The private NIC unique ID or MAC address | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all private NICs + +List all private NICs of a specified Instance. + +**Usage:** + +``` +scw instance private-nic list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Instance to which the private NIC is attached | +| tags | | Private NIC tags | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all private NICs on a specified server +``` +scw instance private-nic list +``` + +List private NICs of the Instance ID 'my_server_id' +``` +scw instance private-nic list server-id=my_server_id +``` + + + + +### Update a private NIC + +Update one or more parameter(s) of a specified private NIC. + +**Usage:** + +``` +scw instance private-nic update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance the private NIC will be attached to | +| private-nic-id | Required | Private NIC unique ID | +| tags.{index} | | Tags used to select private NIC/s | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Update tags of a private NIC +``` +scw instance private-nic update server-id=11111111-1111-1111-1111-111111111111 private-nic-id=11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar +``` + + + + +## Security group management commands + +A security group is a set of firewall rules on a set of Instances. +Security groups enable you to create rules that either drop or allow incoming traffic from certain ports of your Instances. + +Security groups are stateful by default which means return traffic is automatically allowed, regardless of any rules. +As a contrary, you have to switch in a stateless mode to define explicitly allowed. + + +### Remove all rules of a security group + + + +**Usage:** + +``` +scw instance security-group clear [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | ID of the security group to reset. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Remove all rules of the given security group +``` +scw instance security-group clear security-group-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### Create a security group + +Create a security group with a specified name and description. + +**Usage:** + +``` +scw instance security-group create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the security group | +| description | | Description of the security group | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags of the security group | +| ~~organization-default~~ | Deprecated | Defines whether this security group becomes the default security group for new Instances | +| project-default | | Whether this security group becomes the default security group for new Instances | +| stateful | Default: `true` | Whether the security group is stateful or not | +| inbound-default-policy | Default: `accept`
One of: `unknown_policy`, `accept`, `drop` | Default policy for inbound rules | +| outbound-default-policy | Default: `accept`
One of: `unknown_policy`, `accept`, `drop` | Default policy for outbound rules | +| enable-default-security | | True to block SMTP on IPv4 and IPv6. This feature is read only, please open a support ticket if you need to make it configurable | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create a security group with a specified name and description +``` +scw instance security-group create name=foobar description=foobar foobar +``` + +Create a security group that will be applied as default on all Instances of this Project +``` +scw instance security-group create project-default=true +``` + +Create a security group that will have a default drop inbound policy (traffic your Instance receives) +``` +scw instance security-group create inbound-default-policy=drop +``` + +Create a security group that will have a default drop outbound policy (traffic your Instance transmits) +``` +scw instance security-group create outbound-default-policy=drop +``` + +Create a stateless security group +``` +scw instance security-group create +``` + + + + +### Create rule + +Create a rule in the specified security group ID. + +**Usage:** + +``` +scw instance security-group create-rule [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group | +| protocol | Required
One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | | +| direction | Required
One of: `unknown_direction`, `inbound`, `outbound` | | +| action | Required
One of: `unknown_action`, `accept`, `drop` | | +| ip-range | Required
Default: `0.0.0.0/0` | | +| dest-port-from | | Beginning of the range of ports to apply this rule to (inclusive) | +| dest-port-to | | End of the range of ports to apply this rule to (inclusive) | +| position | | Position of this rule in the security group rules list | +| editable | | Indicates if this rule is editable (will be ignored) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Allow incoming SSH +``` +scw instance security-group create-rule security-group-id=1248283f-17de-464a-b03b-3f975ada3fa8 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=22 +``` + +Allow HTTP +``` +scw instance security-group create-rule security-group-id=e8ba77c1-9ccb-4c0c-b08d-555cfd7f57e4 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=80 +``` + +Allow HTTPS +``` +scw instance security-group create-rule security-group-id=e5906437-8650-4fe2-8ca7-32e1d7320c1b protocol=TCP direction=inbound action=accept ip-range= dest-port-from=443 +``` + +Allow a specified IP range +``` +scw instance security-group create-rule security-group-id=b6a58155-a2f8-48bd-9da9-3ff9783fa0d4 protocol=ANY direction=inbound action=accept ip-range=10.0.0.0/16 +``` + +Allow FTP +``` +scw instance security-group create-rule security-group-id=9c46df03-83c2-46fb-936c-16ecb44860e1 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=20 dest-port-to=21 +``` + + + + +### Delete a security group + +Delete a security group with the specified ID. + +**Usage:** + +``` +scw instance security-group delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete the security group with the specified ID +``` +scw instance security-group delete 69e17c83-9945-47ac-8b29-8c1ad050ee83 +``` + + + + +### Delete rule + +Delete a security group rule with the specified ID. + +**Usage:** + +``` +scw instance security-group delete-rule [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | | +| security-group-rule-id | Required | | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete a security group rule with the specified ID +``` +scw instance security-group delete-rule security-group-id=a01a36e5-5c0c-42c1-ae06-167e587b7ac4 security-group-rule-id=b8c773ef-a6ea-4b50-a7c1-737864290a3f +``` + + + + +### Edit all rules of a security group + +This command starts your default editor to edit a marshaled version of your resource +Default editor will be taken from $VISUAL, then $EDITOR or an editor based on your system + +**Usage:** + +``` +scw instance security-group edit [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | ID of the security group to reset. | +| mode | Default: `yaml`
One of: `yaml`, `json` | marshaling used when editing data | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a security group + +Get the details of a security group with the specified ID. + +**Usage:** + +``` +scw instance security-group get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a security group with the specified ID +``` +scw instance security-group get a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + + + + +### Get rule + +Get details of a security group rule with the specified ID. + +**Usage:** + +``` +scw instance security-group get-rule [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | | +| security-group-rule-id | Required | | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get details of a security group rule with the specified ID +``` +scw instance security-group get-rule security-group-id=d900fa38-2f0d-4b09-b6d7-f3e46a13f34c security-group-rule-id=1f9a16a5-7229-4c03-9327-253e257cf38a +``` + + + + +### List security groups + +List all existing security groups. + +**Usage:** + +``` +scw instance security-group list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the security group | +| project-id | | Security group Project ID | +| tags | | List security groups with these exact tags (to filter with several tags, use commas to separate them) | +| project-default | | Filter security groups with this value for project_default | +| organization-id | | Security group Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all security groups that match the specified name +``` +scw instance security-group list name=foobar +``` + + + + +### Get default rules + +Lists the default rules applied to all the security groups. + +**Usage:** + +``` +scw instance security-group list-default-rules [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List rules + +List the rules of the a specified security group ID. + +**Usage:** + +``` +scw instance security-group list-rules [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update all the rules of a security group + +Replaces the existing rules of the security group with the rules provided. This endpoint supports the update of existing rules, creation of new rules and deletion of existing rules when they are not passed in the request. + +**Usage:** + +``` +scw instance security-group set-rules [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group to update the rules on | +| rules.{index}.id | | UUID of the security rule to update. If no value is provided, a new rule will be created | +| rules.{index}.action | One of: `unknown_action`, `accept`, `drop` | Action to apply when the rule matches a packet | +| rules.{index}.protocol | One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | Protocol family this rule applies to | +| rules.{index}.direction | One of: `unknown_direction`, `inbound`, `outbound` | Direction the rule applies to | +| rules.{index}.ip-range | | Range of IP addresses these rules apply to | +| rules.{index}.dest-port-from | | Beginning of the range of ports this rule applies to (inclusive). This value will be set to null if protocol is ICMP or ANY | +| rules.{index}.dest-port-to | | End of the range of ports this rule applies to (inclusive). This value will be set to null if protocol is ICMP or ANY, or if it is equal to dest_port_from | +| rules.{index}.position | | Position of this rule in the security group rules list. If several rules are passed with the same position, the resulting order is undefined | +| rules.{index}.editable | | Indicates if this rule is editable. Rules with the value false will be ignored | +| rules.{index}.zone | | Zone of the rule. This field is ignored | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a security group + +Update the properties of security group. + +**Usage:** + +``` +scw instance security-group update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group | +| name | | Name of the security group | +| description | | Description of the security group | +| enable-default-security | | True to block SMTP on IPv4 and IPv6. This feature is read only, please open a support ticket if you need to make it configurable | +| inbound-default-policy | One of: `unknown_policy`, `accept`, `drop` | Default inbound policy | +| tags.{index} | | Tags of the security group | +| ~~organization-default~~ | Deprecated | Please use project_default instead | +| project-default | | True use this security group for future Instances created in this project | +| outbound-default-policy | One of: `unknown_policy`, `accept`, `drop` | Default outbound policy | +| stateful | | True to set the security group as stateful | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update security group rule + +Update the properties of a rule from a specified security group. + +**Usage:** + +``` +scw instance security-group update-rule [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| security-group-id | Required | UUID of the security group | +| security-group-rule-id | Required | UUID of the rule | +| protocol | One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | Protocol family this rule applies to | +| direction | One of: `unknown_direction`, `inbound`, `outbound` | Direction the rule applies to | +| action | One of: `unknown_action`, `accept`, `drop` | Action to apply when the rule matches a packet | +| ip-range | | Range of IP addresses these rules apply to | +| dest-port-from | | Beginning of the range of ports this rule applies to (inclusive). If 0 is provided, unset the parameter. | +| dest-port-to | | End of the range of ports this rule applies to (inclusive). If 0 is provided, unset the parameter. | +| position | | Position of this rule in the security group rules list | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Instance management commands + +Instances are computing units providing resources to run your applications on. +Scaleway offers various Instance types including **Virtual Instances** and **dedicated GPU Instances**. +**Note: Instances can be referenced as "servers" in API endpoints.** + + +### Perform a raw API action on a server + + + +**Usage:** + +``` +scw instance server action [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| action | Required | The raw API action to perform, as listed with 'scw instance server list-actions' | +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Start a server in the default zone with a given id +``` +scw instance server action 11111111-1111-1111-1111-111111111111 action=poweron +``` + + + + +### Attach an IP to a server + + + +**Usage:** + +``` +scw instance server attach-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| ip | Required | UUID of the IP to attach or its UUID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Attach an IP to a server +``` +scw instance server attach-ip 11111111-1111-1111-1111-111111111111 ip=11111111-1111-1111-1111-111111111111 +``` + +Attach an IP to a server +``` +scw instance server attach-ip 11111111-1111-1111-1111-111111111111 ip=1.2.3.4 +``` + + + + +### Attach a volume to a server + + + +**Usage:** + +``` +scw instance server attach-volume [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server | +| volume-id | Required | ID of the volume to attach | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Attach a volume to a server +``` +scw instance server attach-volume server-id=11111111-1111-1111-1111-111111111111 volume-id=22222222-1111-5555-2222-666666111111 +``` + + + + +### Backup server + +Create a new image based on the server. + +This command: + - creates a snapshot of all attached volumes. + - creates an image based on all these snapshots. + +Once your image is ready you will be able to create a new server based on this image. + + +**Usage:** + +``` +scw instance server backup [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server to backup. | +| name | Default: `` | Name of your backup. | +| unified | | Whether or not the type of the snapshot is unified. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create a new image based on a server +``` +scw instance server backup 11111111-1111-1111-1111-111111111111 +``` + + + + +### Connect to the serial console of an instance + + + +**Usage:** + +``` +scw instance server console [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to connect to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Create server + +Create an instance server. + +**Usage:** + +``` +scw instance server create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image | Required
Default: `ubuntu_jammy` | Image ID or label of the server | +| type | Required
Default: `DEV1-S` | Server commercial type (help: https://www.scaleway.com/en/docs/compute/instances/reference-content/choosing-instance-type/) | +| name | Default: `` | Server name | +| root-volume | | Local root volume of the server | +| additional-volumes.{index} | | Additional local and block volumes attached to your server | +| ip | Default: `new` | Either an IP, an IP ID, 'new' to create a new IP, 'dynamic' to use a dynamic IP or 'none' for no public IP (new | dynamic | none | |
) | +| tags.{index} | | Server tags | +| ipv6 | | Enable IPv6, to be used with routed-ip-enabled=false | +| stopped | | Do not start server after its creation | +| security-group-id | | The security group ID used for this server | +| placement-group-id | | The placement group ID in which the server has to be created | +| cloud-init | | The cloud-init script to use | +| boot-type | Default: `local`
One of: `local`, `bootscript`, `rescue` | The boot type to use, if empty the local boot will be used. Will be overwritten to bootscript if bootscript-id is set. | +| routed-ip-enabled | | Enable routed IP support | +| admin-password-encryption-ssh-key-id | | ID of the IAM SSH Key used to encrypt generated admin password. Required when creating a windows server. | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | + + +**Examples:** + + +Create and start an instance on Ubuntu Focal +``` +scw instance server create image=ubuntu_focal +``` + +Create a GP1-XS instance, give it a name and add tags +``` +scw instance server create image=ubuntu_focal type=GP1-XS name=foo tags.0=prod tags.1=blue +``` + +Create an instance with 2 additional block volumes (50GB and 100GB) +``` +scw instance server create image=ubuntu_focal additional-volumes.0=block:50GB additional-volumes.1=block:100GB +``` + +Create an instance with 2 local volumes (10GB and 10GB) +``` +scw instance server create image=ubuntu_focal root-volume=local:10GB additional-volumes.0=local:10GB +``` + +Create an instance with volumes from snapshots +``` +scw instance server create image=ubuntu_focal root-volume=local: additional-volumes.0=block: +``` + +Create and start an instance from a snapshot +``` +scw instance server create image=none root-volume=local: +``` + +Create and start an instance using existing volume +``` +scw instance server create image=ubuntu_focal additional-volumes.0= +``` + +Use an existing IP +``` +ip=$(scw instance ip create | grep id | awk '{ print $2 }') +scw instance server create image=ubuntu_focal ip=$ip +``` + + + + +### Delete server + +Delete a server with the given ID. + +**Usage:** + +``` +scw instance server delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | | +| with-volumes | Default: `all`
One of: `none`, `local`, `block`, `root`, `all` | Delete the volumes attached to the server | +| with-ip | | Delete the IP attached to the server | +| force-shutdown | | Force shutdown of the instance server before deleting it | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete a server in the default zone with a given id +``` +scw instance server delete 11111111-1111-1111-1111-111111111111 +``` + +Delete a server in fr-par-1 zone with a given id +``` +scw instance server delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Detach an IP from a server + + + +**Usage:** + +``` +scw instance server detach-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the server. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Detach IP from a given server +``` +scw instance server detach-ip 11111111-1111-1111-1111-111111111111 +``` + + + + +### Detach a volume from its server + + + +**Usage:** + +``` +scw instance server detach-volume [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | ID of the volume to detach | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Detach a volume from its server +``` +scw instance server detach-volume volume-id=22222222-1111-5555-2222-666666111111 +``` + + + + +### Migrate server to IP mobility + +Enable routed IP for this server and migrate the nat public IP to routed +Server will reboot ! +https://www.scaleway.com/en/docs/compute/instances/api-cli/using-ip-mobility/ + + +**Usage:** + +``` +scw instance server enable-routed-ip [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Migrate a server with legacy network to IP mobility +``` +scw instance server enable-routed-ip 11111111-1111-1111-1111-111111111111 +``` + + + + +### Get an Instance + +Get the details of a specified Instance. + +**Usage:** + +``` +scw instance server get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get the Instance with its specified ID +``` +scw instance server get 94ededdf-358d-4019-9886-d754f8a2e78d +``` + + + + +### Get your server rdp password and decrypt it using your ssh key + + + +**Usage:** + +``` +scw instance server get-rdp-password [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to connect to | +| key | Default: `~/.ssh/id_rsa` | Path of the SSH key used to decrypt the rdp password | +| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | + + + +### List all Instances + +List all Instances in a specified Availability Zone, e.g. `fr-par-1`. + +**Usage:** + +``` +scw instance server list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | List only Instances of this Project ID | +| name | | Filter Instances by name (eg. "server1" will return "server100" and "server1" but not "foo") | +| ~~private-ip~~ | Deprecated | List Instances by private_ip | +| without-ip | | List Instances that are not attached to a public IP | +| with-ip | | List Instances by IP (both private_ip and public_ip are supported) | +| commercial-type | | List Instances of this commercial type | +| state | One of: `running`, `stopped`, `stopped in place`, `starting`, `stopping`, `locked` | List Instances in this state | +| tags | | List Instances with these exact tags (to filter with several tags, use commas to separate them) | +| private-network | | List Instances in this Private Network | +| order | One of: `creation_date_desc`, `creation_date_asc`, `modification_date_desc`, `modification_date_asc` | Define the order of the returned servers | +| private-networks | | List Instances from the given Private Networks (use commas to separate them) | +| private-nic-mac-address | | List Instances associated with the given private NIC MAC address | +| servers | | List Instances from these server ids (use commas to separate them) | +| organization-id | | List only Instances of this Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all Instances on your default zone +``` +scw instance server list +``` + +List Instances of this commercial type +``` +scw instance server list commercial-type=DEV1-S +``` + +List Instances that are not attached to a public IP +``` +scw instance server list without-ip=true +``` + +List Instances that match the specified name ('server1' will return 'server100' and 'server1' but not 'foo') +``` +scw instance server list name=server1 +``` + + + + +### List Instance actions + +List all actions (e.g. power on, power off, reboot) that can currently be performed on an Instance. + +**Usage:** + +``` +scw instance server list-actions [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Reboot server + + + +**Usage:** + +``` +scw instance server reboot [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Reboot a server in the default zone with a given id +``` +scw instance server reboot 11111111-1111-1111-1111-111111111111 +``` + +Reboot a server in fr-par-1 zone with a given id +``` +scw instance server reboot 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### SSH into a server + +Connect to distant server via the SSH protocol. + +**Usage:** + +``` +scw instance server ssh [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server ID to SSH into | +| username | Default: `root` | Username used for the SSH connection | +| port | Default: `22` | Port used for the SSH connection | +| command | | Command to execute on the remote server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Put server in standby mode + + + +**Usage:** + +``` +scw instance server standby [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Put in standby a server in the default zone with a given id +``` +scw instance server standby 11111111-1111-1111-1111-111111111111 +``` + +Put in standby a server in fr-par-1 zone with a given id +``` +scw instance server standby 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Power on server + + + +**Usage:** + +``` +scw instance server start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Start a server in the default zone with a given id +``` +scw instance server start 11111111-1111-1111-1111-111111111111 +``` + +Start a server in fr-par-1 zone with a given id +``` +scw instance server start 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Power off server + + + +**Usage:** + +``` +scw instance server stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Stop a server in the default zone with a given id +``` +scw instance server stop 11111111-1111-1111-1111-111111111111 +``` + +Stop a server in fr-par-1 zone with a given id +``` +scw instance server stop 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Terminate server + +Terminates a server with the given ID and all of its volumes. + +**Usage:** + +``` +scw instance server terminate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | | +| with-ip | | Delete the IP attached to the server | +| with-block | Default: `prompt`
One of: `prompt`, `true`, `false` | Delete the Block Storage volumes attached to the server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Terminate a server in the default zone with a given id +``` +scw instance server terminate 11111111-1111-1111-1111-111111111111 +``` + +Terminate a server in fr-par-1 zone with a given id +``` +scw instance server terminate 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + +Terminate a server and also delete its flexible IPs +``` +scw instance server terminate 11111111-1111-1111-1111-111111111111 with-ip=true +``` + + + + +### Update an Instance + +Update the Instance information, such as name, boot mode, or tags. + +**Usage:** + +``` +scw instance server update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance | +| name | | Name of the Instance | +| ip | | IP that should be attached to the server (use ip=none to detach) | +| cloud-init | | The cloud-init script to use | +| boot-type | One of: `local`, `bootscript`, `rescue` | | +| tags.{index} | | Tags of the Instance | +| volumes.{key}.boot | Default: `false` | Force the Instance to boot on this volume | +| volumes.{key}.base-snapshot | | ID of the snapshot on which this volume will be based | +| volumes.{key}.project | | Project ID of the volume | +| volumes.{key}.organization | | Organization ID of the volume | +| ~~bootscript~~ | Deprecated | | +| dynamic-ip-required | | | +| ~~routed-ip-enabled~~ | Deprecated | True to configure the instance so it uses the new routed IP mode (once this is set to True you cannot set it back to False) | +| public-ips.{index} | | A list of reserved IP IDs to attach to the Instance | +| ~~enable-ipv6~~ | Deprecated | | +| protected | | | +| security-group-id | | | +| volume-ids.{index} | | Will update ALL volume IDs at once, including the root volume of the server (use volume-ids=none to detach all volumes) | +| placement-group-id | | Placement group ID if Instance must be part of a placement group | +| private-nics.{index} | | Instance private NICs | +| commercial-type | | Set the commercial_type for this Instance. | +| admin-password-encryption-ssh-key-id | | UUID of the SSH RSA key that will be used to encrypt the initial admin password for OS requiring it. Mandatory for Windows OS. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Update the name of a specified Instance +``` +scw instance server update 11111111-1111-1111-1111-111111111111 name=foobar +``` + +Switch a specified Instance to rescue mode (reboot is required to access rescue mode) +``` +scw instance server update 11111111-1111-1111-1111-111111111111 boot-type=rescue +``` + +Overwrite tags of a specified Instance +``` +scw instance server update 11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar +``` + +Apply the specified security group to a specified server +``` +scw instance server server update 11111111-1111-1111-1111-111111111111 security-group-id=11111111-1111-1111-1111-111111111111 +``` + +Put a specified Instance in the specified placement group. Instance must be off +``` +scw instance server server update 11111111-1111-1111-1111-111111111111 placement-group-id=11111111-1111-1111-1111-111111111111 +``` + + + + +### Wait for server to reach a stable state + +Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. + +**Usage:** + +``` +scw instance server wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| timeout | Default: `10m0s` | Timeout of the wait | +| server-id | Required | ID of the server affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Wait for a server to reach a stable state +``` +scw instance server wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Instance type management commands + +All Instance types available in a specified zone. +Each type contains all the features of the Instance (CPU, RAM, Storage) as well as their associated pricing. + + +### Get availability + +Get availability for all Instance types. + +**Usage:** + +``` +scw instance server-type get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List Instance types + +List available Instance types and their technical details. + +**Usage:** + +``` +scw instance server-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all server-types in the default zone +``` +scw instance server-type list +``` + +List all server-types in fr-par-1 zone +``` +scw instance server-type list zone=fr-par-1 +``` + + + + +## Snapshot management commands + +Snapshots contain the data of a specified volume at a particular point in time. +The data can include the Instance's operating system, +configuration information and/or files stored on the volume. + +A snapshot can be done from a specified volume, e.g. you +have one Instance with a volume containing the OS and another one +containing the application data, and you want to use different +snapshot strategies on both volumes. + +A snapshot's volume type is its original volume's type (`l_ssd` or `b_ssd`). +Volumes can be created from snapshots of their own type. + + +### Migrate a volume and/or snapshots to SBS (Scaleway Block Storage) + +To be used, the call to this endpoint must be preceded by a call to the "Plan a migration" endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. + +**Usage:** + +``` +scw instance snapshot apply-migration [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | | The snapshot to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. | +| validation-key | Required | A value to be retrieved from a call to the "Plan a migration" endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Create a snapshot from a specified volume or from a QCOW2 file + +Create a snapshot from a specified volume or from a QCOW2 file in a specified Availability Zone. + +**Usage:** + +``` +scw instance snapshot create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Name of the snapshot | +| volume-id | | UUID of the volume | +| unified | | Whether a snapshot is unified or not. | +| tags.{index} | | Tags of the snapshot | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| bucket | | Bucket name for snapshot imports | +| key | | Object key for snapshot imports | +| size | | Imported snapshot size, must be a multiple of 512 | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create a snapshot in the default zone from the specified volume ID +``` +scw instance snapshot create volume-id=11111111-1111-1111-1111-111111111111 +``` + +Create a snapshot in fr-par-1 zone from the specified volume ID +``` +scw instance snapshot create zone=fr-par-1 volume-id=11111111-1111-1111-1111-111111111111 +``` + +Create a named snapshot from the specified volume ID +``` +scw instance snapshot create name=foobar volume-id=11111111-1111-1111-1111-111111111111 +``` + +Import a QCOW file as an Instance snapshot +``` +scw instance snapshot create zone=fr-par-1 name=my-imported-snapshot volume-type=b_ssd bucket=my-bucket key=my-qcow2-file-name +``` + + + + +### Delete a snapshot + +Delete the snapshot with the specified ID. + +**Usage:** + +``` +scw instance snapshot delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete a snapshot in the default zone with the specified ID +``` +scw instance snapshot delete 11111111-1111-1111-1111-111111111111 +``` + +Delete a snapshot in fr-par-1 zone with the specified ID +``` +scw instance snapshot delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### Export a snapshot + +Export a snapshot to a specified S3 bucket in the same region. + +**Usage:** + +``` +scw instance snapshot export [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| bucket | | S3 bucket name | +| key | | S3 object key | +| snapshot-id | Required | Snapshot ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Export a snapshot to an S3 bucket +``` +scw instance snapshot export zone=fr-par-1 snapshot-id=11111111-1111-1111-1111-111111111111 bucket=my-bucket key=my-qcow2-file-name +``` + + + + +### Get a snapshot + +Get details of a snapshot with the specified ID. + +**Usage:** + +``` +scw instance snapshot get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a snapshot in the default zone with the specified ID +``` +scw instance snapshot get 11111111-1111-1111-1111-111111111111 +``` + +Get a snapshot in fr-par-1 zone with the specified ID +``` +scw instance snapshot get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 +``` + + + + +### List snapshots + +List all snapshots of an Organization in a specified Availability Zone. + +**Usage:** + +``` +scw instance snapshot list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | List snapshots only for this Project ID | +| name | | List snapshots of the requested name | +| tags | | List snapshots that have the requested tag | +| base-volume-id | | List snapshots originating only from this volume | +| organization-id | | List snapshots only for this Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all snapshots in the default zone +``` +scw instance snapshot list +``` + +List all snapshots in fr-par-1 zone +``` +scw instance snapshot list zone=fr-par-1 +``` + + + + +### Get a volume or snapshot's migration plan + +Given a volume or snapshot, returns the migration plan for a call to the "Apply a migration plan" endpoint. This plan will include zero or one volume, and zero or more snapshots, which will need to be migrated together. This endpoint does not perform the actual migration itself, the "Apply a migration plan" endpoint must be used. The validation_key value returned by this endpoint must be provided to the call to the "Apply a migration plan" endpoint to confirm that all resources listed in the plan should be migrated. + +**Usage:** + +``` +scw instance snapshot plan-migration [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | | The snapshot for which the migration plan will be generated. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a snapshot + +Update the properties of a snapshot. + +**Usage:** + +``` +scw instance snapshot update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| name | | Name of the snapshot | +| tags.{index} | | Tags of the snapshot | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for snapshot to reach a stable state + +Wait for snapshot to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the snapshot. + +**Usage:** + +``` +scw instance snapshot wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | ID of the snapshot. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `1h0m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a snapshot to reach a stable state +``` +scw instance snapshot wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## SSH Utilities + +Command utilities around server SSH +- Manage keys per server +- Generate ssh config + + +### Add a public key to a server + +Key will be added to server's tags and added to root user on next restart. +Key is expected in openssh format "(format) (key) (comment)". +The comment will be used as key name or generated +Lookup /root/.ssh/authorized_keys on your server for more information + +**Usage:** + +``` +scw instance ssh add-key [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | | Server to add your key to | +| public-key | | Public key you want to add to your server | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Install a ssh config with all your servers as host +It generate hosts for instance servers, baremetal, apple-silicon and bastions + +Path of the config will be $HOME/.ssh/scaleway.config + +**Usage:** + +``` +scw instance ssh install-config [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### List manually added public keys + +List only keys added manually to a server using tags. +The key comment is used as key name or generated +Lookup /root/.ssh/authorized_keys on your server for more information + +**Usage:** + +``` +scw instance ssh list-keys [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server to add your key to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Remove a manually added public key from a server + +Key will be remove from server's tags and removed from root user on next restart. +Keys are identified by their comment as in openssh format. +Lookup /root/.ssh/authorized_keys on your server for more information + +**Usage:** + +``` +scw instance ssh remove-key [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | Server to add your key to | +| name | | Name of the key you want to remove, has to be the key comment or the index | +| public-key | | Public key you want to remove | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## User data management commands + +User data is a key/value store you can use to provide your instance with introspective data. + +As an example of use, Scaleway images contain the `scw-generate-ssh-keys` script, which generates the SSH server’s host keys, then stores their fingerprints as user data under the `ssh-host-fingerprints` key. +This way, before connecting to the instance using SSH, one can query the fingerprints to ensure that the remote host is the expected one, thus avoiding any man-in-the-middle attack. + +There are two ways of accessing user data: + - **From within a running Instance**, by requesting the Metadata API at http://169.254.42.42/user_data (or http://[fd00:42::42]/user_data using IPv6). + The `scaleway-ecosystem` package, installed by default on all OS images provided by Scaleway, ships with the `scw-userdata` helper command that allows you to easily query the user data from the instance. + For security reasons, viewing and editing user data is only allowed to queries originating from a port below 1024 (by default, only the super-user can bind to ports below 1024). + To specify the source port with cURL, use the `--local-port` option (e.g. `curl --local-port 1-1023 http://169.254.42.42/user_data`). + - **From the Instance API** by using the methods described below. + + +### Delete user data + +Delete the specified key from an Instance's user data. + +**Usage:** + +``` +scw instance user-data delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance | +| key | Required | Key of the user data to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get user data + +Get the content of a user data with the specified key on an Instance. + +**Usage:** + +``` +scw instance user-data get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance | +| key | Required | Key of the user data to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List user data + +List all user data keys registered on a specified Instance. + +**Usage:** + +``` +scw instance user-data list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Add/set user data + +Add or update a user data with the specified key on an Instance. + +**Usage:** + +``` +scw instance user-data set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| server-id | Required | UUID of the Instance | +| key | Required | Key of the user data to set | +| content | Required | Content of the user data | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Volume management commands + +A volume is where you store your data inside your Instance. It +appears as a block device on Linux that you can use to create +a filesystem and mount it. + +Two different types of volume (`volume_type`) are available: + - `l_ssd` is a local block storage: your data is downloaded on + the hypervisor and you need to power off your Instance to attach + or detach a volume. + - `b_ssd` is a remote block storage: your data is stored on a + centralized cluster. You can plug and unplug a volume while + your Instance is running. + +Minimum and maximum volume sizes for each volume types can be queried +from the zone `/products/volumes` API endpoint. _I.e_ for: + - `fr-par-1` use https://api.scaleway.com/instance/v1/zones/fr-par-1/products/volumes + - `nl-ams-1` use https://api.scaleway.com/instance/v1/zones/nl-ams-1/products/volumes + +Each type of volume is also subject to a global quota for the sum of all the +volumes. This quota depends of the level of support and may be +changed on demand. + +Be wary that when terminating an Instance, if you want to keep +your block storage volume, **you must** detach it before you +issue the `terminate` call. + +When using multiple block devices, it's advised to mount them by +using their UUID instead of their device name. A device name is +subject to change depending on the volumes order. Block devices +UUIDs can be found in `/dev/disk/by-id/`. + + +### Migrate a volume and/or snapshots to SBS (Scaleway Block Storage) + +To be used, the call to this endpoint must be preceded by a call to the "Plan a migration" endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. + +**Usage:** + +``` +scw instance volume apply-migration [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | The volume to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. | +| validation-key | Required | A value to be retrieved from a call to the "Plan a migration" endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Create a volume + +Create a volume of a specified type in an Availability Zone. + +**Usage:** + +``` +scw instance volume create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Volume name | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Volume tags | +| volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Volume type | +| size | | Volume disk size, must be a multiple of 512 | +| base-snapshot | | ID of the snapshot on which this volume will be based | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Create a volume called 'my-volume' +``` +scw instance volume create name=my-volume +``` + +Create a volume with a size of 50GB +``` +scw instance volume create size=50GB +``` + + + + +### Delete a volume + +Delete the volume with the specified ID. + +**Usage:** + +``` +scw instance volume delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Delete a volume with the specified ID +``` +scw instance volume delete af136619-bc59-4b48-a0ed-ed7dceaad9a6 +``` + + + + +### Get a volume + +Get details of a volume with the specified ID. + +**Usage:** + +``` +scw instance volume get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Get a volume with the specified ID +``` +scw instance volume get b70e9a0e-28b1-4542-bb9b-06d2d6debc0f +``` + + + + +### List volumes + +List volumes in the specified Availability Zone. You can filter the output by volume type. + +**Usage:** + +``` +scw instance volume list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Filter by volume type | +| project-id | | Filter volume by Project ID | +| tags | | Filter volumes with these exact tags (to filter with several tags, use commas to separate them) | +| name | | Filter volume by name (for eg. "vol" will return "myvolume" but not "data") | +| organization-id | | Filter volume by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all volumes +``` +scw instance volume list +``` + +List all block storage volumes +``` +scw instance volume list volume-type=b_ssd +``` + +List all local storage volumes +``` +scw instance volume list volume-type=l_ssd +``` + +List all volumes that match a name +``` +scw instance volume list name=foobar +``` + +List all block storage volumes that match a name +``` +scw instance volume list volume-type=b_ssd name=foobar +``` + + + + +### Get a volume or snapshot's migration plan + +Given a volume or snapshot, returns the migration plan for a call to the "Apply a migration plan" endpoint. This plan will include zero or one volume, and zero or more snapshots, which will need to be migrated together. This endpoint does not perform the actual migration itself, the "Apply a migration plan" endpoint must be used. The validation_key value returned by this endpoint must be provided to the call to the "Apply a migration plan" endpoint to confirm that all resources listed in the plan should be migrated. + +**Usage:** + +``` +scw instance volume plan-migration [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | The volume for which the migration plan will be generated. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a volume + +Replace the name and/or size properties of a volume specified by its ID, with the specified value(s). Any volume name can be changed, however only `b_ssd` volumes can currently be increased in size. + +**Usage:** + +``` +scw instance volume update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | UUID of the volume | +| name | | Volume name | +| tags.{index} | | Tags of the volume | +| size | | Volume disk size, must be a multiple of 512 | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Change the volume name +``` +scw instance volume update 11111111-1111-1111-1111-111111111111 name=my-new-name +``` + +Change the volume disk size (bytes) +``` +scw instance volume update 11111111-1111-1111-1111-111111111111 size=60GB +``` + +Change the volume name and disk size +``` +scw instance volume update 11111111-1111-1111-1111-111111111111 name=a-new-name size=70GB +``` + + + + +### Wait for volume to reach a stable state + +Wait for volume to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the volume. + +**Usage:** + +``` +scw instance volume wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| timeout | Default: `10m0s` | Timeout of the wait | +| volume-id | Required | ID of the volume affected by the action. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +Wait for a volume to reach a stable state +``` +scw instance volume wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Volume type management commands + +All volume types available in a specified zone. +Each of these types will contains all the capabilities and constraints of the volume (min size, max size, snapshot). + + +### List volume types + +List all volume types and their technical details. + +**Usage:** + +``` +scw instance volume-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + +**Examples:** + + +List all volume-types in the default zone +``` +scw instance volume-type list +``` + +List all volume-types in fr-par-1 zone +``` +scw instance volume-type list zone=fr-par-1 +``` + + + + diff --git a/docs/docs/iot.md b/docs/docs/iot.md new file mode 100644 index 0000000000..25d12b5873 --- /dev/null +++ b/docs/docs/iot.md @@ -0,0 +1,727 @@ + +# Documentation for `scw iot` +This API allows you to manage your IoT hubs and devices. + +- [IoT Device commands](#iot-device-commands) + - [Add a device](#add-a-device) + - [Remove a device](#remove-a-device) + - [Disable a device](#disable-a-device) + - [Enable a device](#enable-a-device) + - [Get a device](#get-a-device) + - [Get a device's certificate](#get-a-device's-certificate) + - [Get a device's metrics](#get-a-device's-metrics) + - [List devices](#list-devices) + - [Renew a device certificate](#renew-a-device-certificate) + - [Set a custom certificate on a device](#set-a-custom-certificate-on-a-device) + - [Update a device](#update-a-device) +- [IoT Hub commands](#iot-hub-commands) + - [Create a hub](#create-a-hub) + - [Delete a hub](#delete-a-hub) + - [Disable a hub](#disable-a-hub) + - [Enable a hub](#enable-a-hub) + - [Get a hub](#get-a-hub) + - [Get the certificate authority of a hub](#get-the-certificate-authority-of-a-hub) + - [List hubs](#list-hubs) + - [Set the certificate authority of a hub](#set-the-certificate-authority-of-a-hub) + - [Update a hub](#update-a-hub) +- [IoT Network commands](#iot-network-commands) + - [Create a new network](#create-a-new-network) + - [Delete a Network](#delete-a-network) + - [Retrieve a specific network](#retrieve-a-specific-network) + - [List the networks](#list-the-networks) +- [IoT Route commands](#iot-route-commands) + - [Create a route](#create-a-route) + - [Delete a route](#delete-a-route) + - [Get a route](#get-a-route) + - [List routes](#list-routes) + - [Update a route](#update-a-route) + + +## IoT Device commands + +IoT Device commands. + + +### Add a device + +Attach a device to a given Hub. + +**Usage:** + +``` +scw iot device create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Device name | +| hub-id | Required | Hub ID of the device | +| allow-insecure | | Defines whether to allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones | +| allow-multiple-connections | | Defines whether to allow multiple physical devices to connect with this device's credentials | +| message-filters.publish.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | +| message-filters.publish.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | +| message-filters.subscribe.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | +| message-filters.subscribe.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | +| description | | Device description | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Remove a device + +Remove a specific device from the specific Hub it is attached to. + +**Usage:** + +``` +scw iot device delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Disable a device + +Disable an existing device, specified by its device ID. + +**Usage:** + +``` +scw iot device disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Enable a device + +Enable a specific device, specified by its device ID. + +**Usage:** + +``` +scw iot device enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a device + +Retrieve information about an existing device, specified by its device ID. Its full details, including name, status and ID, are returned in the response object. + +**Usage:** + +``` +scw iot device get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a device's certificate + +Get information for a particular PEM-encoded certificate, specified by the device ID. The response returns full details of the device, including its type of certificate. + +**Usage:** + +``` +scw iot device get-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a device's metrics + +Get the metrics of an existing device, specified by its device ID. + +**Usage:** + +``` +scw iot device get-metrics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| start-date | Required | Start date used to compute the best scale for the returned metrics | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List devices + +List all devices in the specified region. By default, returned devices are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw iot device list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc`, `status_asc`, `status_desc`, `hub_id_asc`, `hub_id_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `allow_insecure_asc`, `allow_insecure_desc` | Ordering of requested devices | +| name | | Name to filter for, only devices with this name will be returned | +| hub-id | | Hub ID to filter for, only devices attached to this Hub will be returned | +| allow-insecure | | Defines wheter to filter the allow_insecure flag | +| status | One of: `unknown`, `error`, `enabled`, `disabled` | Device status (enabled, disabled, etc.) | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Renew a device certificate + +Renew the certificate of an existing device, specified by its device ID. + +**Usage:** + +``` +scw iot device renew-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Set a custom certificate on a device + +Switch the existing certificate of a given device with an EM-encoded custom certificate. + +**Usage:** + +``` +scw iot device set-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| certificate-pem | Required | PEM-encoded custom certificate | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update a device + +Update the parameters of an existing device, specified by its device ID. + +**Usage:** + +``` +scw iot device update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| device-id | Required | Device ID | +| description | | Description for the device | +| allow-insecure | | Defines whether to allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones | +| allow-multiple-connections | | Defines whether to allow multiple physical devices to connect with this device's credentials | +| message-filters.publish.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | +| message-filters.publish.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | +| message-filters.subscribe.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | +| message-filters.subscribe.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | +| hub-id | | Change Hub for this device, additional fees may apply, see IoT Hub pricing | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## IoT Hub commands + +IoT Hub commands. + + +### Create a hub + +Create a new Hub in the targeted region, specifying its configuration including name and product plan. + +**Usage:** + +``` +scw iot hub create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Hub name (up to 255 characters) | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| product-plan | Required
Default: `plan_shared`
One of: `plan_unknown`, `plan_shared`, `plan_dedicated`, `plan_ha` | Hub product plan | +| disable-events | | Disable Hub events | +| events-topic-prefix | | Topic prefix (default '$SCW/events') of Hub events | +| twins-graphite-config.push-uri | | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a hub + +Delete an existing IoT Hub, specified by its Hub ID. Deleting a Hub is permanent, and cannot be undone. + +**Usage:** + +``` +scw iot hub delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | Hub ID | +| delete-devices | | Defines whether to force the deletion of devices added to this Hub or reject the operation | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Disable a hub + +Disable an existing IoT Hub, specified by its Hub ID. + +**Usage:** + +``` +scw iot hub disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | Hub ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Enable a hub + +Enable an existing IoT Hub, specified by its Hub ID. + +**Usage:** + +``` +scw iot hub enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | Hub ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a hub + +Retrieve information about an existing IoT Hub, specified by its Hub ID. Its full details, including name, status and endpoint, are returned in the response object. + +**Usage:** + +``` +scw iot hub get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | Hub ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get the certificate authority of a hub + +Get information for a particular PEM-encoded certificate, specified by the Hub ID. + +**Usage:** + +``` +scw iot hub get-ca [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List hubs + +List all Hubs in the specified zone. By default, returned Hubs are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw iot hub list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc`, `status_asc`, `status_desc`, `product_plan_asc`, `product_plan_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Sort order of Hubs in the response | +| project-id | | Only list Hubs of this Project ID | +| name | | Hub name | +| organization-id | | Only list Hubs of this Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set the certificate authority of a hub + +Set a particular PEM-encoded certificate, specified by the Hub ID. + +**Usage:** + +``` +scw iot hub set-ca [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | Hub ID | +| ca-cert-pem | Required | CA's PEM-encoded certificate | +| challenge-cert-pem | Required | Proof of possession of PEM-encoded certificate | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update a hub + +Update the parameters of an existing IoT Hub, specified by its Hub ID. + +**Usage:** + +``` +scw iot hub update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hub-id | Required | ID of the Hub you want to update | +| name | | Hub name (up to 255 characters) | +| product-plan | One of: `plan_unknown`, `plan_shared`, `plan_dedicated`, `plan_ha` | Hub product plan | +| disable-events | | Disable Hub events | +| events-topic-prefix | | Topic prefix of Hub events | +| enable-device-auto-provisioning | | Enable device auto provisioning | +| twins-graphite-config.push-uri | | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## IoT Network commands + +IoT Network commands. + + +### Create a new network + +Create a new network for an existing hub. Beside the default network, you can add networks for different data providers. Possible network types are Sigfox and REST. + +**Usage:** + +``` +scw iot network create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Network name | +| type | Required
One of: `unknown`, `sigfox`, `rest` | Type of network to connect with | +| hub-id | Required | Hub ID to connect the Network to | +| topic-prefix | Required | Topic prefix for the Network | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Network + +Delete an existing network, specified by its network ID. Deleting a network is permanent, and cannot be undone. + +**Usage:** + +``` +scw iot network delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| network-id | Required | Network ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Retrieve a specific network + +Retrieve an existing network, specified by its network ID. The response returns full details of the network, including its type, the topic prefix and its endpoint. + +**Usage:** + +``` +scw iot network get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| network-id | Required | Network ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List the networks + +List the networks. + +**Usage:** + +``` +scw iot network list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc`, `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering of requested routes | +| name | | Network name to filter for | +| hub-id | | Hub ID to filter for | +| topic-prefix | | Topic prefix to filter for | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +## IoT Route commands + +IoT Route commands. + + +### Create a route + +Multiple kinds of routes can be created, such as: +- Database Route + Create a route that will record subscribed MQTT messages into your database. + You need to manage the database by yourself. +- REST Route. + Create a route that will call a REST API on received subscribed MQTT messages. +- S3 Routes. + Create a route that will put subscribed MQTT messages into an S3 bucket. + You need to create the bucket yourself and grant write access. + Granting can be done with s3cmd (`s3cmd setacl s3:// --acl-grant=write:555c69c3-87d0-4bf8-80f1-99a2f757d031:555c69c3-87d0-4bf8-80f1-99a2f757d031`). + +**Usage:** + +``` +scw iot route create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | Route name | +| hub-id | | Hub ID of the route | +| topic | | Topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters | +| s3-config.bucket-region | | | +| s3-config.bucket-name | | | +| s3-config.object-prefix | | | +| s3-config.strategy | One of: `unknown`, `per_topic`, `per_message` | | +| db-config.host | | | +| db-config.port | | | +| db-config.dbname | | | +| db-config.username | | | +| db-config.password | | | +| db-config.query | | | +| db-config.engine | One of: `unknown`, `postgresql`, `mysql` | | +| rest-config.verb | One of: `unknown`, `get`, `post`, `put`, `patch`, `delete` | | +| rest-config.uri | | | +| rest-config.headers.{key} | | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a route + +Delete an existing route, specified by its route ID. Deleting a route is permanent, and cannot be undone. + +**Usage:** + +``` +scw iot route delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a route + +Get information for a particular route, specified by the route ID. The response returns full details of the route, including its type, the topic it subscribes to and its configuration. + +**Usage:** + +``` +scw iot route get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List routes + +List all routes in the specified region. By default, returned routes are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw iot route list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc`, `hub_id_asc`, `hub_id_desc`, `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering of requested routes | +| hub-id | | Hub ID to filter for | +| name | | Route name to filter for | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a route + +Update the parameters of an existing route, specified by its route ID. + +**Usage:** + +``` +scw iot route update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route id | +| name | | Route name | +| topic | | Topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters | +| s3-config.bucket-region | | | +| s3-config.bucket-name | | | +| s3-config.object-prefix | | | +| s3-config.strategy | One of: `unknown`, `per_topic`, `per_message` | | +| db-config.host | | | +| db-config.port | | | +| db-config.dbname | | | +| db-config.username | | | +| db-config.password | | | +| db-config.query | | | +| db-config.engine | One of: `unknown`, `postgresql`, `mysql` | | +| rest-config.verb | One of: `unknown`, `get`, `post`, `put`, `patch`, `delete` | | +| rest-config.uri | | | +| rest-config.headers.{key} | | | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/ipam.md b/docs/docs/ipam.md new file mode 100644 index 0000000000..084700fa8b --- /dev/null +++ b/docs/docs/ipam.md @@ -0,0 +1,169 @@ + +# Documentation for `scw ipam` +This API allows you to manage your Scaleway IP addresses with our IP Address Management tool. + +- [IP management command](#ip-management-command) + - [Reserve a new IP](#reserve-a-new-ip) + - [Release an IP](#release-an-ip) + - [Get an IP](#get-an-ip) + - [List existing IPs](#list-existing-ips) + - [Update an IP](#update-an-ip) +- [Management command for sets of IPs](#management-command-for-sets-of-ips) + - [Release ipam resources](#release-ipam-resources) + + +## IP management command + +*ips_long. + + +### Reserve a new IP + +Reserve a new IP from the specified source. Currently IPs can only be reserved from a Private Network. + +**Usage:** + +``` +scw ipam ip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| source.zonal | | Zone the IP lives in if the IP is a public zoned IP. | +| source.private-network-id | | Private Network the IP lives in if the IP is a private IP. | +| source.subnet-id | | Private Network subnet the IP lives in if the IP is a private IP in a Private Network. | +| is-ipv6 | | Request an IPv6 instead of an IPv4 | +| address | | Request this specific IP address in the specified source pool | +| tags.{index} | | Tags for the IP | +| resource.mac-address | | MAC address of the custom resource | +| resource.name | | Name of the custom resource | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Release an IP + +Release an IP not currently attached to a resource, and returns it to the available IP pool. + +**Usage:** + +``` +scw ipam ip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get an IP + +Retrieve details of an existing IP, specified by its IP ID. + +**Usage:** + +``` +scw ipam ip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List existing IPs + +List existing IPs in the specified region using various filters. For example, you can filter for IPs within a specified Private Network, or for public IPs within a specified Project. By default, the IPs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw ipam ip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_desc`, `created_at_asc`, `updated_at_desc`, `updated_at_asc`, `attached_at_desc`, `attached_at_asc` | Sort order of the returned IPs | +| project-id | | Project ID to filter for. Only IPs belonging to this Project will be returned | +| zonal | | Zone to filter for. Only IPs that are zonal, and in this zone, will be returned | +| private-network-id | | Private Network to filter for. | +| subnet-id | | Subnet ID to filter for. | +| vpc-id | | VPC ID to filter for. | +| attached | | Defines whether to filter only for IPs which are attached to a resource | +| resource-id | | Resource ID to filter for. Only IPs attached to this resource will be returned | +| resource-type | One of: `unknown_type`, `custom`, `instance_server`, `instance_ip`, `instance_private_nic`, `lb_server`, `fip_ip`, `vpc_gateway`, `vpc_gateway_network`, `k8s_node`, `k8s_cluster`, `rdb_instance`, `redis_cluster`, `baremetal_server`, `baremetal_private_nic`, `llm_deployment` | Resource type to filter for. Only IPs attached to this type of resource will be returned | +| mac-address | | MAC address to filter for. Only IPs attached to a resource with this MAC address will be returned | +| tags.{index} | | Tags to filter for, only IPs with one or more matching tags will be returned | +| is-ipv6 | | Defines whether to filter only for IPv4s or IPv6s | +| resource-name | | Attached resource name to filter for, only IPs attached to a resource with this string within their name will be returned. | +| resource-types.{index} | One of: `unknown_type`, `custom`, `instance_server`, `instance_ip`, `instance_private_nic`, `lb_server`, `fip_ip`, `vpc_gateway`, `vpc_gateway_network`, `k8s_node`, `k8s_cluster`, `rdb_instance`, `redis_cluster`, `baremetal_server`, `baremetal_private_nic`, `llm_deployment` | Resource types to filter for. Only IPs attached to these types of resources will be returned | +| organization-id | | Organization ID to filter for. Only IPs belonging to this Organization will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an IP + +Update parameters including tags of the specified IP. + +**Usage:** + +``` +scw ipam ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP ID | +| tags.{index} | | Tags for the IP | +| reverses.{index}.hostname | | Reverse domain name | +| reverses.{index}.address | | IP corresponding to the hostname | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Management command for sets of IPs + +*ips_long. + + +### Release ipam resources + +Release ipam resources. + +**Usage:** + +``` +scw ipam ip-set release [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-ids.{index} | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/ipfs.md b/docs/docs/ipfs.md new file mode 100644 index 0000000000..9abe39d43a --- /dev/null +++ b/docs/docs/ipfs.md @@ -0,0 +1,284 @@ + +# Documentation for `scw ipfs` +IPFS Pinning service API. + +- [A pin is an abstract object that holds a Content Identifier (CID). It is defined that during the lifespan of a pin, the CID (and all sub-CIDs) must be hosted by the service](#a-pin-is-an-abstract-object-that-holds-a-content-identifier-(cid).-it-is-defined-that-during-the-lifespan-of-a-pin,-the-cid-(and-all-sub-cids)-must-be-hosted-by-the-service) + - [Create a pin by CID](#create-a-pin-by-cid) + - [Create a pin by URL](#create-a-pin-by-url) + - [Create an unpin request](#create-an-unpin-request) + - [Get pin information](#get-pin-information) + - [List all pins within a volume](#list-all-pins-within-a-volume) + - [Replace pin by CID](#replace-pin-by-cid) +- [A volume is bucket of pins. It is similar to an Object Storage bucket. Volumes are useful to gather pins with similar lifespans](#a-volume-is-bucket-of-pins.-it-is-similar-to-an-object-storage-bucket.-volumes-are-useful-to-gather-pins-with-similar-lifespans) + - [Create a new volume](#create-a-new-volume) + - [Delete an existing volume](#delete-an-existing-volume) + - [Get information about a volume](#get-information-about-a-volume) + - [List all volumes by a Project ID](#list-all-volumes-by-a-project-id) + - [Update volume information](#update-volume-information) + + +## A pin is an abstract object that holds a Content Identifier (CID). It is defined that during the lifespan of a pin, the CID (and all sub-CIDs) must be hosted by the service + +It is possible that many pins target the same CID, regardless of the user. + + +### Create a pin by CID + +Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. +The content (IPFS blocks) will be host by the pinning service until pin deletion. +From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. +Many pin requests (from different users) can target the same CID. +A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. + +**Usage:** + +``` +scw ipfs pin create-by-cid [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | Volume ID on which you want to pin your content | +| cid | Required | CID containing the content you want to pin | +| origins.{index} | | Node containing the content you want to pin | +| name | | Pin name | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create a pin by URL + +Will fetch and store the content pointed by the provided URL. The content must be available on the public IPFS network. +The content (IPFS blocks) will be host by the pinning service until pin deletion. +From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. +Many pin requests (from different users) can target the same CID. +A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. + +**Usage:** + +``` +scw ipfs pin create-by-url [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | Volume ID on which you want to pin your content | +| url | Required | URL containing the content you want to pin | +| name | | Pin name | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create an unpin request + +An unpin request means that you no longer own the content. +This content can therefore be removed and no longer provided on the IPFS network. + +**Usage:** + +``` +scw ipfs pin delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | Volume ID | +| pin-id | Required | Pin ID you want to remove from the volume | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get pin information + +Retrieve information about the provided **pin ID**, such as status, last modification, and CID. + +**Usage:** + +``` +scw ipfs pin get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | Volume ID | +| pin-id | Required | Pin ID of which you want to obtain information | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all pins within a volume + +Retrieve information about all pins within a volume. + +**Usage:** + +``` +scw ipfs pin list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | Volume ID of which you want to list the pins | +| project-id | | Project ID | +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned Volume | +| status | One of: `unknown_status`, `queued`, `pinning`, `failed`, `pinned` | List pins by status | +| organization-id | | Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Replace pin by CID + +Deletes the given resource ID and pins the new CID in its place. +Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. +The content (IPFS blocks) is hosted by the pinning service until the pin is deleted. +While the content is available any other IPFS peer can fetch and host your content. For this reason, we recommend that you pin either public or encrypted content. +Several different pin requests can target the same CID. +A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. + +**Usage:** + +``` +scw ipfs pin replace [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | | Volume ID | +| pin-id | Required | Pin ID whose information you wish to replace | +| cid | | New CID you want to pin in place of the old one | +| name | | New name to replace | +| origins.{index} | | Node containing the content you want to pin | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## A volume is bucket of pins. It is similar to an Object Storage bucket. Volumes are useful to gather pins with similar lifespans + +All pins must be attached to a volume. And all volumes must be attached to a Project ID. + + +### Create a new volume + +Create a new volume from a Project ID. Volume is identified by an ID and used to host pin references. +Volume is personal (at least to your organization) even if IPFS blocks and CID are available to anyone. +Should be the first command you made because every pin must be attached to a volume. + +**Usage:** + +``` +scw ipfs volume create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Required | Volume name | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing volume + +Delete a volume by its ID and every pin attached to this volume. This process can take a while to conclude, depending on the size of your pinned content. + +**Usage:** + +``` +scw ipfs volume delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | Volume ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get information about a volume + +Retrieve information about a specific volume. + +**Usage:** + +``` +scw ipfs volume get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| volume-id | Required | Volume ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all volumes by a Project ID + +Retrieve information about all volumes from a Project ID. + +**Usage:** + +``` +scw ipfs volume list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort the order of the returned volumes | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update volume information + +Update volume information (tag, name...). + +**Usage:** + +``` +scw ipfs volume update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Volume name | +| volume-id | Required | Volume ID | +| tags.{index} | | Tags of the volume | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/ipns.md b/docs/docs/ipns.md new file mode 100644 index 0000000000..6d22a59830 --- /dev/null +++ b/docs/docs/ipns.md @@ -0,0 +1,169 @@ + +# Documentation for `scw ipns` +IPFS Naming service API + +- [A name is a hash of the public key within the IPNS (InterPlanetary Name System)](#a-name-is-a-hash-of-the-public-key-within-the-ipns-(interplanetary-name-system)) + - [Create a new name](#create-a-new-name) + - [Delete an existing name](#delete-an-existing-name) + - [Export your private key](#export-your-private-key) + - [Get information about a name](#get-information-about-a-name) + - [Import your private key](#import-your-private-key) + - [List all names by a Project ID](#list-all-names-by-a-project-id) + - [Update name information](#update-name-information) + + +## A name is a hash of the public key within the IPNS (InterPlanetary Name System) + +This is the PKI namespace, where the private key is used to publish (sign) a record. + + +### Create a new name + +You can use the `ipns key` command to list and generate more names and their respective keys. + +**Usage:** + +``` +scw ipns name create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name for your records | +| value | | Value you want to associate with your records, CID or IPNS key | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an existing name + +Delete a name by its ID. + +**Usage:** + +``` +scw ipns name delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name-id | Required | Name ID you wish to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Export your private key + +Export a private key by its ID. + +**Usage:** + +``` +scw ipns name export-key [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name-id | Required | Name ID whose keys you want to export | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get information about a name + +Retrieve information about a specific name. + +**Usage:** + +``` +scw ipns name get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name-id | Required | Name ID whose information you want to retrieve | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Import your private key + +Import a private key. + +**Usage:** + +``` +scw ipns name import-key [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name for your records | +| private-key | Required | Base64 private key | +| value | | Value you want to associate with your records, CID or IPNS key | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all names by a Project ID + +Retrieve information about all names from a Project ID. + +**Usage:** + +``` +scw ipns name list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID | +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort the order of the returned names | +| organization-id | | Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update name information + +Update name information (CID, tag, name...). + +**Usage:** + +``` +scw ipns name update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name-id | Required | Name ID you wish to update | +| name | | New name you want to associate with your record | +| tags.{index} | | New tags you want to associate with your record | +| value | | Value you want to associate with your records, CID or IPNS key | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/jobs.md b/docs/docs/jobs.md new file mode 100644 index 0000000000..f189863b9a --- /dev/null +++ b/docs/docs/jobs.md @@ -0,0 +1,258 @@ + +# Documentation for `scw jobs` +This API allows you to manage your Serverless Jobs. + +- [](#) + - [Create a new job definition in a specified Project](#create-a-new-job-definition-in-a-specified-project) + - [Delete an exsisting job definition by its unique identifier](#delete-an-exsisting-job-definition-by-its-unique-identifier) + - [Get a job definition by its unique identifier](#get-a-job-definition-by-its-unique-identifier) + - [List all your job definitions with filters](#list-all-your-job-definitions-with-filters) + - [Run an existing job definition by its unique identifier. This will create a new job run](#run-an-existing-job-definition-by-its-unique-identifier.-this-will-create-a-new-job-run) + - [Update an existing job definition associated with the specified unique identifier](#update-an-existing-job-definition-associated-with-the-specified-unique-identifier) +- [](#) + - [Get a job run by its unique identifier](#get-a-job-run-by-its-unique-identifier) + - [List all job runs with filters](#list-all-job-runs-with-filters) + - [Stop a job run by its unique identifier](#stop-a-job-run-by-its-unique-identifier) + - [Wait for a job run to reach a stable state](#wait-for-a-job-run-to-reach-a-stable-state) + + +## + + + + +### Create a new job definition in a specified Project + +Create a new job definition in a specified Project. + +**Usage:** + +``` +scw jobs definition create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the job definition | +| cpu-limit | Required | CPU limit of the job | +| memory-limit | Required | Memory limit of the job (in MiB) | +| local-storage-capacity | | Local storage capacity of the job (in MiB) | +| image-uri | Required | Image to use for the job | +| command | | Startup command. If empty or not defined, the image's default command is used. | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| environment-variables.{key} | | Environment variables of the job | +| description | | Description of the job | +| job-timeout | | Timeout of the job in seconds | +| cron-schedule.schedule | | | +| cron-schedule.timezone | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete an exsisting job definition by its unique identifier + +Delete an exsisting job definition by its unique identifier. + +**Usage:** + +``` +scw jobs definition delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-definition-id | Required | UUID of the job definition to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a job definition by its unique identifier + +Get a job definition by its unique identifier. + +**Usage:** + +``` +scw jobs definition get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-definition-id | Required | UUID of the job definition to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all your job definitions with filters + +List all your job definitions with filters. + +**Usage:** + +``` +scw jobs definition list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | | +| project-id | | | +| organization-id | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Run an existing job definition by its unique identifier. This will create a new job run + +Run an existing job definition by its unique identifier. This will create a new job run. + +**Usage:** + +``` +scw jobs definition start [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-definition-id | Required | UUID of the job definition to start | +| command | | Contextual startup command for this specific job run | +| environment-variables.{key} | | Contextual environment variables for this specific job run | +| replicas | | Number of jobs to run | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update an existing job definition associated with the specified unique identifier + +Update an existing job definition associated with the specified unique identifier. + +**Usage:** + +``` +scw jobs definition update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-definition-id | Required | UUID of the job definition to update | +| name | | Name of the job definition | +| cpu-limit | | CPU limit of the job | +| memory-limit | | Memory limit of the job (in MiB) | +| local-storage-capacity | | Local storage capacity of the job (in MiB) | +| image-uri | | Image to use for the job | +| command | | Startup command | +| environment-variables.{key} | | Environment variables of the job | +| description | | Description of the job | +| job-timeout | | Timeout of the job in seconds | +| cron-schedule.schedule | | | +| cron-schedule.timezone | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## + + + + +### Get a job run by its unique identifier + +Get a job run by its unique identifier. + +**Usage:** + +``` +scw jobs run get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-run-id | Required | UUID of the job run to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List all job runs with filters + +List all job runs with filters. + +**Usage:** + +``` +scw jobs run list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | | +| job-definition-id | | | +| project-id | | | +| organization-id | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Stop a job run by its unique identifier + +Stop a job run by its unique identifier. + +**Usage:** + +``` +scw jobs run stop [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-run-id | Required | UUID of the job run to stop | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Wait for a job run to reach a stable state + +Wait for a job run to reach a stable state. This is similar to using --wait flag. + +**Usage:** + +``` +scw jobs run wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| job-run-id | Required | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/k8s.md b/docs/docs/k8s.md new file mode 100644 index 0000000000..2efe66c4ae --- /dev/null +++ b/docs/docs/k8s.md @@ -0,0 +1,1248 @@ + +# Documentation for `scw k8s` +This API allows you to manage Kubernetes Kapsule and Kosmos clusters. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) +- [Kapsule cluster management commands](#kapsule-cluster-management-commands) + - [Create a new Cluster](#create-a-new-cluster) + - [Delete a Cluster](#delete-a-cluster) + - [Get a Cluster](#get-a-cluster) + - [List Clusters](#list-clusters) + - [List available cluster types for a cluster](#list-available-cluster-types-for-a-cluster) + - [List available versions for a Cluster](#list-available-versions-for-a-cluster) + - [Migrate a cluster to Routed IPs](#migrate-a-cluster-to-routed-ips) + - [Migrate a cluster to SBS CSI](#migrate-a-cluster-to-sbs-csi) + - [Reset the admin token of a Cluster](#reset-the-admin-token-of-a-cluster) + - [Change the Cluster type](#change-the-cluster-type) + - [Update a Cluster](#update-a-cluster) + - [Upgrade a Cluster](#upgrade-a-cluster) + - [Wait for a cluster to reach a stable state](#wait-for-a-cluster-to-reach-a-stable-state) +- [Cluster type management commands](#cluster-type-management-commands) + - [List cluster types](#list-cluster-types) +- [Manage your Kubernetes Kapsule cluster's kubeconfig files](#manage-your-kubernetes-kapsule-cluster's-kubeconfig-files) + - [Retrieve a kubeconfig](#retrieve-a-kubeconfig) + - [Install a kubeconfig](#install-a-kubeconfig) + - [Uninstall a kubeconfig](#uninstall-a-kubeconfig) +- [Kapsule node management commands](#kapsule-node-management-commands) + - [Delete a Node in a Cluster](#delete-a-node-in-a-cluster) + - [Get a Node in a Cluster](#get-a-node-in-a-cluster) + - [List Nodes in a Cluster](#list-nodes-in-a-cluster) + - [Reboot a Node in a Cluster](#reboot-a-node-in-a-cluster) + - [Replace a Node in a Cluster](#replace-a-node-in-a-cluster) + - [Wait for a node to reach a stable state](#wait-for-a-node-to-reach-a-stable-state) +- [Kapsule pool management commands](#kapsule-pool-management-commands) + - [Create a new Pool in a Cluster](#create-a-new-pool-in-a-cluster) + - [Delete a Pool in a Cluster](#delete-a-pool-in-a-cluster) + - [Get a Pool in a Cluster](#get-a-pool-in-a-cluster) + - [List Pools in a Cluster](#list-pools-in-a-cluster) + - [Update a Pool in a Cluster](#update-a-pool-in-a-cluster) + - [Upgrade a Pool in a Cluster](#upgrade-a-pool-in-a-cluster) + - [Wait for a pool to reach a stable state](#wait-for-a-pool-to-reach-a-stable-state) +- [Available Kubernetes versions commands](#available-kubernetes-versions-commands) + - [Get a Version](#get-a-version) + - [List all available Versions](#list-all-available-versions) + + +## Access Control List (ACL) management commands + +Network Access Control Lists (ACLs) allow you to manage inbound network traffic by setting up ACL rules. + +Network Access Control Lists (ACLs) allow you to manage inbound network traffic by setting up ACL rules. + +**Usage:** + +``` +scw k8s acl +``` + + + +## Kapsule cluster management commands + +A cluster is a fully managed Kubernetes cluster +It is composed of different pools, each pool containing the same kind of nodes. + + +### Create a new Cluster + +Create a new Kubernetes cluster in a Scaleway region. + +**Usage:** + +``` +scw k8s cluster create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| type | | Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16) | +| name | Required
Default: `` | Cluster name | +| description | | Cluster description | +| tags.{index} | | Tags associated with the cluster | +| version | Required
Default: `latest` | Kubernetes version of the cluster | +| cni | Required
Default: `cilium`
One of: `unknown_cni`, `cilium`, `calico`, `weave`, `flannel`, `kilo`, `none` | Container Network Interface (CNI) plugin running in the cluster | +| pools.{index}.name | | Name of the pool | +| pools.{index}.node-type | | Node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster | +| pools.{index}.placement-group-id | | Placement group ID in which all the nodes of the pool will be created | +| pools.{index}.autoscaling | | Defines whether the autoscaling feature is enabled for the pool | +| pools.{index}.size | | Size (number of nodes) of the pool | +| pools.{index}.min-size | | Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | +| pools.{index}.max-size | | Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | +| pools.{index}.container-runtime | One of: `unknown_runtime`, `docker`, `containerd`, `crio` | Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24 | +| pools.{index}.autohealing | | Defines whether the autohealing feature is enabled for the pool | +| pools.{index}.tags.{index} | | Tags associated with the pool | +| pools.{index}.kubelet-args.{key} | | Kubelet arguments to be used by this pool. Note that this feature is experimental | +| pools.{index}.upgrade-policy.max-unavailable | | The maximum number of nodes that can be not ready at the same time | +| pools.{index}.upgrade-policy.max-surge | | The maximum number of nodes to be created during the upgrade | +| pools.{index}.zone | | Zone in which the pool's nodes will be spawned | +| pools.{index}.root-volume-type | One of: `default_volume_type`, `l_ssd`, `b_ssd` | Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster | +| pools.{index}.root-volume-size | | System volume disk size | +| pools.{index}.public-ip-disabled | | Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway | +| autoscaler-config.scale-down-disabled | | Disable the cluster autoscaler | +| autoscaler-config.scale-down-delay-after-add | | How long after scale up that scale down evaluation resumes | +| autoscaler-config.estimator | One of: `unknown_estimator`, `binpacking` | Type of resource estimator to be used in scale up | +| autoscaler-config.expander | One of: `unknown_expander`, `random`, `most_pods`, `least_waste`, `priority`, `price` | Type of node group expander to be used in scale up | +| autoscaler-config.ignore-daemonsets-utilization | | Ignore DaemonSet pods when calculating resource utilization for scaling down | +| autoscaler-config.balance-similar-node-groups | | Detect similar node groups and balance the number of nodes between them | +| autoscaler-config.expendable-pods-priority-cutoff | | Pods with priority below cutoff will be expendable. They can be killed without any consideration during scale down and they won't cause scale up. Pods with null priority (PodPriority disabled) are non expendable | +| autoscaler-config.scale-down-unneeded-time | | How long a node should be unneeded before it is eligible to be scaled down | +| autoscaler-config.scale-down-utilization-threshold | | Node utilization level, defined as a sum of requested resources divided by capacity, below which a node can be considered for scale down | +| autoscaler-config.max-graceful-termination-sec | | Maximum number of seconds the cluster autoscaler waits for pod termination when trying to scale down a node | +| auto-upgrade.enable | | Defines whether auto upgrade is enabled for the cluster | +| auto-upgrade.maintenance-window.start-hour | | Start time of the two-hour maintenance window | +| auto-upgrade.maintenance-window.day | One of: `any`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | Day of the week for the maintenance window | +| feature-gates.{index} | | List of feature gates to enable | +| admission-plugins.{index} | | List of admission plugins to enable | +| open-id-connect-config.issuer-url | | URL of the provider which allows the API server to discover public signing keys. Only URLs using the `https://` scheme are accepted. This is typically the provider's discovery URL without a path, for example "https://accounts.google.com" or "https://login.salesforce.com" | +| open-id-connect-config.client-id | | A client ID that all tokens must be issued for | +| open-id-connect-config.username-claim | | JWT claim to use as the user name. The default is `sub`, which is expected to be the end user's unique identifier. Admins can choose other claims, such as `email` or `name`, depending on their provider. However, claims other than `email` will be prefixed with the issuer URL to prevent name collision | +| open-id-connect-config.username-prefix | | Prefix prepended to username claims to prevent name collision (such as `system:` users). For example, the value `oidc:` will create usernames like `oidc:jane.doe`. If this flag is not provided and `username_claim` is a value other than `email`, the prefix defaults to `( Issuer URL )#` where `( Issuer URL )` is the value of `issuer_url`. The value `-` can be used to disable all prefixing | +| open-id-connect-config.groups-claim.{index} | | JWT claim to use as the user's group | +| open-id-connect-config.groups-prefix | | Prefix prepended to group claims to prevent name collision (such as `system:` groups). For example, the value `oidc:` will create group names like `oidc:engineering` and `oidc:infra` | +| open-id-connect-config.required-claim.{index} | | Multiple key=value pairs describing a required claim in the ID token. If set, the claims are verified to be present in the ID token with a matching value | +| apiserver-cert-sans.{index} | | Additional Subject Alternative Names for the Kubernetes API server certificate | +| private-network-id | | Private network ID for internal cluster communication (cannot be changed later). For Kapsule clusters, if none is provided, a private network will be created | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Create a Kubernetes cluster named foo with cilium as CNI, in version 1.27.0 and with a pool named default composed of 3 DEV1-M +``` +scw k8s cluster create name=foo version=1.27.0 pools.0.size=3 pools.0.node-type=DEV1-M pools.0.name=default +``` + +Create a Kubernetes cluster named bar, tagged, calico as CNI, in version 1.27.0 and with a tagged pool named default composed of 2 RENDER-S and autohealing and autoscaling enabled (between 1 and 10 nodes) +``` +scw k8s cluster create name=bar version=1.27.0 tags.0=tag1 tags.1=tag2 cni=calico pools.0.size=2 pools.0.node-type=RENDER-S pools.0.min-size=1 pools.0.max-size=10 pools.0.autohealing=true pools.0.autoscaling=true pools.0.tags.0=pooltag1 pools.0.tags.1=pooltag2 pools.0.name=default +``` + + + + +### Delete a Cluster + +Delete a specific Kubernetes cluster and all its associated pools and nodes. Note that this method will not delete any Load Balancer or Block Volume that are associated with the cluster. + +**Usage:** + +``` +scw k8s cluster delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster to delete | +| with-additional-resources | | Defines whether all volumes (including retain volume type), empty Private Networks and Load Balancers with a name starting with the cluster ID will also be deleted | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a cluster +``` +scw k8s cluster delete 11111111-1111-1111-111111111111 +``` + +Delete a cluster with its Block volumes and Load Balancers +``` +scw k8s cluster delete 11111111-1111-1111-111111111111 with-additional-resources=true +``` + + + + +### Get a Cluster + +Retrieve information about a specific Kubernetes cluster. + +**Usage:** + +``` +scw k8s cluster get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the requested cluster | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get a cluster information +``` +scw k8s cluster get 11111111-1111-1111-111111111111 +``` + + + + +### List Clusters + +List all existing Kubernetes clusters in a specific region. + +**Usage:** + +``` +scw k8s cluster list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID on which to filter the returned clusters | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc`, `version_asc`, `version_desc` | Sort order of returned clusters | +| name | | Name to filter on, only clusters containing this substring in their name will be returned | +| status | One of: `unknown`, `creating`, `ready`, `deleting`, `deleted`, `updating`, `locked`, `pool_required` | Status to filter on, only clusters with this status will be returned | +| type | | Type to filter on, only clusters with this type will be returned | +| private-network-id | | Private Network ID to filter on, only clusters within this Private Network will be returned | +| organization-id | | Organization ID on which to filter the returned clusters | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all clusters on your default region +``` +scw k8s cluster list +``` + +List the ready clusters on your default region +``` +scw k8s cluster list status=ready +``` + +List the clusters that match the given name on fr-par ('cluster1' will return 'cluster100' and 'cluster1' but not 'foo') +``` +scw k8s cluster list region=fr-par name=cluster1 +``` + + + + +### List available cluster types for a cluster + +List the cluster types that a specific Kubernetes cluster is allowed to switch to. + +**Usage:** + +``` +scw k8s cluster list-available-types [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID for which the available Kubernetes types will be listed | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all cluster types that a cluster can upgrade to +``` +scw k8s cluster list-available-types 11111111-1111-1111-111111111111 +``` + + + + +### List available versions for a Cluster + +List the versions that a specific Kubernetes cluster is allowed to upgrade to. Results will include every patch version greater than the current patch, as well as one minor version ahead of the current version. Any upgrade skipping a minor version will not work. + +**Usage:** + +``` +scw k8s cluster list-available-versions [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID for which the available Kubernetes versions will be listed | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all versions that a cluster can upgrade to +``` +scw k8s cluster list-available-versions 11111111-1111-1111-111111111111 +``` + + + + +### Migrate a cluster to Routed IPs + +Migrate the nodes of an existing cluster to Routed IPs and enable Routed IPs for all future nodes. + +**Usage:** + +``` +scw k8s cluster migrate-to-routed-ips [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID for which the routed ip will be enabled for the nodes | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Migrate a cluster to Routed IPs +``` +scw k8s cluster migrate-to-routed-ips 11111111-1111-1111-111111111111 +``` + + + + +### Migrate a cluster to SBS CSI + +Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. + +**Usage:** + +``` +scw k8s cluster migrate-to-sbs-csi [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID for which the latest CSI compatible with Scaleway Block Storage will be enabled | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Migrate a cluster to SBS CSI +``` +scw k8s cluster migrate-to-sbs-csi 11111111-1111-1111-111111111111 +``` + + + + +### Reset the admin token of a Cluster + +Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download kubeconfig again to keep interacting with the cluster. + +**Usage:** + +``` +scw k8s cluster reset-admin-token [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID on which the admin token will be renewed | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Reset the admin token for a cluster +``` +scw k8s cluster reset-admin-token 11111111-1111-1111-111111111111 +``` + + + + +### Change the Cluster type + +Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#path-clusters-list-available-cluster-types-for-a-cluster). + +**Usage:** + +``` +scw k8s cluster set-type [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster to migrate from one type to another | +| type | Required | Type of the cluster. Note that some migrations are not possible (please refer to product documentation) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Convert a kapsule cluster to a kapsule-dedicated-16 cluster +``` +scw k8s cluster set-type 11111111-1111-1111-111111111111 type=kapsule-dedicated-16 +``` + + + + +### Update a Cluster + +Update information on a specific Kubernetes cluster. You can update details such as its name, description, tags and configuration. To upgrade a cluster, you will need to use the dedicated endpoint. + +**Usage:** + +``` +scw k8s cluster update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster to update | +| name | | New external name for the cluster | +| description | | New description for the cluster | +| tags.{index} | | New tags associated with the cluster | +| autoscaler-config.scale-down-disabled | | Disable the cluster autoscaler | +| autoscaler-config.scale-down-delay-after-add | | How long after scale up that scale down evaluation resumes | +| autoscaler-config.estimator | One of: `unknown_estimator`, `binpacking` | Type of resource estimator to be used in scale up | +| autoscaler-config.expander | One of: `unknown_expander`, `random`, `most_pods`, `least_waste`, `priority`, `price` | Type of node group expander to be used in scale up | +| autoscaler-config.ignore-daemonsets-utilization | | Ignore DaemonSet pods when calculating resource utilization for scaling down | +| autoscaler-config.balance-similar-node-groups | | Detect similar node groups and balance the number of nodes between them | +| autoscaler-config.expendable-pods-priority-cutoff | | Pods with priority below cutoff will be expendable. They can be killed without any consideration during scale down and they won't cause scale up. Pods with null priority (PodPriority disabled) are non expendable | +| autoscaler-config.scale-down-unneeded-time | | How long a node should be unneeded before it is eligible to be scaled down | +| autoscaler-config.scale-down-utilization-threshold | | Node utilization level, defined as a sum of requested resources divided by capacity, below which a node can be considered for scale down | +| autoscaler-config.max-graceful-termination-sec | | Maximum number of seconds the cluster autoscaler waits for pod termination when trying to scale down a node | +| auto-upgrade.enable | | Defines whether auto upgrade is enabled for the cluster | +| auto-upgrade.maintenance-window.start-hour | | Start time of the two-hour maintenance window | +| auto-upgrade.maintenance-window.day | One of: `any`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | Day of the week for the maintenance window | +| feature-gates.{index} | | List of feature gates to enable | +| admission-plugins.{index} | | List of admission plugins to enable | +| open-id-connect-config.issuer-url | | URL of the provider which allows the API server to discover public signing keys. Only URLs using the `https://` scheme are accepted. This is typically the provider's discovery URL without a path, for example "https://accounts.google.com" or "https://login.salesforce.com" | +| open-id-connect-config.client-id | | A client ID that all tokens must be issued for | +| open-id-connect-config.username-claim | | JWT claim to use as the user name. The default is `sub`, which is expected to be the end user's unique identifier. Admins can choose other claims, such as `email` or `name`, depending on their provider. However, claims other than `email` will be prefixed with the issuer URL to prevent name collision | +| open-id-connect-config.username-prefix | | Prefix prepended to username claims to prevent name collision (such as `system:` users). For example, the value `oidc:` will create usernames like `oidc:jane.doe`. If this flag is not provided and `username_claim` is a value other than `email`, the prefix defaults to `( Issuer URL )#` where `( Issuer URL )` is the value of `issuer_url`. The value `-` can be used to disable all prefixing | +| open-id-connect-config.groups-claim.{index} | | JWT claim to use as the user's group | +| open-id-connect-config.groups-prefix | | Prefix prepended to group claims to prevent name collision (such as `system:` groups). For example, the value `oidc:` will create group names like `oidc:engineering` and `oidc:infra` | +| open-id-connect-config.required-claim.{index} | | Multiple key=value pairs describing a required claim in the ID token. If set, the claims are verified to be present in the ID token with a matching value | +| apiserver-cert-sans.{index} | | Additional Subject Alternative Names for the Kubernetes API server certificate | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Add TTLAfterFinished and ServiceNodeExclusion as feature gates on a cluster +``` +scw k8s cluster update 11111111-1111-1111-111111111111 feature-gates.0=TTLAfterFinished feature-gates.1=ServiceNodeExclusion +``` + + + + +### Upgrade a Cluster + +Upgrade a specific Kubernetes cluster and possibly its associated pools to a specific and supported Kubernetes version. + +**Usage:** + +``` +scw k8s cluster upgrade [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster to upgrade | +| version | Required | New Kubernetes version of the cluster. Note that the version should either be a higher patch version of the same minor version or the direct minor version after the current one | +| upgrade-pools | | Defines whether pools will also be upgraded once the control plane is upgraded | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Upgrade a cluster version 1.27.0 of Kubernetes (pools *are not* included) +``` +scw k8s cluster upgrade 11111111-1111-1111-111111111111 version=1.27.0 +``` + +Upgrade a cluster to version 1.27.0 of Kubernetes (pools *are* included) +``` +scw k8s cluster upgrade 11111111-1111-1111-111111111111 version=1.27.0 upgrade-pools=true +``` + + + + +### Wait for a cluster to reach a stable state + +Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. + +**Usage:** + +``` +scw k8s cluster wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster. | +| wait-for-pools | | Wait for pools to be ready. | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | +| timeout | Default: `10m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a cluster to reach a stable state +``` +scw k8s cluster wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Cluster type management commands + +All cluster types available in a specified region +A cluster type represents the different commercial types of clusters offered by Scaleway. + + +### List cluster types + +List available cluster types and their technical details. + +**Usage:** + +``` +scw k8s cluster-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Manage your Kubernetes Kapsule cluster's kubeconfig files + + + + +### Retrieve a kubeconfig + +Retrieve the kubeconfig for a specified cluster. + +**Usage:** + +``` +scw k8s kubeconfig get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID from which to retrieve the kubeconfig | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get the kubeconfig for a given cluster +``` +scw k8s kubeconfig get 11111111-1111-1111-1111-111111111111 +``` + + + + +### Install a kubeconfig + +Retrieve the kubeconfig for a specified cluster and write it on disk. +It will merge the new kubeconfig in the file pointed by the KUBECONFIG variable. If empty it will default to $HOME/.kube/config. + +**Usage:** + +``` +scw k8s kubeconfig install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID from which to retrieve the kubeconfig | +| keep-current-context | | Whether or not to keep the current kubeconfig context unmodified | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Install the kubeconfig for a given cluster and using the new context +``` +scw k8s kubeconfig install 11111111-1111-1111-1111-111111111111 +``` + + + + +### Uninstall a kubeconfig + +Remove specified cluster from kubeconfig file specified by the KUBECONFIG env, if empty it will default to $HOME/.kube/config. +If the current context points to this cluster, it will be set to an empty context. + +**Usage:** + +``` +scw k8s kubeconfig uninstall [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID from which to uninstall the kubeconfig | + + +**Examples:** + + +Uninstall the kubeconfig for a given cluster +``` +scw k8s kubeconfig uninstall 11111111-1111-1111-1111-111111111111 +``` + + + + +## Kapsule node management commands + +A node (short for worker node) is an abstraction for a Scaleway Instance +A node is always part of a pool. Each of them has the Kubernetes software automatically installed and configured by Scaleway. + + +### Delete a Node in a Cluster + +Delete a specific Node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + +**Usage:** + +``` +scw k8s node delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| node-id | Required | ID of the node to replace | +| skip-drain | | Skip draining node from its workload (Note: this parameter is currently inactive) | +| replace | | Add a new node after the deletion of this node | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a node +``` +scw k8s node delete 11111111-1111-1111-111111111111 +``` + +Delete a node without evicting workloads +``` +scw k8s node delete 11111111-1111-1111-111111111111 skip-drain=true +``` + +Replace a node by a new one +``` +scw k8s node delete 11111111-1111-1111-111111111111 replace=true +``` + + + + +### Get a Node in a Cluster + +Retrieve details about a specific Kubernetes Node. + +**Usage:** + +``` +scw k8s node get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| node-id | Required | ID of the requested node | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get a node +``` +scw k8s node get 11111111-1111-1111-111111111111 +``` + + + + +### List Nodes in a Cluster + +List all the existing nodes for a specific Kubernetes cluster. + +**Usage:** + +``` +scw k8s node list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID from which the nodes will be listed from | +| pool-id | | Pool ID on which to filter the returned nodes | +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned nodes | +| name | | Name to filter on, only nodes containing this substring in their name will be returned | +| status | One of: `unknown`, `creating`, `not_ready`, `ready`, `deleting`, `deleted`, `locked`, `rebooting`, `creation_error`, `upgrading`, `starting`, `registering` | Status to filter on, only nodes with this status will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all the nodes in the cluster +``` +scw k8s node list cluster-id=11111111-1111-1111-111111111111 +``` + +List all the nodes in the cluster's 2222222222222-2222-222222222222 pool +``` +scw k8s node list cluster-id=11111111-1111-1111-111111111111 pool-id=2222222222222-2222-222222222222 +``` + +List all cluster nodes that are ready +``` +scw k8s node list cluster-id=11111111-1111-1111-111111111111 status=ready +``` + + + + +### Reboot a Node in a Cluster + +Reboot a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + +**Usage:** + +``` +scw k8s node reboot [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| node-id | Required | ID of the node to reboot | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Reboot a node +``` +scw k8s node reboot 11111111-1111-1111-111111111111 +``` + + + + +### Replace a Node in a Cluster + +Replace a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + +**Usage:** + +``` +scw k8s node replace [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| node-id | Required | ID of the node to replace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Replace a node +``` +scw k8s node replace 11111111-1111-1111-111111111111 +``` + + + + +### Wait for a node to reach a stable state + +Wait for a node to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the node. + +**Usage:** + +``` +scw k8s node wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| node-id | Required | ID of the node. | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | +| timeout | Default: `10m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a node to reach a stable state +``` +scw k8s node wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Kapsule pool management commands + +A pool is a set of identical nodes +A pool has a name, a size (its desired number of nodes), node number limits (min, max), and a Scaleway Instance type. Changing those limits increases/decreases the size of a pool. As a result and depending on its load, the pool will grow or shrink within those limits when autoscaling is enabled. A "default pool" is automatically created with every cluster via the console. + + +### Create a new Pool in a Cluster + +Create a new pool in a specific Kubernetes cluster. + +**Usage:** + +``` +scw k8s pool create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | Cluster ID to which the pool will be attached | +| name | Required
Default: `` | Pool name | +| node-type | Required
Default: `DEV1-M` | Node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster | +| placement-group-id | | Placement group ID in which all the nodes of the pool will be created | +| autoscaling | | Defines whether the autoscaling feature is enabled for the pool | +| size | Required
Default: `1` | Size (number of nodes) of the pool | +| min-size | | Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | +| max-size | | Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | +| container-runtime | One of: `unknown_runtime`, `docker`, `containerd`, `crio` | Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24 | +| autohealing | | Defines whether the autohealing feature is enabled for the pool | +| tags.{index} | | Tags associated with the pool | +| kubelet-args.{key} | | Kubelet arguments to be used by this pool. Note that this feature is experimental | +| upgrade-policy.max-unavailable | | | +| upgrade-policy.max-surge | | | +| zone | | Zone in which the pool's nodes will be spawned | +| root-volume-type | One of: `default_volume_type`, `l_ssd`, `b_ssd` | Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster | +| root-volume-size | | System volume disk size | +| public-ip-disabled | | Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Create a pool named 'bar' with 2 DEV1-XL on a cluster +``` +scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=bar node-type=DEV1-XL size=2 +``` + +Create a pool named 'fish' with 5 GP1-L, autoscaling within 0 and 10 nodes and autohealing enabled, and containerd as the cluster container runtime +``` +scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=fish node-type=GP1-L size=5 min-size=0 max-size=10 autoscaling=true autohealing=true container-runtime=containerd +``` + +Create a tagged pool named 'turtle' with 1 GP1-S which is using the already created placement group 2222222222222-2222-222222222222 for all the nodes in the pool on a cluster +``` +scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=turtle node-type=GP1-S size=1 placement-group-id=2222222222222-2222-222222222222 tags.0=turtle tags.1=placement-group +``` + + + + +### Delete a Pool in a Cluster + +Delete a specific pool from a cluster. Note that all the pool's nodes will also be deleted. + +**Usage:** + +``` +scw k8s pool delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pool-id | Required | ID of the pool to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a specific pool +``` +scw k8s pool delete 11111111-1111-1111-111111111111 +``` + + + + +### Get a Pool in a Cluster + +Retrieve details about a specific pool in a Kubernetes cluster. + +**Usage:** + +``` +scw k8s pool get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pool-id | Required | ID of the requested pool | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get a given pool +``` +scw k8s pool get 11111111-1111-1111-111111111111 +``` + + + + +### List Pools in a Cluster + +List all the existing pools for a specific Kubernetes cluster. + +**Usage:** + +``` +scw k8s pool list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster whose pools will be listed | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc`, `version_asc`, `version_desc` | Sort order of returned pools | +| name | | Name to filter on, only pools containing this substring in their name will be returned | +| status | One of: `unknown`, `ready`, `deleting`, `deleted`, `scaling`, `warning`, `locked`, `upgrading` | Status to filter on, only pools with this status will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all pools for a cluster +``` +scw k8s pool list cluster-id=11111111-1111-1111-111111111111 +``` + +List all scaling pools for a cluster +``` +scw k8s pool list cluster-id=11111111-1111-1111-111111111111 status=scaling +``` + +List all pools for clusters containing 'foo' in their name +``` +scw k8s pool list cluster-id=11111111-1111-1111-111111111111 name=foo +``` + +List all pools for a cluster and order them by ascending creation date +``` +scw k8s pool list cluster-id=11111111-1111-1111-111111111111 order-by=created_at_asc +``` + + + + +### Update a Pool in a Cluster + +Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. + +**Usage:** + +``` +scw k8s pool update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pool-id | Required | ID of the pool to update | +| autoscaling | | New value for the pool autoscaling enablement | +| size | | New desired pool size | +| min-size | | New minimum size for the pool | +| max-size | | New maximum size for the pool | +| autohealing | | New value for the pool autohealing enablement | +| tags.{index} | | New tags associated with the pool | +| kubelet-args.{key} | | New Kubelet arguments to be used by this pool. Note that this feature is experimental | +| upgrade-policy.max-unavailable | | | +| upgrade-policy.max-surge | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Enable autoscaling on a given pool +``` +scw k8s pool update 11111111-1111-1111-111111111111 autoscaling=true +``` + +Reduce the size and maximum size of a given pool to 4 +``` +scw k8s pool update 11111111-1111-1111-111111111111 size=4 max-size=4 +``` + +Modify the tags of a given pool +``` +scw k8s pool update 11111111-1111-1111-111111111111 tags.0=my tags.1=new tags.2=pool +``` + + + + +### Upgrade a Pool in a Cluster + +Upgrade the Kubernetes version of a specific pool. Note that it only works if the targeted version matches the cluster's version. + +**Usage:** + +``` +scw k8s pool upgrade [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pool-id | Required | ID of the pool to upgrade | +| version | Required | New Kubernetes version for the pool | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Upgrade a specific pool to the Kubernetes version 1.27.0 +``` +scw k8s pool upgrade 11111111-1111-1111-111111111111 version=1.27.0 +``` + + + + +### Wait for a pool to reach a stable state + +Wait for a pool to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the node. + +**Usage:** + +``` +scw k8s pool wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pool-id | Required | ID of the pool. | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | +| timeout | Default: `10m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a pool to reach a stable state +``` +scw k8s pool wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Available Kubernetes versions commands + +A version is a vanilla Kubernetes version like `x.y.z` +It comprises a major version `x`, a minor version `y`, and a patch version `z`. At the minimum, Kapsule (Scaleway's managed Kubernetes), will support the last patch version for the past three minor releases. Also, each version has a different set of CNIs, eventually container runtimes, feature gates, and admission plugins available. See our [Version Support Policy](https://www.scaleway.com/en/docs/containers/kubernetes/reference-content/version-support-policy/). + + +### Get a Version + +Retrieve a specific Kubernetes version and its details. + +**Usage:** + +``` +scw k8s version get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| version-name | Required | Requested version name | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get the Kubernetes version 1.27.0 +``` +scw k8s version get 1.27.0 +``` + + + + +### List all available Versions + +List all available versions for the creation of a new Kubernetes cluster. + +**Usage:** + +``` +scw k8s version list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all available Kubernetes version in Kapsule +``` +scw k8s version list +``` + + + + diff --git a/docs/docs/keymanager.md b/docs/docs/keymanager.md new file mode 100644 index 0000000000..e2ac7a6623 --- /dev/null +++ b/docs/docs/keymanager.md @@ -0,0 +1,309 @@ + +# Documentation for `scw keymanager` +This API allows you to conveniently store and use cryptographic keys. + +- [Key management commands](#key-management-commands) + - [Create a key](#create-a-key) + - [Decrypt data](#decrypt-data) + - [Delete a key](#delete-a-key) + - [Disable key](#disable-key) + - [Enable key](#enable-key) + - [Encrypt data](#encrypt-data) + - [Generate a data encryption key](#generate-a-data-encryption-key) + - [Get key metadata](#get-key-metadata) + - [List keys](#list-keys) + - [Apply key protection](#apply-key-protection) + - [Rotate a key](#rotate-a-key) + - [Remove key protection](#remove-key-protection) + - [Update a key](#update-a-key) + + +## Key management commands + +Keys are logical containers which store cryptographic keys. + + +### Create a key + +Create a key in a given region specified by the `region` parameter. Keys only support symmetric encryption. You can use keys to encrypt or decrypt arbitrary payloads, or to generate data encryption keys that can be used without being stored in Key Manager. + +**Usage:** + +``` +scw keymanager key create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | (Optional) Name of the key | +| usage.symmetric-encryption | One of: `unknown_symmetric_encryption`, `aes_256_gcm` | | +| description | | (Optional) Description of the key | +| tags.{index} | | (Optional) List of the key's tags | +| rotation-policy.rotation-period | | Rotation period | +| rotation-policy.next-rotation-at | | Key next rotation date | +| unprotected | | (Optional) Defines whether key protection is applied to a key. Protected keys can be used but not deleted | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Decrypt data + +Decrypt data using an existing key, specified by the `key_id` parameter. The maximum payload size that can be decrypted is the result of the encryption of 64KB of data (around 131KB). + +**Usage:** + +``` +scw keymanager key decrypt [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to decrypt | +| ciphertext | Required | Base64 Ciphertext data to decrypt | +| associated-data | | (Optional) Additional authenticated data | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a key + +Delete an existing key specified by the `region` and `key_id` parameters. Deleting a key is permanent and cannot be undone. All data encrypted using this key, including data encryption keys, will become unusable. + +**Usage:** + +``` +scw keymanager key delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Disable key + +Disable a given key to be used for cryptographic operations. Disabling a key renders it unusable. You must specify the `region` and `key_id` parameters. + +**Usage:** + +``` +scw keymanager key disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to disable | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable key + +Enable a given key to be used for cryptographic operations. Enabling a key allows you to make a disabled key usable again. You must specify the `region` and `key_id` parameters. + +**Usage:** + +``` +scw keymanager key enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to enable | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Encrypt data + +Encrypt data using an existing key, specified by the `key_id` parameter. Only keys with a usage set to **symmetric_encryption** are supported by this method. The maximum payload size that can be encrypted is 64KB of plaintext. + +**Usage:** + +``` +scw keymanager key encrypt [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to encrypt | +| plaintext | Required | Base64 Plaintext data to encrypt | +| associated-data | | (Optional) Additional authenticated data | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Generate a data encryption key + +Generate a new data encryption key to use for cryptographic operations outside of Key Manager. Note that Key Manager does not store your data encryption key. The data encryption key is encrypted and must be decrypted using the key you have created in Key Manager. The data encryption key's plaintext is returned in the response object, for immediate usage. + +Always store the data encryption key's ciphertext, rather than its plaintext, which must not be stored. To retrieve your key's plaintext, call the Decrypt endpoint with your key's ID and ciphertext. + +**Usage:** + +``` +scw keymanager key generate-data-key [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key | +| algorithm | One of: `unknown_symmetric_encryption`, `aes_256_gcm` | Symmetric encryption algorithm of the data encryption key | +| without-plaintext | | (Optional) Defines whether to return the data encryption key's plaintext in the response object | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get key metadata + +Retrieve the metadata of a key specified by the `region` and `key_id` parameters. + +**Usage:** + +``` +scw keymanager key get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to target | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List keys + +Retrieve the list of keys created within all Projects of an Organization or in a given Project. You must specify the `region`, and either the `organization_id` or the `project_id`. + +**Usage:** + +``` +scw keymanager key list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | (Optional) Filter by Project ID | +| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | | +| tags.{index} | | (Optional) List of tags to filter on | +| name | | (Optional) Filter by key name | +| organization-id | | (Optional) Filter by Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Apply key protection + +Apply key protection to a given key specified by the `key_id` parameter. Applying key protection means that your key can be used and modified, but it cannot be deleted. + +**Usage:** + +``` +scw keymanager key protect [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to apply key protection to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Rotate a key + +Generate a new version of an existing key with randomly generated key material. Rotated keys can still be used to decrypt previously encrypted data. The key's new material will be used for subsequent encryption operations and data key generation. + +**Usage:** + +``` +scw keymanager key rotate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to rotate | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Remove key protection + +Remove key protection from a given key specified by the `key_id` parameter. Removing key protection means that your key can be deleted anytime. + +**Usage:** + +``` +scw keymanager key unprotect [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to remove key protection from | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update a key + +Update a key's metadata (name, description and tags), specified by the `key_id` and `region` parameters. + +**Usage:** + +``` +scw keymanager key update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| key-id | Required | ID of the key to update | +| name | | (Optional) Updated name of the key | +| description | | (Optional) Updated description of the key | +| tags.{index} | | (Optional) Updated list of the key's tags | +| rotation-policy.rotation-period | | Rotation period | +| rotation-policy.next-rotation-at | | Key next rotation date | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/lb.md b/docs/docs/lb.md new file mode 100644 index 0000000000..482039446c --- /dev/null +++ b/docs/docs/lb.md @@ -0,0 +1,1447 @@ + +# Documentation for `scw lb` +This API allows you to manage your Scaleway Load Balancer services. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) + - [Create an ACL for a given frontend](#create-an-acl-for-a-given-frontend) + - [Delete an ACL](#delete-an-acl) + - [Get an ACL](#get-an-acl) + - [List ACLs for a given frontend](#list-acls-for-a-given-frontend) + - [Define all ACLs for a given frontend](#define-all-acls-for-a-given-frontend) + - [Update an ACL](#update-an-acl) +- [Backend management commands](#backend-management-commands) + - [Add a set of backend servers to a given backend](#add-a-set-of-backend-servers-to-a-given-backend) + - [Create a backend for a given Load Balancer](#create-a-backend-for-a-given-load-balancer) + - [Delete a backend of a given Load Balancer](#delete-a-backend-of-a-given-load-balancer) + - [Get a backend of a given Load Balancer](#get-a-backend-of-a-given-load-balancer) + - [List the backends of a given Load Balancer](#list-the-backends-of-a-given-load-balancer) + - [List backend server statistics](#list-backend-server-statistics) + - [Remove a set of servers for a given backend](#remove-a-set-of-servers-for-a-given-backend) + - [Define all backend servers for a given backend](#define-all-backend-servers-for-a-given-backend) + - [Update a backend of a given Load Balancer](#update-a-backend-of-a-given-load-balancer) + - [Update a health check for a given backend](#update-a-health-check-for-a-given-backend) +- [TLS certificate management commands](#tls-certificate-management-commands) + - [Create an SSL/TLS certificate](#create-an-ssltls-certificate) + - [Delete an SSL/TLS certificate](#delete-an-ssltls-certificate) + - [Get an SSL/TLS certificate](#get-an-ssltls-certificate) + - [List all SSL/TLS certificates on a given Load Balancer](#list-all-ssltls-certificates-on-a-given-load-balancer) + - [Update an SSL/TLS certificate](#update-an-ssltls-certificate) +- [Frontend management commands](#frontend-management-commands) + - [Create a frontend in a given Load Balancer](#create-a-frontend-in-a-given-load-balancer) + - [Delete a frontend](#delete-a-frontend) + - [Get a frontend](#get-a-frontend) + - [List frontends of a given Load Balancer](#list-frontends-of-a-given-load-balancer) + - [Update a frontend](#update-a-frontend) +- [IP management commands](#ip-management-commands) + - [Create an IP address](#create-an-ip-address) + - [Delete an IP address](#delete-an-ip-address) + - [Get an IP address](#get-an-ip-address) + - [List IP addresses](#list-ip-addresses) + - [Update an IP address](#update-an-ip-address) +- [Load balancer management commands](#load-balancer-management-commands) + - [Create a Load Balancer](#create-a-load-balancer) + - [Delete a Load Balancer](#delete-a-load-balancer) + - [Get a Load Balancer](#get-a-load-balancer) + - [Get usage statistics of a given Load Balancer](#get-usage-statistics-of-a-given-load-balancer) + - [List Load Balancers](#list-load-balancers) + - [Migrate a Load Balancer](#migrate-a-load-balancer) + - [Update a Load Balancer](#update-a-load-balancer) + - [Wait for a load balancer to reach a stable state](#wait-for-a-load-balancer-to-reach-a-stable-state) +- [Load balancer types management commands](#load-balancer-types-management-commands) + - [List all Load Balancer offer types](#list-all-load-balancer-offer-types) +- [Private networks management commands](#private-networks-management-commands) + - [Attach a Load Balancer to a Private Network](#attach-a-load-balancer-to-a-private-network) + - [Detach Load Balancer from Private Network](#detach-load-balancer-from-private-network) + - [List Private Networks attached to a Load Balancer](#list-private-networks-attached-to-a-load-balancer) +- [Route rules management commands](#route-rules-management-commands) + - [Create a route](#create-a-route) + - [Delete a route](#delete-a-route) + - [Get a route](#get-a-route) + - [List all routes](#list-all-routes) + - [Update a route](#update-a-route) +- [Subscriber management commands](#subscriber-management-commands) + - [Create a subscriber](#create-a-subscriber) + - [Delete a subscriber](#delete-a-subscriber) + - [Get a subscriber](#get-a-subscriber) + - [List all subscribers](#list-all-subscribers) + - [Subscribe a subscriber to alerts for a given Load Balancer](#subscribe-a-subscriber-to-alerts-for-a-given-load-balancer) + - [Unsubscribe a subscriber from alerts for a given Load Balancer](#unsubscribe-a-subscriber-from-alerts-for-a-given-load-balancer) + - [Update a subscriber](#update-a-subscriber) + + +## Access Control List (ACL) management commands + +Access Control List (ACL) management commands. + + +### Create an ACL for a given frontend + +Create a new ACL for a given frontend. Each ACL must have a name, an action to perform (allow or deny), and a match rule (the action is carried out when the incoming traffic matches the rule). + +**Usage:** + +``` +scw lb acl create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | Required | Frontend ID to attach the ACL to | +| name | Required
Default: `` | ACL name | +| action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | +| action.redirect.type | One of: `location`, `scheme` | Redirect type | +| action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | +| action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | +| match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | +| match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | +| match.http-filter-value.{index} | | List of values to filter for | +| match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | +| match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | +| index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | +| description | | ACL description | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an ACL + +Delete an ACL, specified by its ACL ID. Deleting an ACL is irreversible and cannot be undone. + +**Usage:** + +``` +scw lb acl delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | ACL ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an ACL + +Get information for a particular ACL, specified by its ACL ID. The response returns full details of the ACL, including its name, action, match rule and frontend. + +**Usage:** + +``` +scw lb acl get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | ACL ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List ACLs for a given frontend + +List the ACLs for a given frontend, specified by its frontend ID. The response is an array of ACL objects, each one representing an ACL that denies or allows traffic based on certain conditions. + +**Usage:** + +``` +scw lb acl list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | Required | Frontend ID (ACLs attached to this frontend will be returned in the response) | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of ACLs in the response | +| name | | ACL name to filter for | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Define all ACLs for a given frontend + +For a given frontend specified by its frontend ID, define and add the complete set of ACLS for that frontend. Any existing ACLs on this frontend will be removed. + +**Usage:** + +``` +scw lb acl set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acls.{index}.name | Required | ACL name | +| acls.{index}.action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | +| acls.{index}.action.redirect.type | One of: `location`, `scheme` | Redirect type | +| acls.{index}.action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | +| acls.{index}.action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | +| acls.{index}.match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | +| acls.{index}.match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | +| acls.{index}.match.http-filter-value.{index} | | List of values to filter for | +| acls.{index}.match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | +| acls.{index}.match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | +| acls.{index}.index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | +| acls.{index}.description | | ACL description | +| frontend-id | Required | Frontend ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an ACL + +Update a particular ACL, specified by its ACL ID. You can update details including its name, action and match rule. + +**Usage:** + +``` +scw lb acl update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | ACL ID | +| name | Required | ACL name | +| action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | +| action.redirect.type | One of: `location`, `scheme` | Redirect type | +| action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | +| action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | +| match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | +| match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | +| match.http-filter-value.{index} | | List of values to filter for | +| match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | +| match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | +| index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | +| description | | ACL description | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Backend management commands + +Backend management commands. + + +### Add a set of backend servers to a given backend + +For a given backend specified by its backend ID, add a set of backend servers (identified by their IP addresses) it should forward traffic to. These will be appended to any existing set of backend servers for this backend. + +**Usage:** + +``` +scw lb backend add-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | Backend ID | +| instance-server-id.{index} | | UIID of the instance server. | +| instance-server-tag.{index} | | Tag of the instance server. | +| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | +| baremetal-server-id.{index} | | UIID of the baremetal server. | +| baremetal-server-tag.{index} | | Tag of the baremetal server. | +| server-ip.{index} | Required | List of IP addresses to add to backend servers | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Create a backend for a given Load Balancer + +Create a new backend for a given Load Balancer, specifying its full configuration including protocol, port and forwarding algorithm. + +**Usage:** + +``` +scw lb backend create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name for the backend | +| forward-protocol | Required
One of: `tcp`, `http` | Protocol to be used by the backend when forwarding traffic to backend servers | +| forward-port | Required | Port to be used by the backend when forwarding traffic to backend servers | +| forward-port-algorithm | Required
Default: `roundrobin`
One of: `roundrobin`, `leastconn`, `first` | Load balancing algorithm to be used when determining which backend server to forward new traffic to | +| sticky-sessions | Required
Default: `none`
One of: `none`, `cookie`, `table` | Defines whether to activate sticky sessions (binding a particular session to a particular backend server) and the method to use if so. None disables sticky sessions. Cookie-based uses an HTTP cookie TO stick a session to a backend server. Table-based uses the source (client) IP address to stick a session to a backend server | +| sticky-sessions-cookie-name | | Cookie name for cookie-based sticky sessions | +| lb-id | Required | Load Balancer ID | +| health-check.port | | Port to use for the backend server health check | +| health-check.check-delay | Default: `3s` | Time to wait between two consecutive health checks | +| health-check.check-timeout | Default: `1s` | Maximum time a backend server has to reply to the health check | +| health-check.check-max-retries | | Number of consecutive unsuccessful health checks after which the server will be considered dead | +| health-check.mysql-config.user | | MySQL user to use for the health check | +| health-check.pgsql-config.user | | PostgreSQL user to use for the health check | +| health-check.http-config.uri | | HTTP URI used for the health check | +| health-check.http-config.method | | HTTP method used for the health check | +| health-check.http-config.code | | HTTP response code expected for a successful health check | +| health-check.http-config.host-header | | HTTP host header used for the health check | +| health-check.https-config.uri | | HTTP URI used for the health check | +| health-check.https-config.method | | HTTP method used for the health check | +| health-check.https-config.code | | HTTP response code expected for a successful health check | +| health-check.https-config.host-header | | HTTP host header used for the health check | +| health-check.https-config.sni | | SNI used for SSL health checks | +| health-check.check-send-proxy | | Defines whether proxy protocol should be activated for the health check | +| health-check.transient-check-delay | Default: `0.5s` | Time to wait between two consecutive health checks when a backend server is in a transient state (going UP or DOWN) | +| instance-server-id.{index} | | UIID of the instance server. | +| instance-server-tag.{index} | | Tag of the instance server. | +| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | +| baremetal-server-id.{index} | | UIID of the baremetal server. | +| baremetal-server-tag.{index} | | Tag of the baremetal server. | +| server-ip.{index} | Required | List of backend server IP addresses (IPv4 or IPv6) the backend should forward traffic to | +| ~~send-proxy-v2~~ | Deprecated | Deprecated in favor of proxy_protocol field | +| timeout-server | Default: `5m` | Maximum allowed time for a backend server to process a request | +| timeout-connect | Default: `5s` | Maximum allowed time for establishing a connection to a backend server | +| timeout-tunnel | Default: `15m` | Maximum allowed tunnel inactivity time after Websocket is established (takes precedence over client and server timeout) | +| on-marked-down-action | One of: `on_marked_down_action_none`, `shutdown_sessions` | Action to take when a backend server is marked as down | +| proxy-protocol | One of: `proxy_protocol_unknown`, `proxy_protocol_none`, `proxy_protocol_v1`, `proxy_protocol_v2`, `proxy_protocol_v2_ssl`, `proxy_protocol_v2_ssl_cn` | Protocol to use between the Load Balancer and backend servers. Allows the backend servers to be informed of the client's real IP address. The PROXY protocol must be supported by the backend servers' software | +| failover-host | | Scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud | +| ssl-bridging | | Defines whether to enable SSL bridging between the Load Balancer and backend servers | +| ignore-ssl-server-verify | | Defines whether the server certificate verification should be ignored | +| redispatch-attempt-count | | Whether to use another backend server on each attempt | +| max-retries | | Number of retries when a backend server connection failed | +| max-connections | | Maximum number of connections allowed per backend server | +| timeout-queue | | Maximum time for a request to be left pending in queue when `max_connections` is reached | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a backend of a given Load Balancer + +Delete a backend of a given Load Balancer, specified by its backend ID. This action is irreversible and cannot be undone. + +**Usage:** + +``` +scw lb backend delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | ID of the backend to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a backend of a given Load Balancer + +Get the full details of a given backend, specified by its backend ID. The response contains the backend's full configuration parameters including protocol, port and forwarding algorithm. + +**Usage:** + +``` +scw lb backend get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | Backend ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List the backends of a given Load Balancer + +List all the backends of a Load Balancer, specified by its Load Balancer ID. By default, results are returned in ascending order by the creation date of each backend. The response is an array of backend objects, containing full details of each one including their configuration parameters such as protocol, port and forwarding algorithm. + +**Usage:** + +``` +scw lb backend list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| name | | Name of the backend to filter for | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of backends in the response | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### List backend server statistics + +List information about your backend servers, including their state and the result of their last health check. + +**Usage:** + +``` +scw lb backend list-statistics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| backend-id | | ID of the backend | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Remove a set of servers for a given backend + +For a given backend specified by its backend ID, remove the specified backend servers (identified by their IP addresses) so that it no longer forwards traffic to them. + +**Usage:** + +``` +scw lb backend remove-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | Backend ID | +| instance-server-id.{index} | | UIID of the instance server. | +| instance-server-tag.{index} | | Tag of the instance server. | +| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | +| baremetal-server-id.{index} | | UIID of the baremetal server. | +| baremetal-server-tag.{index} | | Tag of the baremetal server. | +| server-ip.{index} | Required | List of IP addresses to remove from backend servers | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Define all backend servers for a given backend + +For a given backend specified by its backend ID, define the set of backend servers (identified by their IP addresses) that it should forward traffic to. Any existing backend servers configured for this backend will be removed. + +**Usage:** + +``` +scw lb backend set-servers [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | Backend ID | +| instance-server-id.{index} | | UIID of the instance server. | +| instance-server-tag.{index} | | Tag of the instance server. | +| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | +| baremetal-server-id.{index} | | UIID of the baremetal server. | +| baremetal-server-tag.{index} | | Tag of the baremetal server. | +| server-ip.{index} | Required | List of IP addresses for backend servers. Any other existing backend servers will be removed | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a backend of a given Load Balancer + +Update a backend of a given Load Balancer, specified by its backend ID. Note that the request type is PUT and not PATCH. You must set all parameters. + +**Usage:** + +``` +scw lb backend update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backend-id | Required | Backend ID | +| name | Required | Backend name | +| forward-protocol | Required
One of: `tcp`, `http` | Protocol to be used by the backend when forwarding traffic to backend servers | +| forward-port | Required | Port to be used by the backend when forwarding traffic to backend servers | +| forward-port-algorithm | Required
One of: `roundrobin`, `leastconn`, `first` | Load balancing algorithm to be used when determining which backend server to forward new traffic to | +| sticky-sessions | Required
One of: `none`, `cookie`, `table` | Defines whether to activate sticky sessions (binding a particular session to a particular backend server) and the method to use if so. None disables sticky sessions. Cookie-based uses an HTTP cookie to stick a session to a backend server. Table-based uses the source (client) IP address to stick a session to a backend server | +| sticky-sessions-cookie-name | | Cookie name for cookie-based sticky sessions | +| ~~send-proxy-v2~~ | Deprecated | Deprecated in favor of proxy_protocol field | +| timeout-server | Default: `5m` | Maximum allowed time for a backend server to process a request | +| timeout-connect | Default: `5s` | Maximum allowed time for establishing a connection to a backend server | +| timeout-tunnel | Default: `15m` | Maximum allowed tunnel inactivity time after Websocket is established (takes precedence over client and server timeout) | +| on-marked-down-action | One of: `on_marked_down_action_none`, `shutdown_sessions` | Action to take when a backend server is marked as down | +| proxy-protocol | One of: `proxy_protocol_unknown`, `proxy_protocol_none`, `proxy_protocol_v1`, `proxy_protocol_v2`, `proxy_protocol_v2_ssl`, `proxy_protocol_v2_ssl_cn` | Protocol to use between the Load Balancer and backend servers. Allows the backend servers to be informed of the client's real IP address. The PROXY protocol must be supported by the backend servers' software | +| failover-host | | Scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud | +| ssl-bridging | | Defines whether to enable SSL bridging between the Load Balancer and backend servers | +| ignore-ssl-server-verify | | Defines whether the server certificate verification should be ignored | +| redispatch-attempt-count | | Whether to use another backend server on each attempt | +| max-retries | | Number of retries when a backend server connection failed | +| max-connections | | Maximum number of connections allowed per backend server | +| timeout-queue | | Maximum time for a request to be left pending in queue when `max_connections` is reached | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a health check for a given backend + +Update the configuration of the health check performed by a given backend to verify the health of its backend servers, identified by its backend ID. Note that the request type is PUT and not PATCH. You must set all parameters. + +**Usage:** + +``` +scw lb backend update-healthcheck [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| port | Required | Port to use for the backend server health check | +| check-delay | Required | Time to wait between two consecutive health checks | +| check-timeout | Required | Maximum time a backend server has to reply to the health check | +| check-max-retries | Required | Number of consecutive unsuccessful health checks after which the server will be considered dead | +| backend-id | Required | Backend ID | +| check-send-proxy | | Defines whether proxy protocol should be activated for the health check | +| mysql-config.user | | MySQL user to use for the health check | +| pgsql-config.user | | PostgreSQL user to use for the health check | +| http-config.uri | | HTTP URI used for the health check | +| http-config.method | | HTTP method used for the health check | +| http-config.code | | HTTP response code expected for a successful health check | +| http-config.host-header | | HTTP host header used for the health check | +| https-config.uri | | HTTP URI used for the health check | +| https-config.method | | HTTP method used for the health check | +| https-config.code | | HTTP response code expected for a successful health check | +| https-config.host-header | | HTTP host header used for the health check | +| https-config.sni | | SNI used for SSL health checks | +| transient-check-delay | Default: `0.5s` | Time to wait between two consecutive health checks when a backend server is in a transient state (going UP or DOWN) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## TLS certificate management commands + +TLS certificate management commands. + + +### Create an SSL/TLS certificate + +Generate a new SSL/TLS certificate for a given Load Balancer. You can choose to create a Let's Encrypt certificate, or import a custom certificate. + +**Usage:** + +``` +scw lb certificate create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| name | Required
Default: `` | Name for the certificate | +| letsencrypt-common-name | | Main domain name of certificate (this domain must exist and resolve to your Load Balancer IP address) | +| letsencrypt-alternative-name.{index} | | Alternative domain names (all domain names must exist and resolve to your Load Balancer IP address) | +| custom-certificate-chain | | Full PEM-formatted certificate, consisting of the entire certificate chain including public key, private key, and (optionally) Certificate Authorities | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an SSL/TLS certificate + +Delete an SSL/TLS certificate, specified by its certificate ID. Deleting a certificate is irreversible and cannot be undone. + +**Usage:** + +``` +scw lb certificate delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| certificate-id | Required | Certificate ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an SSL/TLS certificate + +Get information for a particular SSL/TLS certificate, specified by its certificate ID. The response returns full details of the certificate, including its type, main domain name, and alternative domain names. + +**Usage:** + +``` +scw lb certificate get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| certificate-id | Required | Certificate ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all SSL/TLS certificates on a given Load Balancer + +List all the SSL/TLS certificates on a given Load Balancer. The response is an array of certificate objects, which are by default listed in ascending order of creation date. + +**Usage:** + +``` +scw lb certificate list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of certificates in the response | +| name | | Certificate name to filter for, only certificates of this name will be returned | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an SSL/TLS certificate + +Update the name of a particular SSL/TLS certificate, specified by its certificate ID. + +**Usage:** + +``` +scw lb certificate update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| certificate-id | Required | Certificate ID | +| name | Required | Certificate name | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Frontend management commands + +Frontend management commands. + + +### Create a frontend in a given Load Balancer + +Create a new frontend for a given Load Balancer, specifying its configuration including the port it should listen on and the backend to attach it to. + +**Usage:** + +``` +scw lb frontend create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name for the frontend | +| inbound-port | Required | Port the frontend should listen on | +| lb-id | Required | Load Balancer ID (ID of the Load Balancer to attach the frontend to) | +| backend-id | Required | Backend ID (ID of the backend the frontend should pass traffic to) | +| timeout-client | Default: `5m` | Maximum allowed inactivity time on the client side | +| ~~certificate-id~~ | Deprecated | Certificate ID, deprecated in favor of certificate_ids array | +| certificate-ids.{index} | | List of SSL/TLS certificate IDs to bind to the frontend | +| enable-http3 | | Defines whether to enable HTTP/3 protocol on the frontend | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a frontend + +Delete a given frontend, specified by its frontend ID. This action is irreversible and cannot be undone. + +**Usage:** + +``` +scw lb frontend delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | Required | ID of the frontend to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a frontend + +Get the full details of a given frontend, specified by its frontend ID. The response contains the frontend's full configuration parameters including the backend it is attached to, the port it listens on, and any certificates it has. + +**Usage:** + +``` +scw lb frontend get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | Required | Frontend ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List frontends of a given Load Balancer + +List all the frontends of a Load Balancer, specified by its Load Balancer ID. By default, results are returned in ascending order by the creation date of each frontend. The response is an array of frontend objects, containing full details of each one including the port they listen on and the backend they are attached to. + +**Usage:** + +``` +scw lb frontend list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| name | | Name of the frontend to filter for | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of frontends in the response | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a frontend + +Update a given frontend, specified by its frontend ID. You can update configuration parameters including its name and the port it listens on. Note that the request type is PUT and not PATCH. You must set all parameters. + +**Usage:** + +``` +scw lb frontend update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | Required | Frontend ID | +| name | Required | Frontend name | +| inbound-port | Required | Port the frontend should listen on | +| backend-id | Required | Backend ID (ID of the backend the frontend should pass traffic to) | +| timeout-client | Default: `5m` | Maximum allowed inactivity time on the client side | +| ~~certificate-id~~ | Deprecated | Certificate ID, deprecated in favor of certificate_ids array | +| certificate-ids.{index} | | List of SSL/TLS certificate IDs to bind to the frontend | +| enable-http3 | | Defines whether to enable HTTP/3 protocol on the frontend | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## IP management commands + +IP management commands. + + +### Create an IP address + +Create a new Load Balancer flexible IP address, in the specified Scaleway Project. This can be attached to new Load Balancers created in the future. + +**Usage:** + +``` +scw lb ip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| reverse | | Reverse DNS (domain name) for the IP address | +| is-ipv6 | | If true, creates a Flexible IP with an ipv6 address | +| tags.{index} | | List of tags for the IP | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an IP address + +Delete a Load Balancer flexible IP address. This action is irreversible, and cannot be undone. + +**Usage:** + +``` +scw lb ip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP address ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an IP address + +Retrieve the full details of a Load Balancer flexible IP address. + +**Usage:** + +``` +scw lb ip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP address ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List IP addresses + +List the Load Balancer flexible IP addresses held in the account (filtered by Organization ID or Project ID). It is also possible to search for a specific IP address. + +**Usage:** + +``` +scw lb ip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-address | | IP address to filter for | +| project-id | | Project ID to filter for, only Load Balancer IP addresses from this Project will be returned | +| ip-type | One of: `all`, `ipv4`, `ipv6` | IP type to filter for | +| tags.{index} | | Tag to filter for, only IPs with one or more matching tags will be returned | +| organization-id | | Organization ID to filter for, only Load Balancer IP addresses from this Organization will be returned | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an IP address + +Update the reverse DNS of a Load Balancer flexible IP address. + +**Usage:** + +``` +scw lb ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | IP address ID | +| reverse | | Reverse DNS (domain name) for the IP address | +| lb-id | | ID of the server on which to attach the flexible IP | +| tags.{index} | | List of tags for the IP | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Load balancer management commands + +Load balancer management commands. + + +### Create a Load Balancer + +Create a new Load Balancer. Note that the Load Balancer will be created without frontends or backends; these must be created separately via the dedicated endpoints. + +**Usage:** + +``` +scw lb lb create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Required
Default: `` | Name for the Load Balancer | +| description | | Description for the Load Balancer | +| ~~ip-id~~ | Deprecated | ID of an existing flexible IP address to attach to the Load Balancer | +| assign-flexible-ip | Default: `true` | Defines whether to automatically assign a flexible public IP to the Load Balancer. Default value is `true` (assign). | +| assign-flexible-ipv6 | Default: `false` | Defines whether to automatically assign a flexible public IPv6 to the Load Balancer. Default value is `false` (do not assign). | +| ip-ids.{index} | | List of IP IDs to attach to the Load Balancer | +| tags.{index} | | List of tags for the Load Balancer | +| type | Default: `LB-S`
One of: `LB-S`, `LB-GP-M`, `LB-GP-L` | Load Balancer commercial offer type. Use the Load Balancer types endpoint to retrieve a list of available offer types | +| ssl-compatibility-level | One of: `ssl_compatibility_level_unknown`, `ssl_compatibility_level_intermediate`, `ssl_compatibility_level_modern`, `ssl_compatibility_level_old` | Determines the minimal SSL version which needs to be supported on the client side, in an SSL/TLS offloading context. Intermediate is suitable for general-purpose servers with a variety of clients, recommended for almost all systems. Modern is suitable for services with clients that support TLS 1.3 and do not need backward compatibility. Old is compatible with a small number of very old clients and should be used only as a last resort | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a Load Balancer + +Delete an existing Load Balancer, specified by its Load Balancer ID. Deleting a Load Balancer is permanent, and cannot be undone. The Load Balancer's flexible IP address can either be deleted with the Load Balancer, or kept in your account for future use. + +**Usage:** + +``` +scw lb lb delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | ID of the Load Balancer to delete | +| release-ip | | Defines whether the Load Balancer's flexible IP should be deleted. Set to true to release the flexible IP, or false to keep it available in your account for future Load Balancers | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a Load Balancer + +Retrieve information about an existing Load Balancer, specified by its Load Balancer ID. Its full details, including name, status and IP address, are returned in the response object. + +**Usage:** + +``` +scw lb lb get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get usage statistics of a given Load Balancer + +Get usage statistics of a given Load Balancer. + +**Usage:** + +``` +scw lb lb get-stats [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| backend-id | | ID of the backend | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List Load Balancers + +List all Load Balancers in the specified zone, for a Scaleway Organization or Scaleway Project. By default, the Load Balancers returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw lb lb list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Load Balancer name to filter for | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of Load Balancers in the response | +| project-id | | Project ID to filter for, only Load Balancers from this Project will be returned | +| tags.{index} | | Filter by tag, only Load Balancers with one or more matching tags will be returned | +| organization-id | | Organization ID to filter for, only Load Balancers from this Organization will be returned | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Migrate a Load Balancer + +Migrate an existing Load Balancer from one commercial type to another. Allows you to scale your Load Balancer up or down in terms of bandwidth or multi-cloud provision. + +**Usage:** + +``` +scw lb lb migrate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| type | Required
One of: `LB-S`, `LB-GP-M`, `LB-GP-L` | Load Balancer type to migrate to (use the List all Load Balancer offer types endpoint to get a list of available offer types) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a Load Balancer + +Update the parameters of an existing Load Balancer, specified by its Load Balancer ID. Note that the request type is PUT and not PATCH. You must set all parameters. + +**Usage:** + +``` +scw lb lb update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| name | Required | Load Balancer name | +| description | Required | Load Balancer description | +| assign-flexible-ipv6 | | Automatically assign a flexible public IPv6 to the Load Balancer | +| ip-id | | The IP ID to attach to the Load Balancer | +| tags.{index} | | List of tags for the Load Balancer | +| ssl-compatibility-level | One of: `ssl_compatibility_level_unknown`, `ssl_compatibility_level_intermediate`, `ssl_compatibility_level_modern`, `ssl_compatibility_level_old` | Determines the minimal SSL version which needs to be supported on the client side, in an SSL/TLS offloading context. Intermediate is suitable for general-purpose servers with a variety of clients, recommended for almost all systems. Modern is suitable for services with clients that support TLS 1.3 and don't need backward compatibility. Old is compatible with a small number of very old clients and should be used only as a last resort | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for a load balancer to reach a stable state + +Wait for a load balancer to reach a stable state. This is similar to using --wait flag. + +**Usage:** + +``` +scw lb lb wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | ID of the load balancer you want to wait for. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `pl-waw-1`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `10m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a load balancer to reach a stable state +``` +scw lb lb wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Load balancer types management commands + +Load balancer types management commands. + + +### List all Load Balancer offer types + +List all the different commercial Load Balancer types. The response includes an array of offer types, each with a name, description, and information about its stock availability. + +**Usage:** + +``` +scw lb lb-types list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Private networks management commands + +Private networks management commands. + + +### Attach a Load Balancer to a Private Network + +Attach a specified Load Balancer to a specified Private Network, defining a static or DHCP configuration for the Load Balancer on the network. + +**Usage:** + +``` +scw lb private-network attach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| private-network-id | Required | Private Network ID | +| ipam-ids.{index} | | IPAM ID of a pre-reserved IP address to assign to the Load Balancer on this Private Network. In the future, it will be possible to specify multiple IPs in this field (IPv4 and IPv6), for now only one ID of an IPv4 address is expected. When null, a new private IP address is created for the Load Balancer on this Private Network. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach Load Balancer from Private Network + +Detach a specified Load Balancer from a specified Private Network. + +**Usage:** + +``` +scw lb private-network detach [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load balancer ID | +| private-network-id | Required | Set your instance private network id | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List Private Networks attached to a Load Balancer + +List the Private Networks attached to a given Load Balancer, specified by its Load Balancer ID. The response is an array of Private Network objects, giving information including the status, configuration, name and creation date of each Private Network. + +**Usage:** + +``` +scw lb private-network list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of Private Network objects in the response | +| lb-id | Required | Load Balancer ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Route rules management commands + +Route rules management commands. + + +### Create a route + +Create a new route on a given frontend. To configure a route, specify the backend to direct to if a certain condition is matched (based on the value of the SNI field or HTTP Host header). + +**Usage:** + +``` +scw lb route create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| frontend-id | | ID of the source frontend to create the route on | +| backend-id | | ID of the target backend for the route | +| match.sni | | Server Name Indication (SNI) value to match | +| match.host-header | | HTTP host header to match | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a route + +Delete an existing route, specified by its route ID. Deleting a route is permanent, and cannot be undone. + +**Usage:** + +``` +scw lb route delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a route + +Retrieve information about an existing route, specified by its route ID. Its full details, origin frontend, target backend and match condition, are returned in the response object. + +**Usage:** + +``` +scw lb route get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all routes + +List all routes for a given frontend. The response is an array of routes, each one with a specified backend to direct to if a certain condition is matched (based on the value of the SNI field or HTTP Host header). + +**Usage:** + +``` +scw lb route list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of routes in the response | +| frontend-id | | Frontend ID to filter for, only Routes from this Frontend will be returned | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a route + +Update the configuration of an existing route, specified by its route ID. + +**Usage:** + +``` +scw lb route update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| backend-id | | ID of the target backend for the route | +| match.sni | | Server Name Indication (SNI) value to match | +| match.host-header | | HTTP host header to match | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Subscriber management commands + +Subscriber management commands. + + +### Create a subscriber + +Create a new subscriber, either with an email configuration or a webhook configuration, for a specified Scaleway Project. + +**Usage:** + +``` +scw lb subscriber create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | Subscriber name | +| email-config.email | | Email address to send alerts to | +| webhook-config.uri | | URI to receive POST requests | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a subscriber + +Delete an existing subscriber, specified by its subscriber ID. Deleting a subscriber is permanent, and cannot be undone. + +**Usage:** + +``` +scw lb subscriber delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| subscriber-id | Required | Subscriber ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a subscriber + +Retrieve information about an existing subscriber, specified by its subscriber ID. Its full details, including name and email/webhook configuration, are returned in the response object. + +**Usage:** + +``` +scw lb subscriber get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| subscriber-id | Required | Subscriber ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List all subscribers + +List all subscribers to Load Balancer alerts. By default, returns all subscribers to Load Balancer alerts for the Organization associated with the authentication token used for the request. + +**Usage:** + +``` +scw lb subscriber list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of subscribers in the response | +| name | Required | Subscriber name to search for | +| project-id | | Filter subscribers by Project ID | +| organization-id | | Filter subscribers by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Subscribe a subscriber to alerts for a given Load Balancer + +Subscribe an existing subscriber to alerts for a given Load Balancer. + +**Usage:** + +``` +scw lb subscriber subscribe [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| subscriber-id | Required | Subscriber ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Unsubscribe a subscriber from alerts for a given Load Balancer + +Unsubscribe a subscriber from alerts for a given Load Balancer. The subscriber is not deleted, and can be resubscribed in the future if necessary. + +**Usage:** + +``` +scw lb subscriber unsubscribe [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| lb-id | Required | Load Balancer ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a subscriber + +Update the parameters of a given subscriber (e.g. name, webhook configuration, email configuration), specified by its subscriber ID. + +**Usage:** + +``` +scw lb subscriber update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| subscriber-id | Required | Subscriber ID | +| name | Required | Subscriber name | +| email-config.email | | Email address to send alerts to | +| webhook-config.uri | | URI to receive POST requests | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/login.md b/docs/docs/login.md new file mode 100644 index 0000000000..e966fc1694 --- /dev/null +++ b/docs/docs/login.md @@ -0,0 +1,9 @@ + +# Documentation for `scw login` +Start an interactive connection to scaleway to initialize the active profile of the config +A webpage will open while the CLI will wait for a response. +Once you connected to Scaleway, the profile should be configured. + + + + diff --git a/docs/docs/marketplace.md b/docs/docs/marketplace.md new file mode 100644 index 0000000000..42d5f4bf1d --- /dev/null +++ b/docs/docs/marketplace.md @@ -0,0 +1,192 @@ + +# Documentation for `scw marketplace` +This API allows you to find available images for use when launching a Scaleway Instance. + +- [Marketplace category management commands](#marketplace-category-management-commands) + - [Get a specific category](#get-a-specific-category) + - [List existing image categories](#list-existing-image-categories) +- [Marketplace images management commands](#marketplace-images-management-commands) + - [Get a specific marketplace image](#get-a-specific-marketplace-image) + - [List marketplace images](#list-marketplace-images) +- [Marketplace local images management commands](#marketplace-local-images-management-commands) + - [Get a specific local image by ID](#get-a-specific-local-image-by-id) + - [List local images from a specific image or version](#list-local-images-from-a-specific-image-or-version) +- [Marketplace version management commands](#marketplace-version-management-commands) + - [Get a specific image version](#get-a-specific-image-version) + - [List versions of an Image](#list-versions-of-an-image) + + +## Marketplace category management commands + +Marketplace category management commands. + + +### Get a specific category + +Get information about a specific category of the marketplace catalog, specified by its `category_id` (UUID format). + +**Usage:** + +``` +scw marketplace category get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| category-id | Required | | + + + +### List existing image categories + +Get a list of all existing categories. The output can be paginated. + +**Usage:** + +``` +scw marketplace category list +``` + + + +## Marketplace images management commands + +Marketplace images management commands. + + +### Get a specific marketplace image + +Get detailed information about a marketplace image, specified by its `image_id` (UUID format). + +**Usage:** + +``` +scw marketplace image get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| label | Required | | + + + +### List marketplace images + +List all available images on the marketplace, their UUID, CPU architecture and description. + +**Usage:** + +``` +scw marketplace image list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Ordering to use | +| arch | | Choose for which machine architecture to return images | +| category | | Choose the category of images to get | +| include-eol | | Choose to include end-of-life images | + + + +## Marketplace local images management commands + +Marketplace local images management commands. + + +### Get a specific local image by ID + +Get detailed information about a local image, including compatible commercial types, supported architecture, labels and the Availability Zone of the image, specified by its `local_image_id` (UUID format). + +**Usage:** + +``` +scw marketplace local-image get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| local-image-id | Required | | + + + +### List local images from a specific image or version + +List information about local images in a specific Availability Zone, specified by its `image_id` (UUID format), `version_id` (UUID format) or `image_label`. Only one of these three parameters may be set. + +**Usage:** + +``` +scw marketplace local-image list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering to use | +| zone | | Filter local images available on this Availability Zone | +| image-id | | Filter by image id | +| version-id | | Filter by version id | +| image-label | | Filter by image label | +| type | One of: `unknown_type`, `instance_local`, `instance_sbs` | Filter by type | + + + +## Marketplace version management commands + +Marketplace version management commands. + + +### Get a specific image version + +Get information such as the name, creation date, last update and published date for an image version specified by its `version_id` (UUID format). + +**Usage:** + +``` +scw marketplace version get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| version-id | Required | | + + + +### List versions of an Image + +Get a list of all available version of an image, specified by its `image_id` (UUID format). + +**Usage:** + +``` +scw marketplace version list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | | | +| order-by | One of: `created_at_asc`, `created_at_desc` | | + + + diff --git a/docs/docs/mnq.md b/docs/docs/mnq.md new file mode 100644 index 0000000000..681d7346ba --- /dev/null +++ b/docs/docs/mnq.md @@ -0,0 +1,607 @@ + +# Documentation for `scw mnq` +These APIs allow you to manage your Messaging and Queuing NATS, SQS and SNS services. + +- [MnQ NATS commands](#mnq-nats-commands) + - [Create a NATS account](#create-a-nats-account) + - [Create a new context for natscli](#create-a-new-context-for-natscli) + - [Create NATS credentials](#create-nats-credentials) + - [Delete a NATS account](#delete-a-nats-account) + - [Delete NATS credentials](#delete-nats-credentials) + - [Get a NATS account](#get-a-nats-account) + - [Get NATS credentials](#get-nats-credentials) + - [List NATS accounts](#list-nats-accounts) + - [List NATS credentials](#list-nats-credentials) + - [Update the name of a NATS account](#update-the-name-of-a-nats-account) +- [MnQ SNS commands](#mnq-sns-commands) + - [Activate SNS](#activate-sns) + - [Create SNS credentials](#create-sns-credentials) + - [Deactivate SNS](#deactivate-sns) + - [Delete SNS credentials](#delete-sns-credentials) + - [Get SNS credentials](#get-sns-credentials) + - [Get SNS info](#get-sns-info) + - [List SNS credentials](#list-sns-credentials) + - [Update SNS credentials](#update-sns-credentials) +- [MnQ SQS commands](#mnq-sqs-commands) + - [Activate SQS](#activate-sqs) + - [Create SQS credentials](#create-sqs-credentials) + - [Deactivate SQS](#deactivate-sqs) + - [Delete SQS credentials](#delete-sqs-credentials) + - [Get SQS credentials](#get-sqs-credentials) + - [Get SQS info](#get-sqs-info) + - [List SQS credentials](#list-sqs-credentials) + - [Update SQS credentials](#update-sqs-credentials) + + +## MnQ NATS commands + +MnQ NATS commands. + + +### Create a NATS account + +Create a NATS account associated with a Project. + +**Usage:** + +``` +scw mnq nats create-account [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Default: `` | NATS account name | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Create a new context for natscli + +This command help you configure your nats cli +Contexts should are stored in $HOME/.config/nats/context +Credentials and context file are saved in your nats context folder with 0600 permissions + +**Usage:** + +``` +scw mnq nats create-context [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | | ID of the NATS account | +| name | | Name of the saved context, defaults to account name | +| credentials-name | | Name of the created credentials | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Create a context in your nats server +``` +scw mnq nats create-context credentials-name= region=fr-par +``` + + + + +### Create NATS credentials + +Create a set of credentials for a NATS account, specified by its NATS account ID. + +**Usage:** + +``` +scw mnq nats create-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | Required | NATS account containing the credentials | +| name | Default: `` | Name of the credentials | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Delete a NATS account + +Delete a NATS account, specified by its NATS account ID. Note that deleting a NATS account is irreversible, and any credentials, streams, consumer and stored messages belonging to this NATS account will also be deleted. + +**Usage:** + +``` +scw mnq nats delete-account [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | Required | ID of the NATS account to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Delete NATS credentials + +Delete a set of credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can no longer be used to access the NATS account, and active connections using this credentials will be closed. + +**Usage:** + +``` +scw mnq nats delete-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-credentials-id | Required | ID of the credentials to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get a NATS account + +Retrieve information about an existing NATS account identified by its NATS account ID. Its full details, including name and endpoint, are returned in the response. + +**Usage:** + +``` +scw mnq nats get-account [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | Required | ID of the NATS account to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get NATS credentials + +Retrieve an existing set of credentials, identified by the `nats_credentials_id`. The credentials themselves are NOT returned, only their metadata (NATS account ID, credentials name, etc), are returned in the response. + +**Usage:** + +``` +scw mnq nats get-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-credentials-id | Required | ID of the credentials to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### List NATS accounts + +List all NATS accounts in the specified region, for a Scaleway Organization or Project. By default, the NATS accounts returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw mnq nats list-accounts [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Include only NATS accounts in this Project | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + + +### List NATS credentials + +List existing credentials in the specified NATS account. The response contains only the metadata for the credentials, not the credentials themselves, which are only returned after a **Create Credentials** call. + +**Usage:** + +``` +scw mnq nats list-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | Required | Include only credentials for this NATS account | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update the name of a NATS account + +Update the name of a NATS account, specified by its NATS account ID. + +**Usage:** + +``` +scw mnq nats update-account [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| nats-account-id | Required | ID of the NATS account to update | +| name | | NATS account name | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +## MnQ SNS commands + +MnQ SNS commands. + + +### Activate SNS + +Activate SNS for the specified Project ID. SNS must be activated before any usage. Activating SNS does not trigger any billing, and you can deactivate at any time. + +**Usage:** + +``` +scw mnq sns activate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Create SNS credentials + +Create a set of credentials for SNS, specified by a Project ID. Credentials give the bearer access to topics, and the level of permissions can be defined granularly. + +**Usage:** + +``` +scw mnq sns create-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name of the credentials | +| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (publish to SNS topics) | +| permissions.can-receive | | Defines whether the credentials bearer can receive messages from the service (configure subscriptions) | +| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SNS topics or subscriptions | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Deactivate SNS + +Deactivate SNS for the specified Project ID.You must delete all topics and credentials before this call or you need to set the force_delete parameter. + +**Usage:** + +``` +scw mnq sns deactivate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Delete SNS credentials + +Delete a set of SNS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SNS. + +**Usage:** + +``` +scw mnq sns delete-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sns-credentials-id | Required | ID of the credentials to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get SNS credentials + +Retrieve an existing set of credentials, identified by the `credentials_id`. The credentials themselves, as well as their metadata (name, project ID etc), are returned in the response. + +**Usage:** + +``` +scw mnq sns get-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sns-credentials-id | Required | ID of the SNS credentials to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get SNS info + +Retrieve the SNS information of the specified Project ID. Informations include the activation status and the SNS API endpoint URL. + +**Usage:** + +``` +scw mnq sns get-info [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### List SNS credentials + +List existing SNS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. + +**Usage:** + +``` +scw mnq sns list-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Include only SNS credentials in this Project | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update SNS credentials + +Update a set of SNS credentials. You can update the credentials' name, or their permissions. + +**Usage:** + +``` +scw mnq sns update-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sns-credentials-id | Required | ID of the SNS credentials to update | +| name | | Name of the credentials | +| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (publish to SNS topics) | +| permissions.can-receive | | Defines whether the credentials bearer can receive messages from the service (configure subscriptions) | +| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SNS topics or subscriptions | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +## MnQ SQS commands + +MnQ SQS commands. + + +### Activate SQS + +Activate SQS for the specified Project ID. SQS must be activated before any usage such as creating credentials and queues. Activating SQS does not trigger any billing, and you can deactivate at any time. + +**Usage:** + +``` +scw mnq sqs activate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Create SQS credentials + +Create a set of credentials for SQS, specified by a Project ID. Credentials give the bearer access to queues, and the level of permissions can be defined granularly. + +**Usage:** + +``` +scw mnq sqs create-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name of the credentials | +| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (send messages to SQS queues) | +| permissions.can-receive | | Defines whether the credentials bearer can receive messages from SQS queues | +| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SQS queues | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Deactivate SQS + +Deactivate SQS for the specified Project ID. You must delete all queues and credentials before this call or you need to set the force_delete parameter. + +**Usage:** + +``` +scw mnq sqs deactivate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Delete SQS credentials + +Delete a set of SQS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SQS. + +**Usage:** + +``` +scw mnq sqs delete-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sqs-credentials-id | Required | ID of the credentials to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get SQS credentials + +Retrieve an existing set of credentials, identified by the `credentials_id`. The credentials themselves, as well as their metadata (name, project ID etc), are returned in the response. + +**Usage:** + +``` +scw mnq sqs get-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sqs-credentials-id | Required | ID of the SQS credentials to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Get SQS info + +Retrieve the SQS information of the specified Project ID. Informations include the activation status and the SQS API endpoint URL. + +**Usage:** + +``` +scw mnq sqs get-info [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### List SQS credentials + +List existing SQS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. + +**Usage:** + +``` +scw mnq sqs list-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Include only SQS credentials in this Project | +| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update SQS credentials + +Update a set of SQS credentials. You can update the credentials' name, or their permissions. + +**Usage:** + +``` +scw mnq sqs update-credentials [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| sqs-credentials-id | Required | ID of the SQS credentials to update | +| name | | Name of the credentials | +| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (send messages to SQS queues) | +| permissions.can-receive | | Defines whether the credentials bearer can receive messages from SQS queues | +| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SQS queues | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/object.md b/docs/docs/object.md new file mode 100644 index 0000000000..20d9ae96b7 --- /dev/null +++ b/docs/docs/object.md @@ -0,0 +1,213 @@ + +# Documentation for `scw object` +Object-storage utils + +- [Manage S3 buckets](#manage-s3-buckets) + - [Create an S3 bucket](#create-an-s3-bucket) + - [Delete an S3 bucket](#delete-an-s3-bucket) + - [Get information about an S3 bucket](#get-information-about-an-s3-bucket) + - [List S3 buckets](#list-s3-buckets) + - [Update an S3 bucket](#update-an-s3-bucket) +- [Manage configuration files for popular S3 tools](#manage-configuration-files-for-popular-s3-tools) + - [Generate a S3 tool configuration file](#generate-a-s3-tool-configuration-file) + - [Install a S3 tool configuration file to its default location](#install-a-s3-tool-configuration-file-to-its-default-location) + + +## Manage S3 buckets + +Manage S3 buckets creation, deletion and updates to properties like tags, ACL and versioning. + + +### Create an S3 bucket + +Create an Object Storage Bucket with the S3 protocol. The namespace is shared between all S3 users, so its name must be unique. + +**Usage:** + +``` +scw object bucket create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | The unique name of the bucket | +| tags.{index} | | List of tags to set on the bucket | +| enable-versioning | Default: `false` | Whether or not objects in the bucket should have multiple versions | +| acl | Default: `private` | The permissions given to users (grantees) to read or write objects | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete an S3 bucket + +Delete an S3 bucket with all its content. + +**Usage:** + +``` +scw object bucket delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | The unique name of the bucket | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get information about an S3 bucket + +Get the properties of an S3 bucket like tags, endpoint, access control, versioning, size, etc. + +**Usage:** + +``` +scw object bucket get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | The unique name of the bucket | +| with-size | Default: `false` | Whether to return the total size of the bucket and the number of objects. This operation can take long for large buckets. | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List S3 buckets + +List all existing S3 buckets in the specified region + +**Usage:** + +``` +scw object bucket list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update an S3 bucket + +Update an S3 bucket's properties like tags, access control and versioning. + +**Usage:** + +``` +scw object bucket update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | The unique name of the bucket | +| tags.{index} | | List of new tags to set on the bucket | +| enable-versioning | Default: `false` | Whether or not objects in the bucket should have multiple versions | +| acl | Default: `private` | The permissions given to users (grantees) to read or write objects | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Manage configuration files for popular S3 tools + +Configuration generation for S3 tools. + + +### Generate a S3 tool configuration file + +Generate a S3 tool configuration file. + +**Usage:** + +``` +scw object config get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for | +| name | Default: `scaleway` | Name of the s3 remote you want to generate | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Generate a s3cmd config file for Paris region +``` +scw object config get region=fr-par type=s3cmd +``` + +Generate a rclone config file for default region +``` +scw object config get type=rclone +``` + +Generate a mc (minio) config file for default region +``` +scw object config get type=mc +``` + + + + +### Install a S3 tool configuration file to its default location + +Install a S3 tool configuration file to its default location. + +**Usage:** + +``` +scw object config install [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for | +| name | Default: `scaleway` | Name of the s3 remote you want to generate | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Install a s3cmd config file for Paris region +``` +scw object config install region=fr-par type=s3cmd +``` + +Install a rclone config file for default region +``` +scw object config install type=rclone +``` + +Install a mc (minio) config file for default region +``` +scw object config install type=mc +``` + + + + diff --git a/docs/docs/rdb.md b/docs/docs/rdb.md new file mode 100644 index 0000000000..58f62b4c6e --- /dev/null +++ b/docs/docs/rdb.md @@ -0,0 +1,1674 @@ + +# Documentation for `scw rdb` +This API allows you to manage your Managed Databases for PostgreSQL and MySQL. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) + - [Add an ACL rule to a Database Instance](#add-an-acl-rule-to-a-database-instance) + - [Delete ACL rules of a Database Instance](#delete-acl-rules-of-a-database-instance) + - [Edit a database instance's ACL](#edit-a-database-instance's-acl) + - [List ACL rules of a Database Instance](#list-acl-rules-of-a-database-instance) + - [Set ACL rules for a Database Instance](#set-acl-rules-for-a-database-instance) +- [Backup management commands](#backup-management-commands) + - [Create a database backup](#create-a-database-backup) + - [Delete a database backup](#delete-a-database-backup) + - [Download a backup locally](#download-a-backup-locally) + - [Export a database backup](#export-a-database-backup) + - [Get a database backup](#get-a-database-backup) + - [List database backups](#list-database-backups) + - [Restore a database backup](#restore-a-database-backup) + - [Update a database backup](#update-a-database-backup) + - [Wait for a backup to reach a stable state](#wait-for-a-backup-to-reach-a-stable-state) +- [Database management commands](#database-management-commands) + - [Create a database in a Database Instance](#create-a-database-in-a-database-instance) + - [Delete a database in a Database Instance](#delete-a-database-in-a-database-instance) + - [Gets the URL to connect to the Database](#gets-the-url-to-connect-to-the-database) + - [List databases in a Database Instance](#list-databases-in-a-database-instance) +- [Endpoint management](#endpoint-management) + - [Create a new Database Instance endpoint](#create-a-new-database-instance-endpoint) + - [Delete a Database Instance endpoint](#delete-a-database-instance-endpoint) + - [Get a Database Instance endpoint](#get-a-database-instance-endpoint) + - [Lists a Database Instance's endpoints](#lists-a-database-instance's-endpoints) + - [Migrate an existing instance endpoint to another instance](#migrate-an-existing-instance-endpoint-to-another-instance) +- [Database engines commands](#database-engines-commands) + - [List available database engines](#list-available-database-engines) + - [List available settings from an engine.](#list-available-settings-from-an-engine.) +- [Instance management commands](#instance-management-commands) + - [Clone a Database Instance](#clone-a-database-instance) + - [Connect to an instance using locally installed CLI](#connect-to-an-instance-using-locally-installed-cli) + - [Create a Database Instance](#create-a-database-instance) + - [Delete a Database Instance](#delete-a-database-instance) + - [Get a Database Instance](#get-a-database-instance) + - [Get the TLS certificate of a Database Instance](#get-the-tls-certificate-of-a-database-instance) + - [Get Database Instance metrics](#get-database-instance-metrics) + - [List Database Instances](#list-database-instances) + - [Renew the TLS certificate of a Database Instance](#renew-the-tls-certificate-of-a-database-instance) + - [Restart Database Instance](#restart-database-instance) + - [Update an instance](#update-an-instance) + - [Upgrade a Database Instance](#upgrade-a-database-instance) + - [Wait for an instance to reach a stable state](#wait-for-an-instance-to-reach-a-stable-state) +- [Instance logs management commands](#instance-logs-management-commands) + - [Get given logs of a Database Instance](#get-given-logs-of-a-database-instance) + - [List available logs of a Database Instance](#list-available-logs-of-a-database-instance) + - [List remote Database Instance logs details](#list-remote-database-instance-logs-details) + - [Prepare logs of a Database Instance](#prepare-logs-of-a-database-instance) + - [Purge remote Database Instance logs](#purge-remote-database-instance-logs) +- [Node types management commands](#node-types-management-commands) + - [List available node types](#list-available-node-types) +- [User privileges management commands](#user-privileges-management-commands) + - [List user privileges for a database](#list-user-privileges-for-a-database) + - [Set user privileges for a database](#set-user-privileges-for-a-database) +- [Read replica management](#read-replica-management) + - [Create a Read Replica](#create-a-read-replica) + - [Create an endpoint for a Read Replica](#create-an-endpoint-for-a-read-replica) + - [Delete a Read Replica](#delete-a-read-replica) + - [Get a Read Replica](#get-a-read-replica) + - [Resync a Read Replica](#resync-a-read-replica) +- [Setting management](#setting-management) + - [Add Database Instance advanced settings](#add-database-instance-advanced-settings) + - [Delete Database Instance advanced settings](#delete-database-instance-advanced-settings) + - [Set Database Instance advanced settings](#set-database-instance-advanced-settings) +- [Block snapshot management](#block-snapshot-management) + - [Create a Database Instance snapshot](#create-a-database-instance-snapshot) + - [Delete a Database Instance snapshot](#delete-a-database-instance-snapshot) + - [Get a Database Instance snapshot](#get-a-database-instance-snapshot) + - [List snapshots](#list-snapshots) + - [Create a new Database Instance from a snapshot](#create-a-new-database-instance-from-a-snapshot) + - [Update a Database Instance snapshot](#update-a-database-instance-snapshot) +- [User management commands](#user-management-commands) + - [Create a user for a Database Instance](#create-a-user-for-a-database-instance) + - [Delete a user on a Database Instance](#delete-a-user-on-a-database-instance) + - [Gets the URL to connect to the Database](#gets-the-url-to-connect-to-the-database) + - [List users of a Database Instance](#list-users-of-a-database-instance) + - [Update a user on a Database Instance](#update-a-user-on-a-database-instance) + + +## Access Control List (ACL) management commands + +Network Access Control Lists allow you to control incoming network traffic by setting up ACL rules. + + +### Add an ACL rule to a Database Instance + +Add an additional ACL rule to a Database Instance. + +**Usage:** + +``` +scw rdb acl add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-rule-ips | Required | IP addresses defined in the ACL rules of the Database Instance | +| instance-id | Required | ID of the Database Instance | +| description | | Description of the ACL rule. Indexes are not yet supported so the description will be applied to all the rules of the command. | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete ACL rules of a Database Instance + +Delete one or more ACL rules of a Database Instance. + +**Usage:** + +``` +scw rdb acl delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-rule-ips | Required | IP addresses defined in the ACL rules of the Database Instance | +| instance-id | Required | ID of the Database Instance | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Edit a database instance's ACL + +This command starts your default editor to edit a marshaled version of your resource +Default editor will be taken from $VISUAL, then $EDITOR or an editor based on your system + +**Usage:** + +``` +scw rdb acl edit [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | ID of the Database Instance | +| mode | Default: `yaml`
One of: `yaml`, `json` | marshaling used when editing data | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List ACL rules of a Database Instance + +List the ACL rules for a given Database Instance. The response is an array of ACL objects, each one representing an ACL that denies, allows or redirects traffic based on certain conditions. + +**Usage:** + +``` +scw rdb acl list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set ACL rules for a Database Instance + +Replace all the ACL rules of a Database Instance. + +**Usage:** + +``` +scw rdb acl set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-rule-ips | | IP addresses defined in the ACL rules of the Database Instance | +| instance-id | Required | ID of the Database Instance | +| descriptions | | Descriptions of the ACL rules | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Backup management commands + +A database backup is a dated export of a Database Instance stored on an offsite backend located in a different region than your database, by default. Once a backup is created, it can be used to restore the database. Each logical database in a Database Instance is backed up and can be restored separately. + + +### Create a database backup + +Create a new backup. You must set the `instance_id`, `database_name`, `name` and `expires_at` parameters. + +**Usage:** + +``` +scw rdb backup create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | | UUID of the Database Instance | +| database-name | | Name of the database you want to back up | +| name | Default: `` | Name of the backup | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a database backup + +Delete a backup, specified by its database backup ID and region. Deleting a backup is permanent, and cannot be undone. + +**Usage:** + +``` +scw rdb backup delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-backup-id | Required | UUID of the database backup to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Download a backup locally + +Download a backup locally. + +**Usage:** + +``` +scw rdb backup download [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-id | Required | ID of the backup you want to download. | +| output | | Filename to write to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Download a backup +``` +scw rdb backup download 11111111-1111-1111-1111-111111111111 +``` + + + + +### Export a database backup + +Export a backup, specified by the `database_backup_id` and the `region` parameters. The download URL is returned in the response. + +**Usage:** + +``` +scw rdb backup export [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-backup-id | Required | UUID of the database backup you want to export | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a database backup + +Retrieve information about a given backup, specified by its database backup ID and region. Full details about the backup, like size, URL and expiration date, are returned in the response. + +**Usage:** + +``` +scw rdb backup get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-backup-id | Required | UUID of the database backup | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List database backups + +List all backups in a specified region, for a given Scaleway Organization or Scaleway Project. By default, the backups listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. + +**Usage:** + +``` +scw rdb backup list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the database backups | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc` | Criteria to use when ordering database backups listing | +| instance-id | | UUID of the Database Instance | +| project-id | | Project ID of the Project the database backups belong to | +| organization-id | | Organization ID of the Organization the database backups belong to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Restore a database backup + +Launch the process of restoring database backup. You must specify the `instance_id` of the Database Instance of destination, where the backup will be restored. Note that large database backups can take up to several hours to restore. + +**Usage:** + +``` +scw rdb backup restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-name | | Defines the destination database to restore into a specified database (the default destination is set to the origin database of the backup) | +| database-backup-id | Required | Backup of a logical database | +| instance-id | Required | Defines the Database Instance where the backup has to be restored | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update a database backup + +Update the parameters of a backup, including name and expiration date. + +**Usage:** + +``` +scw rdb backup update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-backup-id | Required | UUID of the database backup to update | +| name | | Name of the Database Backup | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Wait for a backup to reach a stable state + +Wait for a backup to reach a stable state. This is similar to using --wait flag. + +**Usage:** + +``` +scw rdb backup wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-id | Required | ID of the backup you want to wait for. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | +| timeout | Default: `20m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a backup to reach a stable state +``` +scw rdb backup wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Database management commands + +Databases can be used to store and manage sets of structured information, or data. The interaction between the user and a database is done using a Database Engine, which provides a structured query language to add, modify or delete information from the database. + + +### Create a database in a Database Instance + +Create a new database. You must define the `name` parameter in the request. + +**Usage:** + +``` +scw rdb database create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where to create the database | +| name | | Name of the database | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a database in a Database Instance + +Delete a given database on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the database you want to delete. + +**Usage:** + +``` +scw rdb database delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where to delete the database | +| name | Required | Name of the database to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Gets the URL to connect to the Database + +Provides the URL to connect to a Database on an Instance as the given user + +**Usage:** + +``` +scw rdb database get-url [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | ID of the Database Instance | +| user | | User of the Database | +| db | | Name of the Database to connect to | + + + +### List databases in a Database Instance + +List all databases of a given Database Instance. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `name`, `managed` and `owner`. + +**Usage:** + +``` +scw rdb database list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the database | +| managed | | Defines whether or not the database is managed | +| owner | | User that owns this database | +| order-by | One of: `name_asc`, `name_desc`, `size_asc`, `size_desc` | Criteria to use when ordering database listing | +| instance-id | Required | UUID of the Database Instance to list the databases of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Endpoint management + +A point of connection to a Database Instance. The endpoint is associated with an IPv4 address and a port. It contains the information about whether the endpoint is read-write or not. The endpoints always point to the main node of a Database Instance. + +All endpoints have TLS enabled. You can use TLS to make your data and your passwords unreadable in transit to anyone but you. + +For added security, you can set up ACL rules to restrict access to your endpoint to a set of trusted hosts or networks of your choice. + +Load Balancers are used to forward traffic to the right node based on the node state (active/hot standby). The Load Balancers' configuration is set to cut off inactive connections if no TCP traffic is sent within a 6-hour timeframe. We recommend using connection pooling on the application side to renew database connections regularly. + + +### Create a new Database Instance endpoint + +Create a new endpoint for a Database Instance. You can add `load_balancer` and `private_network` specifications to the body of the request. + +**Usage:** + +``` +scw rdb endpoint create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to which you want to add an endpoint | +| private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | +| private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| private-network.enable-ipam | Default: `true` | Will configure your Private Network endpoint with Scaleway IPAM service if true | +| load-balancer | Default: `true` | Will configure a public Load-Balancer endpoint | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance endpoint + +Delete the endpoint of a Database Instance. You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. + +**Usage:** + +``` +scw rdb endpoint delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance from which you want to delete an endpoint | +| endpoint-id | Required | UUID of the endpoint you want to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance endpoint + +Retrieve information about a Database Instance endpoint. Full details about the endpoint, like `ip`, `port`, `private_network` and `load_balancer` specifications are returned in the response. + +**Usage:** + +``` +scw rdb endpoint get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to get | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Lists a Database Instance's endpoints + +Lists all public and private endpoints of a Database Instance + +**Usage:** + +``` +scw rdb endpoint list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | ID of the Database Instance | + + + +### Migrate an existing instance endpoint to another instance + +Migrate an existing instance endpoint to another instance. + +**Usage:** + +``` +scw rdb endpoint migrate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to migrate | +| instance-id | Required | UUID of the instance you want to attach the endpoint to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Database engines commands + +A database engine is the software component that stores and retrieves your data from a database. Currently PostgreSQL 11, 12, 13 and 14 are available. MySQL is available in version 8. + + +### List available database engines + +List the PostgreSQL and MySQL database engines available at Scaleway. + +**Usage:** + +``` +scw rdb engine list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the database engine | +| version | | Version of the database engine | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### List available settings from an engine. + +List available settings from an engine. + +**Usage:** + +``` +scw rdb engine settings [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required | The name of your engine where you want list the available settings. | +| version | Required | The version of the engine. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List Engine Settings +``` +scw rdb engine settings name=MySQL version=8 +``` + + + + +## Instance management commands + +A Database Instance is made up of one or multiple dedicated compute nodes running a single database engine. Two node settings are available: **High-Availability (HA)**, with a main node and one replica, and **standalone** with a main node. The HA standby node is linked to the main node, using synchronous replication. Synchronous replication offers the ability to confirm that all changes intended by a transaction have been transferred and applied to the synchronous replica node, providing durability to the data. + +**Note**: HA standby nodes are not accessible to users unless the main node becomes unavailable and the standby takes over. If you wish to run queries on a read-only node, you can use [Read Replicas](#path-read-replicas-create-a-read-replica) + +Read Replicas can be used for certain read-only workflows such as Business Intelligence, or for a read-only scaling of your application. Read Replicas use asynchronous replication to replicate data from the main node. + + +### Clone a Database Instance + +Clone a given Database Instance, specified by the `region` and `instance_id` parameters. The clone feature allows you to create a new Database Instance from an existing one. The clone includes all existing databases, users and permissions. You can create a clone on a Database Instance bigger than your current one. + +**Usage:** + +``` +scw rdb instance clone [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to clone | +| name | | Name of the Database Instance clone | +| node-type | | Node type of the clone | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Connect to an instance using locally installed CLI + +Connect to an instance using locally installed CLI such as psql or mysql. + +**Usage:** + +``` +scw rdb instance connect [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| private-network | Default: `false` | Connect by the private network endpoint attached. | +| instance-id | Required | UUID of the instance | +| username | Required | Name of the user to connect with to the database | +| database | Default: `rdb` | Name of the database | +| cli-db | | Command line tool to use, default to psql/mysql | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Create a Database Instance + +Create a new Database Instance. You must set the `engine`, `user_name`, `password` and `node_type` parameters. Optionally, you can specify the volume type and size. + +**Usage:** + +``` +scw rdb instance create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name of the Database Instance | +| engine | Required | Database engine of the Database Instance (PostgreSQL, MySQL, ...) | +| user-name | Required | Username created when the Database Instance is created | +| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | +| password | | Password of the user | +| node-type | Required
Default: `DB-DEV-S` | Type of node to use for the Database Instance | +| is-ha-cluster | | Defines whether or not High-Availability is enabled | +| disable-backup | | Defines whether or not backups are disabled | +| tags.{index} | | Tags to apply to the Database Instance | +| init-settings.{index}.name | | | +| init-settings.{index}.value | | | +| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Type of volume where data is stored (lssd, bssd, ...) | +| volume-size | | Volume size when volume_type is not lssd | +| init-endpoints.{index}.load-balancer | Default: `false` | Will configure a load-balancer endpoint along with your private network endpoint if true | +| init-endpoints.{index}.private-network.enable-ipam | | Will configure your Private Network endpoint with Scaleway IPAM service if true | +| init-endpoints.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | +| init-endpoints.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| backup-same-region | | Defines whether to or not to store logical backups in the same region as the Database Instance | +| encryption.enabled | | | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance + +Delete a given Database Instance, specified by the `region` and `instance_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. + +**Usage:** + +``` +scw rdb instance delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance + +Retrieve information about a given Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. + +**Usage:** + +``` +scw rdb instance get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get the TLS certificate of a Database Instance + +Retrieve information about the TLS certificate of a given Database Instance. Details like name and content are returned in the response. + +**Usage:** + +``` +scw rdb instance get-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get Database Instance metrics + +Retrieve the time series metrics of a given Database Instance. You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. + +**Usage:** + +``` +scw rdb instance get-metrics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| start-date | | Start date to gather metrics from | +| end-date | | End date to gather metrics from | +| metric-name | | Name of the metric to gather | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List Database Instances + +List all Database Instances in the specified region, for a given Scaleway Organization or Scaleway Project. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. + +**Usage:** + +``` +scw rdb instance list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tags.{index} | | List Database Instances that have a given tag | +| name | | Lists Database Instances that match a name pattern | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc`, `status_desc` | Criteria to use when ordering Database Instance listings | +| project-id | | Project ID to list the Database Instance of | +| organization-id | | Please use project_id instead | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Renew the TLS certificate of a Database Instance + +Renew a TLS for a Database Instance. Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. + +**Usage:** + +``` +scw rdb instance renew-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Restart Database Instance + +Restart a given Database Instance, specified by the `region` and `instance_id` parameters. The status of the Database Instance returned in the response. + +**Usage:** + +``` +scw rdb instance restart [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to restart | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update an instance + +Update an instance. + +**Usage:** + +``` +scw rdb instance update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-schedule-frequency | | In hours | +| backup-schedule-retention | | In days | +| is-backup-schedule-disabled | | Whether or not the backup schedule is disabled | +| name | | Name of the instance | +| instance-id | Required | UUID of the instance to update | +| tags.{index} | | Tags of a given instance | +| logs-policy.max-age-retention | | Max age (in day) of remote logs to keep on the database instance | +| logs-policy.total-disk-retention | | Max disk size of remote logs to keep on the database instance | +| backup-same-region | | Store logical backups in the same region as the database instance | +| settings.{index}.name | | Setting name of a given instance | +| settings.{index}.value | | Setting value of a given instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Update instance name +``` +scw rdb instance update 11111111-1111-1111-1111-111111111111 name=foo --wait +``` + +Update instance tags +``` +scw rdb instance update 11111111-1111-1111-1111-111111111111 tags.0=a --wait +``` + +Set a timezone +``` +scw rdb instance update 11111111-1111-1111-1111-111111111111 settings.0.name=timezone settings.0.value=UTC --wait +``` + + + + +### Upgrade a Database Instance + +Upgrade your current Database Instance specifications like node type, high availability, volume, or the database engine version. Note that upon upgrade the `enable_ha` parameter can only be set to `true`. + +**Usage:** + +``` +scw rdb instance upgrade [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to upgrade | +| node-type | | Node type of the Database Instance you want to upgrade to | +| enable-ha | | Defines whether or not high availability should be enabled on the Database Instance | +| volume-size | | Increase your block storage volume size | +| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Change your Database Instance storage type | +| upgradable-version-id | | Update your database engine to a newer version | +| major-upgrade-workflow.upgradable-version-id | | Update your database engine to a newer version | +| major-upgrade-workflow.with-endpoints | | Include endpoint during the migration | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Wait for an instance to reach a stable state + +Wait for an instance to reach a stable state. This is similar to using --wait flag. + +**Usage:** + +``` +scw rdb instance wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | ID of the instance you want to wait for. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | +| timeout | Default: `20m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for an instance to reach a stable state +``` +scw rdb instance wait 11111111-1111-1111-1111-111111111111 +``` + + + + +## Instance logs management commands + +Instance logs management commands. + + +### Get given logs of a Database Instance + +Retrieve information about the logs of a Database Instance. Specify the `instance_log_id` and `region` in your request to get information such as `download_url`, `status`, `expires_at` and `created_at` about your logs in the response. + +**Usage:** + +``` +scw rdb log get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-log-id | Required | UUID of the instance_log you want | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List available logs of a Database Instance + +List the available logs of a Database Instance. By default, the logs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw rdb log list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| order-by | One of: `created_at_asc`, `created_at_desc` | Criteria to use when ordering Database Instance logs listing | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List remote Database Instance logs details + +List remote log details. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw rdb log list-details [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Prepare logs of a Database Instance + +Prepare your Database Instance logs. You can define the `start_date` and `end_date` parameters for your query. The download URL is returned in the response. Logs are recorded from 00h00 to 23h59 and then aggregated in a `.log` file once a day. Therefore, even if you specify a timeframe from which you want to get the logs, you will receive logs from the full 24 hours. + +**Usage:** + +``` +scw rdb log prepare [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| start-date | | Start datetime of your log. (RFC 3339 format) | +| end-date | | End datetime of your log. (RFC 3339 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Purge remote Database Instance logs + +Purge a given remote log from a Database Instance. You can specify the `log_name` of the log you wish to clean from your Database Instance. + +**Usage:** + +``` +scw rdb log purge [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want logs of | +| log-name | | Given log name to purge | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Node types management commands + +Two node type ranges are available: + +* **General Purpose:** production-grade nodes designed for scalable database infrastructures. +* **Development:** sandbox environments and reliable performance for development and testing purposes. + + +### List available node types + +List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw rdb node-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| include-disabled-types | | Defines whether or not to include disabled types | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +## User privileges management commands + +Privileges are permissions that can be granted to database users. You can manage user permissions either via the console, the Scaleway APIs or SQL. Managed Database for PostgreSQL and MySQL provides a simplified and unified permission model through the API and the console to make things easier to manage and understand. + +Each user has associated permissions that give them access to zero or more logical databases. These include: + +* **None:** No access to the database +* **Read:** Allow users to read tables and fields in a database +* **Write:** Allow users to write content in databases. +* **Admin:** Read and write access to the data, and extended privileges depending on the database engine. + + +### List user privileges for a database + +List privileges of a user on a database. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `database_name` and `user_name`. + +**Usage:** + +``` +scw rdb privilege list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `user_name_asc`, `user_name_desc`, `database_name_asc`, `database_name_desc` | Criteria to use when ordering privileges listing | +| database-name | | Name of the database | +| instance-id | Required | UUID of the Database Instance | +| user-name | | Name of the user | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Set user privileges for a database + +Set the privileges of a user on a database. You must define `database_name`, `user_name` and `permission` in the request body. + +**Usage:** + +``` +scw rdb privilege set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| database-name | | Name of the database | +| user-name | | Name of the user | +| permission | One of: `readonly`, `readwrite`, `all`, `custom`, `none` | Permission to set (Read, Read/Write, All, Custom) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Read replica management + +A Read Replica is a live copy of a Database Instance that behaves like an Instance, but that only allows read-only connections. +The replica mirrors the data of the primary Database node and any changes made are replicated to the replica asynchronously. Read Replicas allow you to scale your Database Instance for read-heavy database workloads. They can also be used for business intelligence workloads. + +A Read Replica can have at most one direct access and one Private Network endpoint. `Loadbalancer` endpoints are not available on Read Replicas even if this resource is displayed in the Read Replica response example. + +If you want to remove a Read Replica endpoint, you can use [delete a Database Instance endpoint](#path-endpoints-delete-a-database-instance-endpoint) API call. + +Instance Access Control Lists (ACL) also apply to Read Replica direct access endpoints. + +**Limitations:** +There might be replication lags between the primary node and its Read Replica nodes. You can try to reduce this lag with some good practices: +* All your tables should have a primary key +* Don't run large transactions that modify, delete or insert lots of rows. Try to split it into several small transactions. + + +### Create a Read Replica + +Create a new Read Replica of a Database Instance. You must specify the `region` and the `instance_id`. You can only create a maximum of 3 Read Replicas per Database Instance. + +**Usage:** + +``` +scw rdb read-replica create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to create a Read Replica from | +| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | +| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| same-zone | | Defines whether to create the replica in the same availability zone as the main instance nodes or not. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create an endpoint for a Read Replica + +Create a new endpoint for a Read Replica. Read Replicas can have at most one direct access and one Private Network endpoint. + +**Usage:** + +``` +scw rdb read-replica create-endpoint [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | +| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Read Replica + +Delete a Read Replica of a Database Instance. You must specify the `region` and `read_replica_id` parameters of the Read Replica you want to delete. + +**Usage:** + +``` +scw rdb read-replica delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Read Replica + +Retrieve information about a Database Instance Read Replica. Full details about the Read Replica, like `endpoints`, `status` and `region` are returned in the response. + +**Usage:** + +``` +scw rdb read-replica get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Resync a Read Replica + +When you resync a Read Replica, first it is reset, then its data is resynchronized from the primary node. Your Read Replica remains unavailable during the resync process. The duration of this process is proportional to the size of your Database Instance. +The configured endpoints do not change. + +**Usage:** + +``` +scw rdb read-replica reset [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| read-replica-id | Required | UUID of the Read Replica | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Setting management + +Advanced Database Instance settings allow you to tune the behavior of your database engines to better fit your needs. + +Available settings depend on the database engine and its version. Note that some settings can only be defined upon database engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available database engines](#path-databases-list-databases-in-a-database-instance) endpoint. + +Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. + + +### Add Database Instance advanced settings + +Add an advanced setting to a Database Instance. You must set the `name` and the `value` of each setting. + +**Usage:** + +``` +scw rdb setting add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance you want to add settings to | +| settings.{index}.name | | | +| settings.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete Database Instance advanced settings + +Delete an advanced setting in a Database Instance. You must specify the names of the settings you want to delete in the request. + +**Usage:** + +``` +scw rdb setting delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete settings from | +| setting-names.{index} | Required | Settings names to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Set Database Instance advanced settings + +Update an advanced setting for a Database Instance. Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. + +**Usage:** + +``` +scw rdb setting set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance where the settings must be set | +| settings.{index}.name | | | +| settings.{index}.value | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Block snapshot management + +A snapshot is a consistent, instantaneous copy of the Block Storage volume of your Database Instance at a certain point in time. They are designed to recover your data in case of failure or accidental alterations of the data by a user. They allow you to quickly create a new Instance from a previous state of your database, regardless of the size of the volume. Their limitation is that, unlike backups, snapshots can only be stored in the same location as the original data. + + +### Create a Database Instance snapshot + +Create a new snapshot of a Database Instance. You must define the `name` parameter in the request. + +**Usage:** + +``` +scw rdb snapshot create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance | +| name | Required
Default: `` | Name of the snapshot | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Database Instance snapshot + +Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `region` and `snapshot_id` parameters of the snapshot you want to delete. + +**Usage:** + +``` +scw rdb snapshot delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot to delete | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Database Instance snapshot + +Retrieve information about a given snapshot, specified by its `snapshot_id` and `region`. Full details about the snapshot, like size and expiration date, are returned in the response. + +**Usage:** + +``` +scw rdb snapshot get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List snapshots + +List snapshots. You can include the `instance_id` or `project_id` in your query to get the list of snapshots for specific Database Instances and/or Projects. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw rdb snapshot list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the snapshot | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `expires_at_asc`, `expires_at_desc` | Criteria to use when ordering snapshot listing | +| instance-id | | UUID of the Database Instance | +| project-id | | Project ID the snapshots belongs to | +| organization-id | | Organization ID the snapshots belongs to | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Create a new Database Instance from a snapshot + +Restore a snapshot. When you restore a snapshot, a new Instance is created and billed to your account. Note that is possible to select a larger node type for your new Database Instance. However, the Block volume size will be the same as the size of the restored snapshot. All Instance settings will be restored if you chose a node type with the same or more memory size than the initial Instance. Settings will be reset to the default if your node type has less memory. + +**Usage:** + +``` +scw rdb snapshot restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | Block snapshot of the Database Instance | +| instance-name | | Name of the Database Instance created with the snapshot | +| is-ha-cluster | | Defines whether or not High-Availability is enabled on the new Database Instance | +| node-type | | The node type used to restore the snapshot | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update a Database Instance snapshot + +Update the parameters of a snapshot of a Database Instance. You can update the `name` and `expires_at` parameters. + +**Usage:** + +``` +scw rdb snapshot update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| snapshot-id | Required | UUID of the snapshot to update | +| name | | Name of the snapshot | +| expires-at | | Expiration date (must follow the ISO 8601 format) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## User management commands + +Users are profiles to which you can attribute database-level permissions. They allow you to define permissions specific to each type of database usage. For example, users with an `admin` role can create new databases and users. + + +### Create a user for a Database Instance + +Create a new user for a Database Instance. You must define the `name`, `password` and `is_admin` parameters. + +**Usage:** + +``` +scw rdb user create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance in which you want to create a user | +| name | | Name of the user you want to create | +| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | +| password | | Password of the user you want to create | +| is-admin | | Defines whether the user will have administrative privileges | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a user on a Database Instance + +Delete a given user on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the user you want to delete. + +**Usage:** + +``` +scw rdb user delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance to delete the user from | +| name | Required | Name of the user | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Gets the URL to connect to the Database + +Provides the URL to connect to a Database on an Instance as the given user + +**Usage:** + +``` +scw rdb user get-url [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | ID of the Database Instance | +| user | | User of the Database | +| db | | Name of the Database to connect to | + + + +### List users of a Database Instance + +List all users of a given Database Instance. By default, the users returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw rdb user list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the user | +| order-by | One of: `name_asc`, `name_desc`, `is_admin_asc`, `is_admin_desc` | Criteria to use when requesting user listing | +| instance-id | Required | UUID of the Database Instance | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a user on a Database Instance + +Update the parameters of a user on a Database Instance. You can update the `password` and `is_admin` parameters, but you cannot change the name of the user. + +**Usage:** + +``` +scw rdb user update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| instance-id | Required | UUID of the Database Instance the user belongs to | +| name | Required | Name of the database user | +| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | +| password | | Password of the database user | +| is-admin | | Defines whether or not this user got administrative privileges | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/redis.md b/docs/docs/redis.md new file mode 100644 index 0000000000..87195630c3 --- /dev/null +++ b/docs/docs/redis.md @@ -0,0 +1,607 @@ + +# Documentation for `scw redis` +This API allows you to manage your Managed Databases for Redis™. + +- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) + - [Add ACL rules for a cluster](#add-acl-rules-for-a-cluster) + - [Delete an ACL rule for a cluster](#delete-an-acl-rule-for-a-cluster) + - [Get an ACL rule](#get-an-acl-rule) + - [Set ACL rules for a cluster](#set-acl-rules-for-a-cluster) +- [Cluster management commands](#cluster-management-commands) + - [Create a Redis™ Database Instance](#create-a-redis™-database-instance) + - [Delete a Redis™ Database Instance](#delete-a-redis™-database-instance) + - [Get a Redis™ Database Instance](#get-a-redis™-database-instance) + - [Get the TLS certificate of a cluster](#get-the-tls-certificate-of-a-cluster) + - [List Redis™ Database Instances](#list-redis™-database-instances) + - [Get metrics of a Redis™ Database Instance](#get-metrics-of-a-redis™-database-instance) + - [Scale up a Redis™ Database Instance](#scale-up-a-redis™-database-instance) + - [Renew the TLS certificate of a cluster](#renew-the-tls-certificate-of-a-cluster) + - [Update a Redis™ Database Instance](#update-a-redis™-database-instance) + - [Wait for a Redis cluster to reach a stable state](#wait-for-a-redis-cluster-to-reach-a-stable-state) +- [Endpoints management commands](#endpoints-management-commands) + - [Add endpoints for a cluster](#add-endpoints-for-a-cluster) + - [Delete an endpoint for a cluster](#delete-an-endpoint-for-a-cluster) + - [Get an endpoint](#get-an-endpoint) + - [Set endpoints for a cluster](#set-endpoints-for-a-cluster) + - [Update an endpoint](#update-an-endpoint) +- [Node Types management commands](#node-types-management-commands) + - [List available node types](#list-available-node-types) +- [Settings management commands](#settings-management-commands) + - [Add advanced settings](#add-advanced-settings) + - [Delete advanced setting](#delete-advanced-setting) + - [Set advanced settings](#set-advanced-settings) +- [Redis™ version management commands](#redis™-version-management-commands) + - [List available Redis™ versions](#list-available-redis™-versions) + + +## Access Control List (ACL) management commands + +Network Access Control Lists (ACLs) allow you to manage network inbound traffic by setting up ACL rules. + + +### Add ACL rules for a cluster + +Add an additional ACL rule to a Redis™ Database Instance (Redis™ cluster). + +**Usage:** + +``` +scw redis acl add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance you want to add ACL rules to | +| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | +| acl-rules.{index}.description | | Description of the rule | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an ACL rule for a cluster + +Delete an ACL rule of a Redis™ Database Instance (Redis™ cluster). You must specify the `acl_id` of the rule you want to delete in your request. + +**Usage:** + +``` +scw redis acl delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | UUID of the ACL rule you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an ACL rule + +Retrieve information about an ACL rule of a Redis™ Database Instance (Redis™ cluster). You must specify the `acl_id` of the rule in your request. + +**Usage:** + +``` +scw redis acl get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| acl-id | Required | UUID of the ACL rule you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Set ACL rules for a cluster + +Replace all the ACL rules of a Redis™ Database Instance (Redis™ cluster). + +**Usage:** + +``` +scw redis acl set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance where the ACL rules have to be set | +| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | +| acl-rules.{index}.description | | Description of the rule | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +## Cluster management commands + +A Redis™ Database Instance, also known as a Redis™ cluster, consists of either one standalone node or a cluster composed of three to six nodes. The cluster uses partitioning to split the keyspace. Each partition is replicated and can be reassigned or elected as the primary when necessary. Standalone mode creates a standalone database provisioned on a single node. + + +### Create a Redis™ Database Instance + +Create a new Redis™ Database Instance (Redis™ cluster). You must set the `zone`, `project_id`, `version`, `node_type`, `user_name` and `password` parameters. Optionally you can define `acl_rules`, `endpoints`, `tls_enabled` and `cluster_settings`. + +**Usage:** + +``` +scw redis cluster create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name of the Database Instance | +| version | Required | Redis™ engine version of the Database Instance | +| tags.{index} | | Tags to apply to the Database Instance | +| node-type | Required | Type of node to use for the Database Instance | +| user-name | Required | Name of the user created upon Database Instance creation | +| password | Required | Password of the user | +| cluster-size | | Number of nodes in the Redis™ cluster | +| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | +| acl-rules.{index}.description | | Description of the rule | +| endpoints.{index}.private-network.enable-ipam | Default: `false` | Will configure your Private Network endpoint with Scaleway IPAM service if true | +| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | +| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | +| tls-enabled | | Defines whether or not TLS is enabled | +| cluster-settings.{index}.value | | Value of the setting | +| cluster-settings.{index}.name | | Name of the setting | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a Redis™ Database Instance + +Delete a Redis™ Database Instance (Redis™ cluster), specified by the `region` and `cluster_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. + +**Usage:** + +``` +scw redis cluster delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a Redis™ Database Instance + +Retrieve information about a Redis™ Database Instance (Redis™ cluster). Specify the `cluster_id` and `region` in your request to get information such as `id`, `status`, `version`, `tls_enabled`, `cluster_settings`, `upgradable_versions` and `endpoints` about your cluster in the response. + +**Usage:** + +``` +scw redis cluster get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the cluster | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Get the TLS certificate of a cluster + +Retrieve information about the TLS certificate of a Redis™ Database Instance (Redis™ cluster). Details like name and content are returned in the response. + +**Usage:** + +``` +scw redis cluster get-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the cluster | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### List Redis™ Database Instances + +List all Redis™ Database Instances (Redis™ cluster) in the specified zone. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags`, `name`, `organization_id` and `version`. + +**Usage:** + +``` +scw redis cluster list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tags.{index} | | Filter by Database Instance tags | +| name | | Filter by Database Instance names | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | +| project-id | | Filter by Project ID | +| version | | Filter by Redis™ engine version | +| organization-id | | Filter by Organization ID | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Get metrics of a Redis™ Database Instance + +Retrieve the metrics of a Redis™ Database Instance (Redis™ cluster). You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. + +**Usage:** + +``` +scw redis cluster metrics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the cluster | +| start-at | | Start date | +| end-at | | End date | +| metric-name | | Name of the metric to gather | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Scale up a Redis™ Database Instance + +Upgrade your Redis™ Database Instance, either by upgrading to a bigger node type (vertical scaling) or by adding more nodes to your Database Instance to increase your number of endpoints and distribute cache (horizontal scaling, available for clusters only). Note that scaling horizontally your Redis™ Database Instance will not renew its TLS certificate. In order to refresh the TLS certificate, you must use the Renew TLS certificate endpoint. + +**Usage:** + +``` +scw redis cluster migrate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| version | | Redis™ engine version of the Database Instance | +| node-type | | Type of node to use for the Database Instance | +| cluster-size | | Number of nodes for the Database Instance | +| cluster-id | Required | UUID of the Database Instance to update | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Renew the TLS certificate of a cluster + +Renew a TLS certificate for a Redis™ Database Instance (Redis™ cluster). Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. + +**Usage:** + +``` +scw redis cluster renew-certificate [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the cluster | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a Redis™ Database Instance + +Update the parameters of a Redis™ Database Instance (Redis™ cluster), including `name`, `tags`, `user_name` and `password`. + +**Usage:** + +``` +scw redis cluster update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | | Name of the Database Instance | +| tags.{index} | | Database Instance tags | +| user-name | | Name of the Database Instance user | +| password | | Password of the Database Instance user | +| cluster-id | Required | UUID of the Database Instance to update | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Wait for a Redis cluster to reach a stable state + +Wait for a Redis cluster to reach a stable state. This is similar to using --wait flag. + +**Usage:** + +``` +scw redis cluster wait [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | ID of the cluster you want to wait for | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | +| timeout | Default: `15m0s` | Timeout of the wait | + + +**Examples:** + + +Wait for a Redis cluster to reach a stable state +``` +scw redis cluster wait +``` + + + + +## Endpoints management commands + +Manage endpoint access to your Redis™ Database Instance through Public or Private Networks. + + +### Add endpoints for a cluster + +Add a new endpoint for a Redis™ Database Instance (Redis™ cluster). You can add `private_network` or `public_network` specifications to the body of the request. + +**Usage:** + +``` +scw redis endpoint add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance you want to add endpoints to | +| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | +| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an endpoint for a cluster + +Delete the endpoint of a Redis™ Database Instance (Redis™ cluster). You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. + +**Usage:** + +``` +scw redis endpoint delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an endpoint + +Retrieve information about a Redis™ Database Instance (Redis™ cluster) endpoint. Full details about the endpoint, like `ips`, `port`, `private_network` and `public_network` specifications are returned in the response. + +**Usage:** + +``` +scw redis endpoint get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Set endpoints for a cluster + +Update an endpoint for a Redis™ Database Instance (Redis™ cluster). You must specify the `cluster_id` and the `endpoints` parameters in your request. + +**Usage:** + +``` +scw redis endpoint set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance where the endpoints have to be set | +| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | +| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an endpoint + +Update information about a Redis™ Database Instance (Redis™ cluster) endpoint. Full details about the endpoint, like `ips`, `port`, `private_network` and `public_network` specifications are returned in the response. + +**Usage:** + +``` +scw redis endpoint update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| endpoint-id | Required | UUID of the endpoint you want to get | +| private-network.id | | UUID of the Private Network to connect to the Database Instance | +| private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +## Node Types management commands + +Nodes are the compute units that make up your Redis™ Database Instance. Different node types are available with varying amounts of RAM and vCPU. + + +### List available node types + +List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. + +**Usage:** + +``` +scw redis node-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| include-disabled-types | | Defines whether or not to include disabled types | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +## Settings management commands + +Advanced settings allow you to tune the behavior of your Redis™ database engine to better fit your needs. Available settings depend on the version of the Redis™ engine. Note that some settings can only be defined upon the Redis™ engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available Redis™ versions](#path-redistm-engine-versions-list-available-redistm-versions) endpoint. + +Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. + + +### Add advanced settings + +Add an advanced setting to a Redis™ Database Instance (Redis™ cluster). You must set the `name` and the `value` of each setting. + +**Usage:** + +``` +scw redis setting add [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance you want to add settings to | +| settings.{index}.value | | Value of the setting | +| settings.{index}.name | | Name of the setting | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete advanced setting + +Delete an advanced setting in a Redis™ Database Instance (Redis™ cluster). You must specify the names of the settings you want to delete in the request body. + +**Usage:** + +``` +scw redis setting delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance where the settings must be set | +| setting-name | Required | Setting name to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +### Set advanced settings + +Update an advanced setting for a Redis™ Database Instance (Redis™ cluster). Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. + +**Usage:** + +``` +scw redis setting set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| cluster-id | Required | UUID of the Database Instance where the settings must be set | +| settings.{index}.value | | Value of the setting | +| settings.{index}.name | | Name of the setting | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | + + + +## Redis™ version management commands + +The Redis™ database engine versions available at Scaleway for your clusters. + + +### List available Redis™ versions + +List the Redis™ database engine versions available. You can define additional parameters for your query, such as `include_disabled`, `include_beta`, `include_deprecated` and `version`. + +**Usage:** + +``` +scw redis version list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| include-disabled | | Defines whether or not to include disabled Redis™ engine versions | +| include-beta | | Defines whether or not to include beta Redis™ engine versions | +| include-deprecated | | Defines whether or not to include deprecated Redis™ engine versions | +| version | | List Redis™ engine versions that match a given name pattern | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/registry.md b/docs/docs/registry.md new file mode 100644 index 0000000000..b6c0a57f2d --- /dev/null +++ b/docs/docs/registry.md @@ -0,0 +1,381 @@ + +# Documentation for `scw registry` +This API allows you to manage your Container Registry resources. + +- [Image management commands](#image-management-commands) + - [Delete an image](#delete-an-image) + - [Get an image](#get-an-image) + - [List images](#list-images) + - [Update an image](#update-an-image) +- [Install a local Docker credential helper](#install-a-local-docker-credential-helper) +- [Login to a registry](#login-to-a-registry) +- [Logout of a registry](#logout-of-a-registry) +- [Namespace management commands](#namespace-management-commands) + - [Create a namespace](#create-a-namespace) + - [Delete a namespace](#delete-a-namespace) + - [Get a namespace](#get-a-namespace) + - [List namespaces](#list-namespaces) + - [Update a namespace](#update-a-namespace) +- [Tag management commands](#tag-management-commands) + - [Delete a tag](#delete-a-tag) + - [Get a tag](#get-a-tag) + - [List tags](#list-tags) + + +## Image management commands + +An image represents a container image. A container image is a file that includes all the requirements and instructions of a complete and executable version of an application. When running, it becomes one or multiple instances of that application. + +The visibility of an image can be public - when anyone can pull it, private - when only users within your organization can pull it, or inherited from the namespace visibility - which is the default. The visibility of your image can be changed using the [update image endpoit](#path-images-update-an-image). + + +### Delete an image + +Delete a given image. You must specify, in the endpoint, the `region` and `image_id` parameters of the image you want to delete. + +**Usage:** + +``` +scw registry image delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | UUID of the image | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get an image + +Retrieve information about a given container image, specified by its `image_id` and region. Full details about the image, such as `name`, `namespace_id`, `status`, `visibility`, and `size` are returned in the response. + +**Usage:** + +``` +scw registry image get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | UUID of the image | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List images + +List all images in a specified region. By default, the images listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `namespace_id` and `project_id` parameters. + +**Usage:** + +``` +scw registry image list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering image listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | +| namespace-id | | Filter by the namespace ID | +| name | | Filter by the image name (exact match) | +| project-id | | Filter by Project ID | +| organization-id | | Filter by Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update an image + +Update the parameters of a given image, specified by its `image_id` and `region`. You can update the `visibility` parameter. + +**Usage:** + +``` +scw registry image update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| image-id | Required | ID of the image to update | +| visibility | One of: `visibility_unknown`, `inherit`, `public`, `private` | Set to `public` to allow the image to be pulled without authentication. Else, set to `private`. Set to `inherit` to keep the same visibility configuration as the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Install a local Docker credential helper + +This command will install the Docker credential helper for your account. + +It will create a new script named docker-credential-scw. +This script will be called each time Docker needs the credentials and will return the correct credentials. +It avoid running docker login commands. + + +This command will install the Docker credential helper for your account. + +It will create a new script named docker-credential-scw. +This script will be called each time Docker needs the credentials and will return the correct credentials. +It avoid running docker login commands. + + +**Usage:** + +``` +scw registry install-docker-helper [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| path | Default: `/usr/local/bin` | Directory in which the Docker helper will be installed. This directory should be in your $PATH | + + + +## Login to a registry + +This command will run the correct command in order to log you in on the registry with the chosen program. +You will need to have the chosen binary installed on your system and in your PATH. + +This command will run the correct command in order to log you in on the registry with the chosen program. +You will need to have the chosen binary installed on your system and in your PATH. + +**Usage:** + +``` +scw registry login [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| program | Default: `docker`
One of: `docker`, `podman` | Program used to log in to the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Logout of a registry + +This command will run the correct command in order to log you out of the registry with the chosen program. +You will need to have the chosen binary installed on your system and in your PATH. + +This command will run the correct command in order to log you out of the registry with the chosen program. +You will need to have the chosen binary installed on your system and in your PATH. + +**Usage:** + +``` +scw registry logout [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| program | Default: `docker`
One of: `docker`, `podman` | Program used to log in to the namespace | +| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Namespace management commands + +A namespace is a collection of container images, each bearing the unique identifier of that namespace. A namespace can be either public or private, by default. + +Each namespace must have a globally unique name within its region. This means no namespaces in the same region can bear the same name. + +You can use namespace privacy policies to specify whether everyone has the right to pull an image from a namespace or not. When an image is in a public namespace, anyone is able to pull it. You can set your namespace to private if you want to restrict access. + + +### Create a namespace + +Create a new Container Registry namespace. You must specify the namespace name and region in which you want it to be created. Optionally, you can specify the `project_id` and `is_public` in the request payload. + +**Usage:** + +``` +scw registry namespace create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name of the namespace | +| description | | Description of the namespace | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| is-public | | Defines whether or not namespace is public | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a namespace + +Delete a given namespace. You must specify, in the endpoint, the `region` and `namespace_id` parameters of the namespace you want to delete. + +**Usage:** + +``` +scw registry namespace delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a namespace + +Retrieve information about a given namespace, specified by its `namespace_id` and region. Full details about the namespace, such as `description`, `project_id`, `status`, `endpoint`, `is_public`, `size`, and `image_count` are returned in the response. + +**Usage:** + +``` +scw registry namespace get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | UUID of the namespace | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List namespaces + +List all namespaces in a specified region. By default, the namespaces listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `instance_id` and `project_id` parameters. + +**Usage:** + +``` +scw registry namespace list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `description_asc`, `description_desc`, `name_asc`, `name_desc` | Criteria to use when ordering namespace listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | +| project-id | | Filter by Project ID | +| name | | Filter by the namespace name (exact match) | +| organization-id | | Filter by Organization ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a namespace + +Update the parameters of a given namespace, specified by its `namespace_id` and `region`. You can update the `description` and `is_public` parameters. + +**Usage:** + +``` +scw registry namespace update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| namespace-id | Required | ID of the namespace to update | +| description | | Namespace description | +| is-public | | Defines whether or not the namespace is public | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Tag management commands + +Tags allow you to organize your container images. This gives you the possibility of sorting and filtering your images in any organizational pattern of your choice, which in turn helps you arrange, control and monitor your cloud resources. You can assign as many tags as you want to each image. + + +### Delete a tag + +Delete a given image tag. You must specify, in the endpoint, the `region` and `tag_id` parameters of the tag you want to delete. + +**Usage:** + +``` +scw registry tag delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tag-id | Required | UUID of the tag | +| ~~force~~ | Deprecated | If two tags share the same digest the deletion will fail unless this parameter is set to true (deprecated) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a tag + +Retrieve information about a given image tag, specified by its `tag_id` and region. Full details about the tag, such as `name`, `image_id`, `status`, and `digest` are returned in the response. + +**Usage:** + +``` +scw registry tag get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| tag-id | Required | UUID of the tag | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List tags + +List all tags for a given image, specified by region. By default, the tags listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `name`. + +**Usage:** + +``` +scw registry tag list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering tag listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | +| image-id | Required | UUID of the image | +| name | | Filter by the tag name (exact match) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/sdb-sql.md b/docs/docs/sdb-sql.md new file mode 100644 index 0000000000..795122cc8e --- /dev/null +++ b/docs/docs/sdb-sql.md @@ -0,0 +1,220 @@ + +# Documentation for `scw sdb-sql` +This API allows you to manage your Serverless SQL Databases. + +- [](#) + - [Export a database backup](#export-a-database-backup) + - [Get a database backup information](#get-a-database-backup-information) + - [List your Serverless SQL Database backups](#list-your-serverless-sql-database-backups) +- [](#) + - [Create a new Serverless SQL Database](#create-a-new-serverless-sql-database) + - [Delete a database](#delete-a-database) + - [Get a database information](#get-a-database-information) + - [List your Serverless SQL Databases](#list-your-serverless-sql-databases) + - [Restore a database from a backup](#restore-a-database-from-a-backup) + - [Update database information](#update-database-information) + + +## + + + + +### Export a database backup + +Export a database backup providing a download link once the export process is completed. You must provide the `backup_id` parameter. + +**Usage:** + +``` +scw sdb-sql backup export [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-id | Required | UUID of the Serverless SQL Database backup. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a database backup information + +Retrieve information about your Serverless SQL Database backup. You must provide the `backup_id` parameter. + +**Usage:** + +``` +scw sdb-sql backup get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| backup-id | Required | UUID of the Serverless SQL Database backup. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List your Serverless SQL Database backups + +List all Serverless SQL Database backups for a given Scaleway Project or Database. By default, the backups returned in the list are ordered by creation date in descending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw sdb-sql backup list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Filter by the UUID of the Scaleway project. | +| database-id | Required | Filter by the UUID of the Serverless SQL Database. | +| order-by | One of: `created_at_desc`, `created_at_asc` | Sorting criteria. One of `created_at_asc`, `created_at_desc`. | +| organization-id | | Filter by the UUID of the Scaleway organization. | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +## + + + + +### Create a new Serverless SQL Database + +You must provide the following parameters: `organization_id`, `project_id`, `name`, `cpu_min`, `cpu_max`. You can also provide `from_backup_id` to create a database from a backup. + +**Usage:** + +``` +scw sdb-sql database create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Required | The name of the Serverless SQL Database to be created. | +| cpu-min | Required | The minimum number of CPU units for your Serverless SQL Database. | +| cpu-max | Required | The maximum number of CPU units for your Serverless SQL Database. | +| from-backup-id | | The ID of the backup to create the database from. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a database + +Deletes a database. You must provide the `database_id` parameter. All data stored in the database will be permanently deleted. + +**Usage:** + +``` +scw sdb-sql database delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-id | Required | UUID of the Serverless SQL Database. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get a database information + +Retrieve information about your Serverless SQL Database. You must provide the `database_id` parameter. + +**Usage:** + +``` +scw sdb-sql database get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-id | Required | UUID of the Serverless SQL DB database. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List your Serverless SQL Databases + +List all Serverless SQL Databases for a given Scaleway Organization or Scaleway Project. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. + +**Usage:** + +``` +scw sdb-sql database list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Filter by the name of the database | +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sorting criteria. One of `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | +| organization-id | | Filter by the UUID of the Scaleway organization | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Restore a database from a backup + +Restore a database from a backup. You must provide the `backup_id` parameter. + +**Usage:** + +``` +scw sdb-sql database restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-id | Required | UUID of the Serverless SQL Database. | +| backup-id | Required | UUID of the Serverless SQL Database backup to restore. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update database information + +Update CPU limits of your Serverless SQL Database. You must provide the `database_id` parameter. + +**Usage:** + +``` +scw sdb-sql database update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| database-id | Required | UUID of the Serverless SQL Database. | +| cpu-min | | The minimum number of CPU units for your Serverless SQL Database. | +| cpu-max | | The maximum number of CPU units for your Serverless SQL Database. | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/secret.md b/docs/docs/secret.md new file mode 100644 index 0000000000..1ff854044b --- /dev/null +++ b/docs/docs/secret.md @@ -0,0 +1,489 @@ + +# Documentation for `scw secret` +This API allows you to manage your Secret Manager services, for storing, accessing and sharing sensitive data such as passwords, API keys and certificates. + +- [Secret management commands](#secret-management-commands) + - [Allow a product to use the secret](#allow-a-product-to-use-the-secret) + - [Create a secret](#create-a-secret) + - [Delete a secret](#delete-a-secret) + - [Get metadata using the secret's ID](#get-metadata-using-the-secret's-id) + - [List secrets](#list-secrets) + - [Enable secret protection](#enable-secret-protection) + - [Disable secret protection](#disable-secret-protection) + - [Update metadata of a secret](#update-metadata-of-a-secret) +- [Secret Version management commands](#secret-version-management-commands) + - [Access a secret's version using the secret's ID](#access-a-secret's-version-using-the-secret's-id) + - [Access a secret's version using the secret's name and path](#access-a-secret's-version-using-the-secret's-name-and-path) + - [Create a version](#create-a-version) + - [Delete a version](#delete-a-version) + - [Disable a version](#disable-a-version) + - [Enable a version](#enable-a-version) + - [Get metadata of a secret's version using the secret's ID](#get-metadata-of-a-secret's-version-using-the-secret's-id) + - [List versions of a secret using the secret's ID](#list-versions-of-a-secret-using-the-secret's-id) + - [Update metadata of a version](#update-metadata-of-a-version) + + +## Secret management commands + +Secrets are logical containers made up of zero or more immutable versions, that contain sensitive data. + + +### Allow a product to use the secret + +Allow a product to use the secret. + +**Usage:** + +``` +scw secret secret add-owner [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| product | One of: `unknown_product`, `edge_services` | ID of the product to add | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create a secret + +Create a secret in a given region specified by the `region` parameter. + +**Usage:** + +``` +scw secret secret create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name of the secret | +| tags.{index} | | List of the secret's tags | +| description | | Description of the secret | +| type | One of: `unknown_type`, `opaque`, `certificate`, `key_value`, `basic_credentials`, `database_credentials`, `ssh_key` | Type of the secret | +| path | | Path of the secret | +| ephemeral-policy.time-to-live | | Time frame, from one second and up to one year, during which the secret's versions are valid. | +| ephemeral-policy.expires-once-accessed | | Returns `true` if the version expires after a single user access. | +| ephemeral-policy.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | +| protected | | Returns `true` if secret protection is enabled on a given secret | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Create a given secret +``` +scw secret secret create name=foobar description="$(cat )" +``` + + + + +### Delete a secret + +Delete a given secret specified by the `region` and `secret_id` parameters. + +**Usage:** + +``` +scw secret secret delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a given secret +``` +scw secret secret delete 11111111-1111-1111-1111-111111111111 +``` + + + + +### Get metadata using the secret's ID + +Retrieve the metadata of a secret specified by the `region` and `secret_id` parameters. + +**Usage:** + +``` +scw secret secret get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List secrets + +Retrieve the list of secrets created within an Organization and/or Project. You must specify either the `organization_id` or the `project_id` and the `region`. + +**Usage:** + +``` +scw secret secret list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Filter by Project ID (optional) | +| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | | +| tags.{index} | | List of tags to filter on (optional) | +| name | | Filter by secret name (optional) | +| path | | Filter by exact path (optional) | +| ephemeral | | Filter by ephemeral / not ephemeral (optional) | +| type | One of: `unknown_type`, `opaque`, `certificate`, `key_value`, `basic_credentials`, `database_credentials`, `ssh_key` | Filter by secret type (optional) | +| organization-id | | Filter by Organization ID (optional) | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Enable secret protection + +Enable secret protection for a given secret specified by the `secret_id` parameter. Enabling secret protection means that your secret can be read and modified, but it cannot be deleted. + +**Usage:** + +``` +scw secret secret protect [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret to enable secret protection for | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Enable secret protection +``` +scw secret secret protect 11111111-1111-1111-1111-111111111111 +``` + + + + +### Disable secret protection + +Disable secret protection for a given secret specified by the `secret_id` parameter. Disabling secret protection means that your secret can be read, modified and deleted. + +**Usage:** + +``` +scw secret secret unprotect [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret to disable secret protection for | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Disable secret protection +``` +scw secret secret unprotect 11111111-1111-1111-1111-111111111111 +``` + + + + +### Update metadata of a secret + +Edit a secret's metadata such as name, tag(s), description and ephemeral policy. The secret to update is specified by the `secret_id` and `region` parameters. + +**Usage:** + +``` +scw secret secret update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| name | | Secret's updated name (optional) | +| tags.{index} | | Secret's updated list of tags (optional) | +| description | | Description of the secret | +| path | | Path of the folder | +| ephemeral-policy.time-to-live | | Time frame, from one second and up to one year, during which the secret's versions are valid. | +| ephemeral-policy.expires-once-accessed | | Returns `true` if the version expires after a single user access. | +| ephemeral-policy.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Secret Version management commands + +Versions store the sensitive data contained in your secrets (API keys, passwords, or certificates). + + +### Access a secret's version using the secret's ID + +Access sensitive data in a secret's version specified by the `region`, `secret_id` and `revision` parameters. + +**Usage:** + +``` +scw secret version access [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| field | | Return only the JSON field of the given name | +| raw | | Return only the raw payload | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get a raw json value from a secret version +``` +scw secret version access 11111111-1111-1111-111111111111 revision=1 field=key raw=true +``` + + + + +### Access a secret's version using the secret's name and path + +Access sensitive data in a secret's version specified by the `region`, `secret_name`, `secret_path` and `revision` parameters. + +**Usage:** + +``` +scw secret version access-by-path [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-path | | Secret's path | +| secret-name | | Secret's name | +| revision | Required | Version number | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Create a version + +Create a version of a given secret specified by the `region` and `secret_id` parameters. + +**Usage:** + +``` +scw secret version create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| data | Required | Content of the secret version. | +| description | | Description of the version | +| disable-previous | | Disable the previous secret version | +| data-crc32 | | (Optional.) The CRC32 checksum of the data as a base-10 integer | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Create a json secret version +``` +scw secret version create 11111111-1111-1111-111111111111 data={"key":"value"} +``` + + + + +### Delete a version + +Delete a secret's version and the sensitive data contained in it. Deleting a version is permanent and cannot be undone. + +**Usage:** + +``` +scw secret version delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a given Secret Version +``` +scw secret version delete 11111111-1111-1111-1111-111111111111 revision=1 +``` + + + + +### Disable a version + +Make a specific version inaccessible. You must specify the `region`, `secret_id` and `revision` parameters. + +**Usage:** + +``` +scw secret version disable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable a version + +Make a specific version accessible. You must specify the `region`, `secret_id` and `revision` parameters. + +**Usage:** + +``` +scw secret version enable [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get metadata of a secret's version using the secret's ID + +Retrieve the metadata of a secret's given version specified by the `region`, `secret_id` and `revision` parameters. + +**Usage:** + +``` +scw secret version get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List versions of a secret using the secret's ID + +Retrieve the list of a given secret's versions specified by the `secret_id` and `region` parameters. + +**Usage:** + +``` +scw secret version list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| status.{index} | One of: `unknown_status`, `enabled`, `disabled`, `deleted` | Filter results by status | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update metadata of a version + +Edit the metadata of a secret's given version, specified by the `region`, `secret_id` and `revision` parameters. + +**Usage:** + +``` +scw secret version update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| secret-id | Required | ID of the secret | +| revision | Required | Version number | +| description | | Description of the version | +| ephemeral-properties.expires-at | | The version's expiration date | +| ephemeral-properties.expires-once-accessed | | Returns `true` if the version expires after a single user access. | +| ephemeral-properties.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/shell.md b/docs/docs/shell.md new file mode 100644 index 0000000000..ad5bf62a98 --- /dev/null +++ b/docs/docs/shell.md @@ -0,0 +1,6 @@ + +# Documentation for `scw shell` +Start shell mode + + + diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css new file mode 100644 index 0000000000..17e99161ed --- /dev/null +++ b/docs/docs/stylesheets/extra.css @@ -0,0 +1,16 @@ +@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&display=swap'); + +@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap'); + +body { + font-family: "Inter", sans-serif; +} + +li.md-nav__item{ + margin-left: .5rem; +} + +.md-typeset h1, h2, h3, h4, h5, h6{ + font-family: "Space Grotesk", sans-serif; +} + diff --git a/docs/docs/tem.md b/docs/docs/tem.md new file mode 100644 index 0000000000..4270493d6e --- /dev/null +++ b/docs/docs/tem.md @@ -0,0 +1,474 @@ + +# Documentation for `scw tem` +This API allows you to manage your Transactional Email services. + +- [Domain management commands](#domain-management-commands) + - [Domain DNS check](#domain-dns-check) + - [Register a domain in a project](#register-a-domain-in-a-project) + - [Get information about a domain](#get-information-about-a-domain) + - [Display SPF and DKIM records status and potential errors](#display-spf-and-dkim-records-status-and-potential-errors) + - [List domains](#list-domains) + - [Delete a domain](#delete-a-domain) + - [Update a domain](#update-a-domain) +- [Email management commands](#email-management-commands) + - [Cancel an email](#cancel-an-email) + - [Send an email](#send-an-email) + - [Get an email](#get-an-email) + - [Email statuses](#email-statuses) + - [List emails](#list-emails) +- [Project settings management commands](#project-settings-management-commands) +- [Webhook management commands](#webhook-management-commands) + - [Create a Webhook](#create-a-webhook) + - [Delete a Webhook](#delete-a-webhook) + - [Get information about a Webhook](#get-information-about-a-webhook) + - [List Webhooks](#list-webhooks) + - [List Webhook triggered events](#list-webhook-triggered-events) + - [Update a Webhook](#update-a-webhook) + + +## Domain management commands + +This section lists your domains, shows you to manage them, and gives you information about them. + + +### Domain DNS check + +Perform an immediate DNS check of a domain using the `region` and `domain_id` parameters. + +**Usage:** + +``` +scw tem domain check [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | ID of the domain to check | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Register a domain in a project + +You must specify the `region`, `project_id` and `domain_name` to register a domain in a specific Project. + +**Usage:** + +``` +scw tem domain create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| domain-name | | Fully qualified domain dame | +| accept-tos | | Accept Scaleway's Terms of Service | +| autoconfig | | Activate auto-configuration of the domain's DNS zone | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get information about a domain + +Retrieve information about a specific domain using the `region` and `domain_id` parameters. Monitor your domain's reputation and improve **average** and **bad** reputation statuses, using your domain's **Email activity** tab on the [Scaleway console](https://console.scaleway.com/transactional-email/domains) to get a more detailed report. Check out our [dedicated documentation](https://www.scaleway.com/en/docs/managed-services/transactional-email/reference-content/understanding-tem-reputation-score/) to improve your domain's reputation. + +**Usage:** + +``` +scw tem domain get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | ID of the domain | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Display SPF and DKIM records status and potential errors + +Display SPF and DKIM records status and potential errors, including the found records to make debugging easier. + +**Usage:** + +``` +scw tem domain get-last-status [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | ID of the domain to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List domains + +Retrieve domains in a specific Project or in a specific Organization using the `region` parameter. + +**Usage:** + +``` +scw tem domain list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | (Optional) ID of the Project in which to list the domains | +| status.{index} | One of: `unknown`, `checked`, `unchecked`, `invalid`, `locked`, `revoked`, `pending`, `autoconfiguring` | (Optional) List domains under specific statuses | +| name | | (Optional) Names of the domains to list | +| organization-id | | (Optional) ID of the Organization in which to list the domains | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Delete a domain + +You must specify the domain you want to delete by the `region` and `domain_id`. Deleting a domain is permanent and cannot be undone. + +**Usage:** + +``` +scw tem domain revoke [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | ID of the domain to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Update a domain + +Update a domain auto-configuration. + +**Usage:** + +``` +scw tem domain update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | Required | ID of the domain to update | +| autoconfig | | (Optional) If set to true, activate auto-configuration of the domain's DNS zone | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +## Email management commands + +This section lists your emails and shows you how to manage them. + + +### Cancel an email + +You can cancel the sending of an email if it has not been sent yet. You must specify the `region` and the `email_id` of the email you want to cancel. + +**Usage:** + +``` +scw tem email cancel [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| email-id | Required | ID of the email to cancel | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Send an email + +You must specify the `region`, the sender and the recipient's information and the `project_id` to send an email from a checked domain. The subject of the email must contain at least 6 characters. + +**Usage:** + +``` +scw tem email create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| from.email | | Email address | +| from.name | | (Optional) Name displayed | +| to.{index}.email | | Email address | +| to.{index}.name | | (Optional) Name displayed | +| cc.{index}.email | | Email address | +| cc.{index}.name | | (Optional) Name displayed | +| bcc.{index}.email | | Email address | +| bcc.{index}.name | | (Optional) Name displayed | +| subject | | Subject of the email | +| text | | Text content | +| html | | HTML content | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| attachments.{index}.name | | Filename of the attachment | +| attachments.{index}.type | | MIME type of the attachment | +| attachments.{index}.content | | Content of the attachment encoded in base64 | +| send-before | | Maximum date to deliver the email | +| additional-headers.{index}.key | | Email header key | +| additional-headers.{index}.value | | Email header value | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get an email + +Retrieve information about a specific email using the `email_id` and `region` parameters. + +**Usage:** + +``` +scw tem email get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| email-id | Required | ID of the email to retrieve | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Email statuses + +Get information on your emails' statuses. + +**Usage:** + +``` +scw tem email get-statistics [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | (Optional) Number of emails for this Project | +| domain-id | | (Optional) Number of emails sent from this domain (must be coherent with the `project_id` and the `organization_id`) | +| since | | (Optional) Number of emails created after this date | +| until | | (Optional) Number of emails created before this date | +| mail-from | | (Optional) Number of emails sent with this sender's email address | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List emails + +Retrieve the list of emails sent from a specific domain or for a specific Project or Organization. You must specify the `region`. + +**Usage:** + +``` +scw tem email list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | (Optional) ID of the Project in which to list the emails | +| domain-id | | (Optional) ID of the domain for which to list the emails | +| message-id | | (Optional) ID of the message for which to list the emails | +| since | | (Optional) List emails created after this date | +| until | | (Optional) List emails created before this date | +| mail-from | | (Optional) List emails sent with this sender's email address | +| ~~mail-to~~ | Deprecated | List emails sent to this recipient's email address | +| mail-rcpt | | (Optional) List emails sent to this recipient's email address | +| statuses.{index} | One of: `unknown`, `new`, `sending`, `sent`, `failed`, `canceled` | (Optional) List emails with any of these statuses | +| subject | | (Optional) List emails with this subject | +| search | | (Optional) List emails by searching to all fields | +| order-by | One of: `created_at_desc`, `created_at_asc`, `updated_at_desc`, `updated_at_asc`, `status_desc`, `status_asc`, `mail_from_desc`, `mail_from_asc`, `mail_rcpt_desc`, `mail_rcpt_asc`, `subject_desc`, `subject_asc` | (Optional) List emails corresponding to specific criteria | +| flags.{index} | One of: `unknown_flag`, `soft_bounce`, `hard_bounce`, `spam`, `mailbox_full`, `mailbox_not_found`, `greylisted`, `send_before_expiration` | (Optional) List emails containing only specific flags | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Project settings management commands + +Project settings allow you to manage the configuration of your settings. + +Project settings allow you to manage the configuration of your settings. + +**Usage:** + +``` +scw tem project-settings +``` + + + +## Webhook management commands + +Webhooks enable real-time communication and automation between systems by sending messages through all protocols supported by SNS, such as HTTP, HTTPS, and Serverless Functions, allowing for immediate updates and actions based on specific events. This feature is in beta. You can request quotas from the [Scaleway betas page](https://www.scaleway.com/fr/betas/#email-webhooks). + + +### Create a Webhook + +Create a new Webhook triggered by a list of event types and pushed to a Scaleway SNS ARN. + +**Usage:** + +``` +scw tem webhook create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain-id | | ID of the Domain to watch for triggering events | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | | Name of the Webhook | +| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types that will trigger an event | +| sns-arn | | Scaleway SNS ARN topic to push the events to | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Webhook + +You must specify the Webhook you want to delete by the `region` and `webhook_id`. Deleting a Webhook is permanent and cannot be undone. + +**Usage:** + +``` +scw tem webhook delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| webhook-id | Required | ID of the Webhook to delete | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### Get information about a Webhook + +Retrieve information about a specific Webhook using the `webhook_id` and `region` parameters. + +**Usage:** + +``` +scw tem webhook get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| webhook-id | Required | ID of the Webhook to check | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + +### List Webhooks + +Retrieve Webhooks in a specific Project or in a specific Organization using the `region` parameter. + +**Usage:** + +``` +scw tem webhook list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_desc`, `created_at_asc` | (Optional) List Webhooks corresponding to specific criteria | +| project-id | | (Optional) ID of the Project for which to list the Webhooks | +| domain-id | | (Optional) ID of the Domain for which to list the Webhooks | +| organization-id | | (Optional) ID of the Organization for which to list the Webhooks | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### List Webhook triggered events + +Retrieve the list of Webhook events triggered from a specific Webhook or for a specific Project or Organization. You must specify the `region`. + +**Usage:** + +``` +scw tem webhook list-events [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_desc`, `created_at_asc` | (Optional) List Webhook events corresponding to specific criteria | +| webhook-id | Required | ID of the Webhook linked to the events | +| email-id | | ID of the email linked to the events | +| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types linked to the events | +| statuses.{index} | One of: `unknown_status`, `sending`, `sent`, `failed` | List of event statuses | +| project-id | | ID of the webhook Project | +| domain-id | | ID of the domain to watch for triggering events | +| organization-id | | ID of the webhook Organization | +| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update a Webhook + +Update a Webhook events type, SNS ARN or name. + +**Usage:** + +``` +scw tem webhook update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| webhook-id | Required | ID of the Webhook to update | +| name | | Name of the Webhook to update | +| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types to update | +| sns-arn | | Scaleway SNS ARN topic to update | +| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/version.md b/docs/docs/version.md new file mode 100644 index 0000000000..d4bfc94a81 --- /dev/null +++ b/docs/docs/version.md @@ -0,0 +1,6 @@ + +# Documentation for `scw version` +Display cli version + + + diff --git a/docs/docs/vpc-gw.md b/docs/docs/vpc-gw.md new file mode 100644 index 0000000000..d672734595 --- /dev/null +++ b/docs/docs/vpc-gw.md @@ -0,0 +1,909 @@ + +# Documentation for `scw vpc-gw` +This API allows you to manage your Public Gateways. + +- [DHCP configuration management](#dhcp-configuration-management) + - [Create a DHCP configuration](#create-a-dhcp-configuration) + - [Delete a DHCP configuration](#delete-a-dhcp-configuration) + - [Get a DHCP configuration](#get-a-dhcp-configuration) + - [List DHCP configurations](#list-dhcp-configurations) + - [Update a DHCP configuration](#update-a-dhcp-configuration) +- [DHCP entries management](#dhcp-entries-management) + - [Create a DHCP entry](#create-a-dhcp-entry) + - [Delete a DHCP entry](#delete-a-dhcp-entry) + - [Get a DHCP entry](#get-a-dhcp-entry) + - [List DHCP entries](#list-dhcp-entries) + - [Set all DHCP reservations on a Gateway Network](#set-all-dhcp-reservations-on-a-gateway-network) + - [Update a DHCP entry](#update-a-dhcp-entry) +- [Public Gateway management](#public-gateway-management) + - [Create a Public Gateway](#create-a-public-gateway) + - [Delete a Public Gateway](#delete-a-public-gateway) + - [Upgrade a Public Gateway to IP mobility](#upgrade-a-public-gateway-to-ip-mobility) + - [Get a Public Gateway](#get-a-public-gateway) + - [List Public Gateways](#list-public-gateways) + - [Refresh a Public Gateway's SSH keys](#refresh-a-public-gateway's-ssh-keys) + - [Update a Public Gateway](#update-a-public-gateway) + - [Upgrade a Public Gateway to the latest version and/or to a different commercial offer type](#upgrade-a-public-gateway-to-the-latest-version-andor-to-a-different-commercial-offer-type) +- [Gateway Networks management](#gateway-networks-management) + - [Attach a Public Gateway to a Private Network](#attach-a-public-gateway-to-a-private-network) + - [Detach a Public Gateway from a Private Network](#detach-a-public-gateway-from-a-private-network) + - [Get a Public Gateway connection to a Private Network](#get-a-public-gateway-connection-to-a-private-network) + - [List Public Gateway connections to Private Networks](#list-public-gateway-connections-to-private-networks) + - [Update a Public Gateway's connection to a Private Network](#update-a-public-gateway's-connection-to-a-private-network) +- [Gateway types information](#gateway-types-information) + - [List Public Gateway types](#list-public-gateway-types) +- [IP address management](#ip-address-management) + - [Reserve an IP](#reserve-an-ip) + - [Delete an IP](#delete-an-ip) + - [Get an IP](#get-an-ip) + - [List IPs](#list-ips) + - [Update an IP](#update-an-ip) +- [PAT rules management](#pat-rules-management) + - [Create a PAT rule](#create-a-pat-rule) + - [Delete a PAT rule](#delete-a-pat-rule) + - [Get a PAT rule](#get-a-pat-rule) + - [List PAT rules](#list-pat-rules) + - [Set all PAT rules](#set-all-pat-rules) + - [Update a PAT rule](#update-a-pat-rule) + + +## DHCP configuration management + +These objects define a DHCP configuration, i.e. how IP addresses should be assigned to devices on a Private Network attached to a Public Gateway. Definable parameters include the subnet for the DHCP server, the validity period for DHCP entries, whether to use dynamic pooling, and more. A DHCP configuration object has a DHCP ID, which can then be used as part of a call to create or update a Gateway Network. This lets you attach an existing DHCP configuration to a Public Gateway attached to a Private Network. Similarly, you can use a DHCP ID as a query parameter to list Gateway Networks which use this DHCP configuration object. + + +### Create a DHCP configuration + +Create a new DHCP configuration object, containing settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. The response object includes the ID of the DHCP configuration object. You can use this ID as part of a call to `Create a Public Gateway connection to a Private Network` or `Update a Public Gateway connection to a Private Network` to directly apply this DHCP configuration. + +**Usage:** + +``` +scw vpc-gw dhcp create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| subnet | Required | Subnet for the DHCP server | +| address | | IP address of the DHCP server. This will be the gateway's address in the Private Network. Defaults to the first address of the subnet | +| pool-low | | Low IP (inclusive) of the dynamic address pool. Must be in the config's subnet. Defaults to the second address of the subnet | +| pool-high | | High IP (inclusive) of the dynamic address pool. Must be in the config's subnet. Defaults to the last address of the subnet | +| enable-dynamic | | Defines whether to enable dynamic pooling of IPs. When false, only pre-existing DHCP reservations will be handed out. Defaults to true | +| valid-lifetime | | How long DHCP entries will be valid for. Defaults to 1h (3600s) | +| renew-timer | | After how long a renew will be attempted. Must be 30s lower than `rebind_timer`. Defaults to 50m (3000s) | +| rebind-timer | | After how long a DHCP client will query for a new lease if previous renews fail. Must be 30s lower than `valid_lifetime`. Defaults to 51m (3060s) | +| push-default-route | | Defines whether the gateway should push a default route to DHCP clients or only hand out IPs. Defaults to true | +| push-dns-server | | Defines whether the gateway should push custom DNS servers to clients. This allows for Instance hostname -> IP resolution. Defaults to true | +| dns-servers-override.{index} | | Array of DNS server IP addresses used to override the DNS server list pushed to DHCP clients, instead of the gateway itself | +| dns-search.{index} | | Array of search paths in addition to the pushed DNS configuration | +| dns-local-name | | TLD given to hostnames in the Private Network. Allowed characters are `a-z0-9-.`. Defaults to the slugified Private Network name if created along a GatewayNetwork, or else to `priv` | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a DHCP configuration + +Delete a DHCP configuration object, identified by its DHCP ID. Note that you cannot delete a DHCP configuration object that is currently being used by a Gateway Network. + +**Usage:** + +``` +scw vpc-gw dhcp delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-id | Required | DHCP configuration ID to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a DHCP configuration + +Get a DHCP configuration object, identified by its DHCP ID. The response object contains configuration settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. Note that the response does not contain the IDs of any Private Network / Public Gateway the configuration is attached to. Use the `List Public Gateway connections to Private Networks` method for that purpose, filtering on DHCP ID. + +**Usage:** + +``` +scw vpc-gw dhcp get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-id | Required | ID of the DHCP configuration to fetch | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List DHCP configurations + +List DHCP configurations, optionally filtering by Organization, Project, Public Gateway IP address or more. The response is an array of DHCP configuration objects, each identified by a DHCP ID and containing configuration settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. Note that the response does not contain the IDs of any Private Network / Public Gateway the configuration is attached to. Use the `List Public Gateway connections to Private Networks` method for that purpose, filtering on DHCP ID. + +**Usage:** + +``` +scw vpc-gw dhcp list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `subnet_asc`, `subnet_desc` | Order in which to return results | +| project-id | | Include only DHCP configuration objects in this Project | +| address | | Filter for DHCP configuration objects with this DHCP server IP address (the gateway's address in the Private Network) | +| has-address | | Filter for DHCP configuration objects with subnets containing this IP address | +| organization-id | | Include only DHCP configuration objects in this Organization | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a DHCP configuration + +Update a DHCP configuration object, identified by its DHCP ID. + +**Usage:** + +``` +scw vpc-gw dhcp update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-id | Required | DHCP configuration to update | +| subnet | | Subnet for the DHCP server | +| address | | IP address of the DHCP server. This will be the Public Gateway's address in the Private Network. It must be part of config's subnet | +| pool-low | | Low IP (inclusive) of the dynamic address pool. Must be in the config's subnet | +| pool-high | | High IP (inclusive) of the dynamic address pool. Must be in the config's subnet | +| enable-dynamic | | Defines whether to enable dynamic pooling of IPs. When false, only pre-existing DHCP reservations will be handed out. Defaults to true | +| valid-lifetime | | How long DHCP entries will be valid for | +| renew-timer | | After how long a renew will be attempted. Must be 30s lower than `rebind_timer` | +| rebind-timer | | After how long a DHCP client will query for a new lease if previous renews fail. Must be 30s lower than `valid_lifetime` | +| push-default-route | | Defines whether the gateway should push a default route to DHCP clients, or only hand out IPs | +| push-dns-server | | Defines whether the gateway should push custom DNS servers to clients. This allows for instance hostname -> IP resolution | +| dns-servers-override.{index} | | Array of DNS server IP addresses used to override the DNS server list pushed to DHCP clients, instead of the gateway itself | +| dns-search.{index} | | Array of search paths in addition to the pushed DNS configuration | +| dns-local-name | | TLD given to hostnames in the Private Networks. If an instance with hostname `foo` gets a lease, and this is set to `bar`, `foo.bar` will resolve. Allowed characters are `a-z0-9-.` | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## DHCP entries management + +DHCP entries belong to a specified Gateway Network (Public Gateway / Private Network connection). A DHCP entry can hold either a dynamic DHCP lease (an IP address dynamically assigned by the Public Gateway to a device) or a static, user-created DHCP reservation. + + +### Create a DHCP entry + +Create a static DHCP reservation, specifying the Gateway Network for the reservation, the MAC address of the target device and the IP address to assign this device. The response is a DHCP entry object, confirming the ID and configuration details of the static DHCP reservation. + +**Usage:** + +``` +scw vpc-gw dhcp-entry create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-network-id | | GatewayNetwork on which to create a DHCP reservation | +| mac-address | | MAC address to give a static entry to | +| ip-address | | IP address to give to the device | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a DHCP entry + +Delete a static DHCP reservation, identified by its DHCP entry ID. Note that you cannot delete DHCP entries of type `lease`, these are deleted automatically when their time-to-live expires. + +**Usage:** + +``` +scw vpc-gw dhcp-entry delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-entry-id | Required | ID of the DHCP entry to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a DHCP entry + +Get a DHCP entry, specified by its DHCP entry ID. + +**Usage:** + +``` +scw vpc-gw dhcp-entry get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-entry-id | Required | ID of the DHCP entry to fetch | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List DHCP entries + +List DHCP entries, whether dynamically assigned and/or statically reserved. DHCP entries can be filtered by the Gateway Network they are on, their MAC address, IP address, type or hostname. + +**Usage:** + +``` +scw vpc-gw dhcp-entry list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `ip_address_asc`, `ip_address_desc`, `hostname_asc`, `hostname_desc` | Order in which to return results | +| gateway-network-id | | Filter for entries on this GatewayNetwork | +| mac-address | | Filter for entries with this MAC address | +| ip-address | | Filter for entries with this IP address | +| hostname | | Filter for entries with this hostname substring | +| type | One of: `unknown`, `reservation`, `lease` | Filter for entries of this type | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Set all DHCP reservations on a Gateway Network + +Set the list of DHCP reservations attached to a Gateway Network. Reservations are identified by their MAC address, and will sync the current DHCP entry list to the given list, creating, updating or deleting DHCP entries accordingly. + +**Usage:** + +``` +scw vpc-gw dhcp-entry set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-network-id | | ID of the Gateway Network on which to set DHCP reservation list | +| dhcp-entries.{index}.mac-address | | MAC address to give a static entry to | +| dhcp-entries.{index}.ip-address | | IP address to give to the device | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a DHCP entry + +Update the IP address for a DHCP entry, specified by its DHCP entry ID. You can update an existing DHCP entry of any type (`reservation` (static), `lease` (dynamic) or `unknown`), but in manually updating the IP address the entry will necessarily be of type `reservation` after the update. + +**Usage:** + +``` +scw vpc-gw dhcp-entry update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| dhcp-entry-id | Required | ID of the DHCP entry to update | +| ip-address | | New IP address to give to the device | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Public Gateway management + +Public Gateways are building blocks for your infrastructure on Scaleway's shared public cloud. They provide a set of managed network services and features for Scaleway's Private Networks such as DHCP, NAT and routing. + + +### Create a Public Gateway + +Create a new Public Gateway in the specified Scaleway Project, defining its **name**, **type** and other configuration details such as whether to enable SSH bastion. + +**Usage:** + +``` +scw vpc-gw gateway create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| name | Default: `` | Name for the gateway | +| tags.{index} | | Tags for the gateway | +| type | Default: `VPC-GW-S` | Gateway type (commercial offer type) | +| upstream-dns-servers.{index} | | Array of DNS server IP addresses to override the gateway's default recursive DNS servers | +| ip-id | | Existing IP address to attach to the gateway | +| enable-smtp | | Defines whether SMTP traffic should be allowed pass through the gateway | +| enable-bastion | | Defines whether SSH bastion should be enabled the gateway | +| bastion-port | | Port of the SSH bastion | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a Public Gateway + +Delete an existing Public Gateway, specified by its gateway ID. This action is irreversible. + +**Usage:** + +``` +scw vpc-gw gateway delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to delete | +| cleanup-dhcp | | Defines whether to clean up attached DHCP configurations (if any, and if not attached to another Gateway Network) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Upgrade a Public Gateway to IP mobility + +Upgrade a Public Gateway to IP mobility (move from NAT IP to routed IP). This is idempotent: repeated calls after the first will return no error but have no effect. + +**Usage:** + +``` +scw vpc-gw gateway enable-ip-mobility [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to upgrade to IP mobility | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a Public Gateway + +Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. + +**Usage:** + +``` +scw vpc-gw gateway get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to fetch | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List Public Gateways + +List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. + +**Usage:** + +``` +scw vpc-gw gateway list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `type_asc`, `type_desc`, `status_asc`, `status_desc` | Order in which to return results | +| project-id | | Include only gateways in this Project | +| name | | Filter for gateways which have this search term in their name | +| tags.{index} | | Filter for gateways with these tags | +| type | | Filter for gateways of this type | +| status | One of: `unknown`, `stopped`, `allocating`, `configuring`, `running`, `stopping`, `failed`, `deleting`, `deleted`, `locked` | Filter for gateways with this current status. Use `unknown` to include all statuses | +| private-network-id | | Filter for gateways attached to this Private nNetwork | +| organization-id | | Include only gateways in this Organization | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Refresh a Public Gateway's SSH keys + +Refresh the SSH keys of a given Public Gateway, specified by its gateway ID. This adds any new SSH keys in the gateway's Scaleway Project to the gateway itself. + +**Usage:** + +``` +scw vpc-gw gateway refresh-ssh-keys [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to refresh SSH keys on | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a Public Gateway + +Update the parameters of an existing Public Gateway, for example, its **name**, **tags**, **SSH bastion configuration**, and **DNS servers**. + +**Usage:** + +``` +scw vpc-gw gateway update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to update | +| name | | Name for the gateway | +| tags.{index} | | Tags for the gateway | +| upstream-dns-servers.{index} | | Array of DNS server IP addresses to override the gateway's default recursive DNS servers | +| enable-bastion | | Defines whether SSH bastion should be enabled the gateway | +| bastion-port | | Port of the SSH bastion | +| enable-smtp | | Defines whether SMTP traffic should be allowed to pass through the gateway | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Upgrade a Public Gateway to the latest version and/or to a different commercial offer type + +Upgrade a given Public Gateway to the newest software version or to a different commercial offer type. This applies the latest bugfixes and features to your Public Gateway. Note that gateway service will be interrupted during the update. + +**Usage:** + +``` +scw vpc-gw gateway upgrade [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | Required | ID of the gateway to upgrade | +| type | | Gateway type (commercial offer) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Gateway Networks management + +A Gateway Network represents the connection of a Private Network to a Public Gateway. It holds configuration options relative to this specific connection, such as the DHCP configuration. + + +### Attach a Public Gateway to a Private Network + +Attach a specific Public Gateway to a specific Private Network (create a GatewayNetwork). You can configure parameters for the connection including DHCP settings, whether to enable masquerade (dynamic NAT), and more. + +**Usage:** + +``` +scw vpc-gw gateway-network create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | | Public Gateway to connect | +| private-network-id | | Private Network to connect | +| enable-masquerade | | Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. | +| enable-dhcp | | Defines whether to enable DHCP on this Private Network. | +| dhcp-id | | ID of an existing DHCP configuration object to use for this GatewayNetwork | +| address | | Static IP address in CIDR format to to use without DHCP | +| ipam-config.push-default-route | | Enabling the default route also enables masquerading | +| ipam-config.ipam-ip-id | | Use this IPAM-booked IP ID as the Gateway's IP in this Private Network | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Detach a Public Gateway from a Private Network + +Detach a given Public Gateway from a given Private Network, i.e. delete a GatewayNetwork specified by a gateway_network_id. + +**Usage:** + +``` +scw vpc-gw gateway-network delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-network-id | Required | ID of the GatewayNetwork to delete | +| cleanup-dhcp | | Defines whether to clean up attached DHCP configurations (if any, and if not attached to another Gateway Network) | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a Public Gateway connection to a Private Network + +Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. + +**Usage:** + +``` +scw vpc-gw gateway-network get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-network-id | Required | ID of the GatewayNetwork to fetch | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List Public Gateway connections to Private Networks + +List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. + +**Usage:** + +``` +scw vpc-gw gateway-network list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `status_asc`, `status_desc` | Order in which to return results | +| gateway-id | | Filter for GatewayNetworks connected to this gateway | +| private-network-id | | Filter for GatewayNetworks connected to this Private Network | +| enable-masquerade | | Filter for GatewayNetworks with this `enable_masquerade` setting | +| dhcp-id | | Filter for GatewayNetworks using this DHCP configuration | +| status | One of: `unknown`, `created`, `attaching`, `configuring`, `ready`, `detaching`, `deleted` | Filter for GatewayNetworks with this current status this status. Use `unknown` to include all statuses | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a Public Gateway's connection to a Private Network + +Update the configuration parameters of a connection between a given Public Gateway and Private Network (the connection = a GatewayNetwork). Updatable parameters include DHCP settings and whether to enable traffic masquerade (dynamic NAT). + +**Usage:** + +``` +scw vpc-gw gateway-network update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-network-id | Required | ID of the GatewayNetwork to update | +| enable-masquerade | | Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. | +| enable-dhcp | | Defines whether to enable DHCP on this Private Network. | +| dhcp-id | | ID of the new DHCP configuration object to use with this GatewayNetwork | +| address | | New static IP address | +| ipam-config.push-default-route | | Enabling the default route also enables masquerading | +| ipam-config.ipam-ip-id | | Use this IPAM-booked IP ID as the Gateway's IP in this Private Network | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## Gateway types information + +Public Gateways come in various shapes, sizes and prices, which are described by gateway types. They represent the different commercial offer types for Public Gateways available at Scaleway. + + +### List Public Gateway types + +List the different Public Gateway commercial offer types available at Scaleway. The response is an array of objects describing the name and technical details of each available gateway type. + +**Usage:** + +``` +scw vpc-gw gateway-type list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## IP address management + +Public, flexible IP addresses for Public Gateways, allowing the gateway to reach the public internet, as well as forward (masquerade) traffic from member devices of attached Private Networks. + + +### Reserve an IP + +Create (reserve) a new flexible IP address that can be used for a Public Gateway in a specified Scaleway Project. + +**Usage:** + +``` +scw vpc-gw ip create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags to give to the IP address | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete an IP + +Delete a flexible IP address from your account. This action is irreversible. + +**Usage:** + +``` +scw vpc-gw ip delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the IP address to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get an IP + +Get details of a Public Gateway flexible IP address, identified by its IP ID. The response object contains information including which (if any) Public Gateway using this IP address, the reverse and various other metadata. + +**Usage:** + +``` +scw vpc-gw ip get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the IP address to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List IPs + +List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. + +**Usage:** + +``` +scw vpc-gw ip list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `ip_asc`, `ip_desc`, `reverse_asc`, `reverse_desc` | Order in which to return results | +| project-id | | Filter for IP addresses in this Project | +| tags.{index} | | Filter for IP addresses with these tags | +| reverse | | Filter for IP addresses that have a reverse containing this string | +| is-free | | Filter based on whether the IP is attached to a gateway or not | +| organization-id | | Filter for IP addresses in this Organization | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Update an IP + +Update details of an existing flexible IP address, including its tags, reverse and the Public Gateway it is assigned to. + +**Usage:** + +``` +scw vpc-gw ip update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| ip-id | Required | ID of the IP address to update | +| tags.{index} | | Tags to give to the IP address | +| reverse | | Reverse to set on the address. Empty string to unset | +| gateway-id | | Gateway to attach the IP address to. Empty string to detach | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +## PAT rules management + +PAT (Port Address Translation) rules, aka static NAT rules, belong to a specified Public Gateway. They define the forwarding of a public port to a specific device on a Private Network, enabling enables ingress traffic from the public Internet to reach the correct device in the Private Network. + + +### Create a PAT rule + +Create a new PAT rule on a specified Public Gateway, defining the protocol to use, public port to listen on, and private port / IP address to map to. + +**Usage:** + +``` +scw vpc-gw pat-rule create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | | ID of the Gateway on which to create the rule | +| public-port | | Public port to listen on | +| private-ip | | Private IP to forward data to | +| private-port | | Private port to translate to | +| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Delete a PAT rule + +Delete a PAT rule, identified by its PAT rule ID. This action is irreversible. + +**Usage:** + +``` +scw vpc-gw pat-rule delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pat-rule-id | Required | ID of the PAT rule to delete | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Get a PAT rule + +Get a PAT rule, specified by its PAT rule ID. The response object gives full details of the PAT rule, including the Public Gateway it belongs to and the configuration settings in terms of public / private ports, private IP and protocol. + +**Usage:** + +``` +scw vpc-gw pat-rule get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pat-rule-id | Required | ID of the PAT rule to get | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### List PAT rules + +List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. + +**Usage:** + +``` +scw vpc-gw pat-rule list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `public_port_asc`, `public_port_desc` | Order in which to return results | +| gateway-id | | Filter for PAT rules on this Gateway | +| private-ip | | Filter for PAT rules targeting this private ip | +| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Filter for PAT rules with this protocol | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | + + + +### Set all PAT rules + +Set a definitive list of PAT rules attached to a Public Gateway. Each rule is identified by its public port and protocol. This will sync the current PAT rule list on the gateway with the new list, creating, updating or deleting PAT rules accordingly. + +**Usage:** + +``` +scw vpc-gw pat-rule set [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| gateway-id | | ID of the gateway on which to set the PAT rules | +| pat-rules.{index}.public-port | | Public port to listen on | +| pat-rules.{index}.private-ip | | Private IP to forward data to | +| pat-rules.{index}.private-port | | Private port to translate to | +| pat-rules.{index}.protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + +### Update a PAT rule + +Update a PAT rule, specified by its PAT rule ID. Configuration settings including private/public port, private IP address and protocol can all be updated. + +**Usage:** + +``` +scw vpc-gw pat-rule update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| pat-rule-id | Required | ID of the PAT rule to update | +| public-port | | Public port to listen on | +| private-ip | | Private IP to forward data to | +| private-port | | Private port to translate to | +| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | +| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | + + + diff --git a/docs/docs/vpc.md b/docs/docs/vpc.md new file mode 100644 index 0000000000..5141adc9f4 --- /dev/null +++ b/docs/docs/vpc.md @@ -0,0 +1,465 @@ + +# Documentation for `scw vpc` +This API allows you to manage your Virtual Private Clouds (VPCs) and Private Networks. + +- [Private network management command](#private-network-management-command) + - [Create a Private Network](#create-a-private-network) + - [Delete a Private Network](#delete-a-private-network) + - [Enable DHCP on a Private Network](#enable-dhcp-on-a-private-network) + - [Get a Private Network](#get-a-private-network) + - [List Private Networks](#list-private-networks) + - [Migrate Private Networks from zoned to regional](#migrate-private-networks-from-zoned-to-regional) + - [Update Private Network](#update-private-network) +- [Route management command](#route-management-command) + - [Create a Route](#create-a-route) + - [Delete a Route](#delete-a-route) + - [Enable routing on a VPC](#enable-routing-on-a-vpc) + - [Get a Route](#get-a-route) + - [Return routes with associated next hop data](#return-routes-with-associated-next-hop-data) + - [Update Route](#update-route) +- [Subnet management command](#subnet-management-command) +- [VPC management command](#vpc-management-command) + - [Create a VPC](#create-a-vpc) + - [Delete a VPC](#delete-a-vpc) + - [Get a VPC](#get-a-vpc) + - [List VPCs](#list-vpcs) + - [Update VPC](#update-vpc) + + +## Private network management command + +A Private Network allows you to interconnect your Scaleway resources +in an isolated and private network. Network reachability is limited +to resources that are on the same Private Network. Note that a +resource can be a part of multiple private networks. + + +### Create a Private Network + +Create a new Private Network. Once created, you can attach Scaleway resources which are in the same region. + +**Usage:** + +``` +scw vpc private-network create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name for the Private Network | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags for the Private Network | +| subnets.{index} | | Private Network subnets CIDR | +| vpc-id | | VPC in which to create the Private Network | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Private Network + +Delete an existing Private Network. Note that you must first detach all resources from the network, in order to delete it. + +**Usage:** + +``` +scw vpc private-network delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| private-network-id | Required | Private Network ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable DHCP on a Private Network + +Enable DHCP managed on an existing Private Network. Note that you will not be able to deactivate it afterwards. + +**Usage:** + +``` +scw vpc private-network enable-dhcp [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| private-network-id | Required | Private Network ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Private Network + +Retrieve information about an existing Private Network, specified by its Private Network ID. Its full details are returned in the response object. + +**Usage:** + +``` +scw vpc private-network get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| private-network-id | Required | Private Network ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List Private Networks + +List existing Private Networks in the specified region. By default, the Private Networks returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. + +**Usage:** + +``` +scw vpc private-network list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned Private Networks | +| name | | Name to filter for. Only Private Networks with names containing this string will be returned | +| tags.{index} | | Tags to filter for. Only Private Networks with one or more matching tags will be returned | +| project-id | | Project ID to filter for. Only Private Networks belonging to this Project will be returned | +| private-network-ids.{index} | | Private Network IDs to filter for. Only Private Networks with one of these IDs will be returned | +| vpc-id | | VPC ID to filter for. Only Private Networks belonging to this VPC will be returned | +| dhcp-enabled | | DHCP status to filter for. When true, only Private Networks with managed DHCP enabled will be returned | +| organization-id | | Organization ID to filter for. Only Private Networks belonging to this Organization will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Migrate Private Networks from zoned to regional + +Transform multiple existing zoned Private Networks (scoped to a single Availability Zone) into regional Private Networks, scoped to an entire region. You can transform one or many Private Networks (specified by their Private Network IDs) within a single Scaleway Organization or Project, with the same call. + +**Usage:** + +``` +scw vpc private-network migrate-to-regional [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| private-network-ids.{index} | Required | IDs of the Private Networks to migrate | +| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Update Private Network + +Update parameters (such as name or tags) of an existing Private Network, specified by its Private Network ID. + +**Usage:** + +``` +scw vpc private-network update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| private-network-id | Required | Private Network ID | +| name | | Name for the Private Network | +| tags.{index} | | Tags for the Private Network | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Route management command + +Custom routes. + + +### Create a Route + +Create a new custom Route. + +**Usage:** + +``` +scw vpc route create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| description | | Route description | +| tags.{index} | | Tags of the Route | +| vpc-id | | VPC the Route belongs to | +| destination | | Destination of the Route | +| nexthop-resource-id | | ID of the nexthop resource | +| nexthop-private-network-id | | ID of the nexthop private network | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Route + +Delete a Route specified by its Route ID. + +**Usage:** + +``` +scw vpc route delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Enable routing on a VPC + +Enable routing on an existing VPC. Note that you will not be able to deactivate it afterwards. + +**Usage:** + +``` +scw vpc route enable-routing [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| vpc-id | Required | VPC ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a Route + +Retrieve details of an existing Route, specified by its Route ID. + +**Usage:** + +``` +scw vpc route get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Return routes with associated next hop data + +Return routes with associated next hop data. + +**Usage:** + +``` +scw vpc route list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `destination_asc`, `destination_desc`, `prefix_len_asc`, `prefix_len_desc` | Sort order of the returned routes | +| vpc-id | | VPC to filter for. Only routes within this VPC will be returned | +| nexthop-resource-id | | Next hop resource ID to filter for. Only routes with a matching next hop resource ID will be returned | +| nexthop-private-network-id | | Next hop private network ID to filter for. Only routes with a matching next hop private network ID will be returned | +| nexthop-resource-type | One of: `unknown_type`, `vpc_gateway_network`, `instance_private_nic`, `baremetal_private_nic` | Next hop resource type to filter for. Only Routes with a matching next hop resource type will be returned | +| contains | | Only routes whose destination is contained in this subnet will be returned | +| tags.{index} | | Tags to filter for, only routes with one or more matching tags will be returned | +| is-ipv6 | | Only routes with an IPv6 destination will be returned | +| region | Default: `fr-par`
One of: `all` | Region to target. If none is passed will use default region from the config | + + + +### Update Route + +Update parameters of the specified Route. + +**Usage:** + +``` +scw vpc route update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| route-id | Required | Route ID | +| description | | Route description | +| tags.{index} | | Tags of the Route | +| destination | | Destination of the Route | +| nexthop-resource-id | | ID of the nexthop resource | +| nexthop-private-network-id | | ID of the nexthop private network | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +## Subnet management command + +CIDR Subnet. + +CIDR Subnet. + +**Usage:** + +``` +scw vpc subnet +``` + + + +## VPC management command + +A Virtual Private Cloud (VPC) allows you to group your regional +Private Networks together. Note that a Private Network can be a +part of only one VPC. + + +### Create a VPC + +Create a new VPC in the specified region. + +**Usage:** + +``` +scw vpc vpc create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| name | Required
Default: `` | Name for the VPC | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| tags.{index} | | Tags for the VPC | +| enable-routing | | Enable routing between Private Networks in the VPC | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Delete a VPC + +Delete a VPC specified by its VPC ID. + +**Usage:** + +``` +scw vpc vpc delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| vpc-id | Required | VPC ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### Get a VPC + +Retrieve details of an existing VPC, specified by its VPC ID. + +**Usage:** + +``` +scw vpc vpc get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| vpc-id | Required | VPC ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + +### List VPCs + +List existing VPCs in the specified region. + +**Usage:** + +``` +scw vpc vpc list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned VPCs | +| name | | Name to filter for. Only VPCs with names containing this string will be returned | +| tags.{index} | | Tags to filter for. Only VPCs with one more more matching tags will be returned | +| project-id | | Project ID to filter for. Only VPCs belonging to this Project will be returned | +| is-default | | Defines whether to filter only for VPCs which are the default one for their Project | +| routing-enabled | | Defines whether to filter only for VPCs which route traffic between their Private Networks | +| organization-id | | Organization ID to filter for. Only VPCs belonging to this Organization will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | + + + +### Update VPC + +Update parameters including name and tags of the specified VPC. + +**Usage:** + +``` +scw vpc vpc update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| vpc-id | Required | VPC ID | +| name | | Name for the VPC | +| tags.{index} | | Tags for the VPC | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | + + + diff --git a/docs/docs/webhosting.md b/docs/docs/webhosting.md new file mode 100644 index 0000000000..1d6a76da08 --- /dev/null +++ b/docs/docs/webhosting.md @@ -0,0 +1,348 @@ + +# Documentation for `scw webhosting` +This API allows you to manage your Web Hosting services. + +- [Control Panels](#control-panels) + - ["List the control panels type: cpanel or plesk."](#"list-the-control-panels-type:-cpanel-or-plesk.") +- [Hosting management commands](#hosting-management-commands) + - [Order a Web Hosting plan](#order-a-web-hosting-plan) + - [Create a user session](#create-a-user-session) + - [Delete a Web Hosting plan](#delete-a-web-hosting-plan) + - [Get a Web Hosting plan](#get-a-web-hosting-plan) + - [Get DNS records](#get-dns-records) + - [List all Web Hosting plans](#list-all-web-hosting-plans) + - [Restore a Web Hosting plan](#restore-a-web-hosting-plan) + - [Update a Web Hosting plan](#update-a-web-hosting-plan) +- [Offer management commands](#offer-management-commands) + - [List all offers](#list-all-offers) + + +## Control Panels + +Control panels represent the kind of administration panel to manage your Web Hosting plan, cPanel or plesk. + + +### "List the control panels type: cpanel or plesk." + +"List the control panels type: cpanel or plesk.". + +**Usage:** + +``` +scw webhosting control-panel list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + + +## Hosting management commands + +With a Scaleway Web Hosting plan, you can manage your domain, configure your web hosting services, manage your emails and more. Create, list, update and delete your Web Hosting plans with these calls. + + +### Order a Web Hosting plan + +Order a Web Hosting plan, specifying the offer type required via the `offer_id` parameter. + +**Usage:** + +``` +scw webhosting hosting create [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| offer-id | | ID of the selected offer for the Web Hosting plan | +| project-id | | Project ID to use. If none is passed the default project ID will be used | +| email | | Contact email for the Web Hosting client | +| tags.{index} | | List of tags for the Web Hosting plan | +| domain | | Domain name to link to the Web Hosting plan. You must already own this domain name, and have completed the DNS validation process beforehand | +| option-ids.{index} | | IDs of any selected additional options for the Web Hosting plan | +| language | One of: `unknown_language_code`, `en_US`, `fr_FR`, `de_DE` | Default language for the control panel interface | +| domain-configuration.update-nameservers | | | +| domain-configuration.update-web-record | | | +| domain-configuration.update-mail-record | | | +| domain-configuration.update-all-records | | | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Create a user session + +Create a user session. + +**Usage:** + +``` +scw webhosting hosting create-session [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hosting-id | Required | Hosting ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + + +### Delete a Web Hosting plan + +Delete a Web Hosting plan, specified by its `hosting_id`. Note that deletion is not immediate: it will take place at the end of the calendar month, after which time your Web Hosting plan and all its data (files and emails) will be irreversibly lost. + +**Usage:** + +``` +scw webhosting hosting delete [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hosting-id | Required | Hosting ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Delete a Hosting with the given ID +``` +scw webhosting hosting delete hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + + + + +### Get a Web Hosting plan + +Get the details of one of your existing Web Hosting plans, specified by its `hosting_id`. + +**Usage:** + +``` +scw webhosting hosting get [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hosting-id | Required | Hosting ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get a Hosting with the given ID +``` +scw webhosting hosting get hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + + + + +### Get DNS records + +Get the set of DNS records of a specified domain associated with a Web Hosting plan. + +**Usage:** + +``` +scw webhosting hosting get-dns-records [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| domain | Required | Domain associated with the DNS records | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Get DNS records associated to the given domain +``` +scw webhosting hosting get-dns-records domain=foo.com +``` + + + + +### List all Web Hosting plans + +List all of your existing Web Hosting plans. Various filters are available to limit the results, including filtering by domain, status, tag and Project ID. + +**Usage:** + +``` +scw webhosting hosting list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for Web Hosting plans in the response | +| tags.{index} | | Tags to filter for, only Web Hosting plans with matching tags will be returned | +| statuses.{index} | One of: `unknown_status`, `delivering`, `ready`, `deleting`, `error`, `locked`, `migrating` | Statuses to filter for, only Web Hosting plans with matching statuses will be returned | +| domain | | Domain to filter for, only Web Hosting plans associated with this domain will be returned | +| project-id | | Project ID to filter for, only Web Hosting plans from this Project will be returned | +| control-panels.{index} | | Name of the control panel to filter for, only Web Hosting plans from this control panel will be returned | +| organization-id | | Organization ID to filter for, only Web Hosting plans from this Organization will be returned | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all hostings of a given project ID +``` +scw webhosting hosting list project-id=a3244331-5d32-4e36-9bf9-b60233e201c7 organization-id=a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + + + + +### Restore a Web Hosting plan + +When you [delete a Web Hosting plan](#path-hostings-delete-a-hosting), definitive deletion does not take place until the end of the calendar month. In the time between initiating the deletion, and definitive deletion at the end of the month, you can choose to **restore** the Web Hosting plan, using this endpoint and specifying its `hosting_id`. + +**Usage:** + +``` +scw webhosting hosting restore [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hosting-id | Required | Hosting ID | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Restore a Hosting with the given ID +``` +scw webhosting hosting restore hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + + + + +### Update a Web Hosting plan + +Update the details of one of your existing Web Hosting plans, specified by its `hosting_id`. You can update parameters including the contact email address, tags, options and offer. + +**Usage:** + +``` +scw webhosting hosting update [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| hosting-id | Required | Hosting ID | +| email | | New contact email for the Web Hosting plan | +| tags.{index} | | New tags for the Web Hosting plan | +| option-ids.{index} | | IDs of the new options for the Web Hosting plan | +| offer-id | | ID of the new offer for the Web Hosting plan | +| protected | | Whether the hosting is protected or not | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +Update the contact email of a given hosting +``` +scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 email=foobar@example.com +``` + +Overwrite tags of a given hosting +``` +scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar +``` + +Overwrite options of a given hosting +``` +scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 option-ids.0=22222222-2222-2222-2222-222222222222 option-ids.1=33333333-3333-3333-3333-333333333333 +``` + + + + +## Offer management commands + +Web Hosting offers represent the different types of Web Hosting plan available to order at Scaleway. + + +### List all offers + +List the different Web Hosting offers, and their options, available to order from Scaleway. + +**Usage:** + +``` +scw webhosting offer list [arg=value ...] +``` + + +**Args:** + +| Name | | Description | +|------|---|-------------| +| order-by | One of: `price_asc` | Sort order of offers in the response | +| without-options | | Defines whether the response should consist of offers only, without options | +| only-options | | Defines whether the response should consist of options only, without offers | +| hosting-id | | ID of a Web Hosting plan, to check compatibility with returned offers (in case of wanting to update the plan) | +| control-panels.{index} | | Name of the control panel to filter for | +| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | + + +**Examples:** + + +List all offers available for purchase +``` +scw webhosting offer list hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 +``` + +List only offers, no options +``` +scw webhosting offer list without-options=true +``` + +List only options +``` +scw webhosting offer list only-options=true +``` + + + + diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 71e2cc611e..7465eb5872 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -3,7 +3,6 @@ site_url: https://mydomain.org/scaleway-cli-documentation extra_css: - stylesheets/extra.css extra: - # Versioning tool version: provider: mike @@ -37,7 +36,7 @@ theme: icon: repo: fontawesome/brands/github name: material - logo: assets/logo.png + logo: assets/logo.svg font: text: Inter palette: @@ -56,18 +55,20 @@ theme: toggle: icon: material/toggle-switch-off-outline name: Switch to light mode - features: + features: + - navigation.sections # Creates sections in left menu (default is collapsible block) - content.code.copy # Enable Copy button on code blocks - content.action.edit # Enable "Edit content" button on page - content.action.view # Enable "View source" button on page - - navigation.sections # Creates sections in left menu - navigation.top # Enables back to top button - - navigation.expand # Auto expands collapsible left menu entries - navigation.tracking # Automatically adds anchors to URL - search.suggest # Add suggestions to search - markdown_extensions: - - attr_list - - md_in_html + + +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences nav: - Platform: @@ -77,7 +78,7 @@ nav: - Secret Manager: secret.md - Marketplace: marketplace.md - AI & Data: - - Managed Inference: llm-inference.md + - Managed Inference: inference.md - Bare Metal: - Elastic Metal: baremetal.md - Apple Silicon: apple-silicon.md From c53f6bddbc7a73de4c5601d36d0713d8688431e1 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Fri, 20 Sep 2024 13:10:25 +0200 Subject: [PATCH 05/19] feat(docs): clean up and document conf and actions --- docs/docs/account.md | 119 -- docs/docs/alias.md | 103 - docs/docs/apple-silicon.md | 319 --- docs/docs/assets/cli-artwork.png | Bin 102270 -> 0 bytes docs/docs/assets/logo.png | Bin 2724 -> 0 bytes docs/docs/assets/logo.svg | 1 - docs/docs/autocomplete.md | 52 - docs/docs/baremetal.md | 948 --------- docs/docs/billing.md | 184 -- docs/docs/block.md | 304 --- docs/docs/cli-artwork.png | Bin 102270 -> 0 bytes docs/docs/cockpit.md | 725 ------- docs/docs/config.md | 310 --- docs/docs/container.md | 764 ------- docs/docs/dedibox.md | 2130 -------------------- docs/docs/dns.md | 746 ------- docs/docs/document-db.md | 1217 ----------- docs/docs/edge-services.md | 669 ------ docs/docs/feedback.md | 36 - docs/docs/fip.md | 267 --- docs/docs/function.md | 819 -------- docs/docs/help.md | 248 --- docs/docs/iam.md | 1149 ----------- docs/docs/index.md | 149 -- docs/docs/inference.md | 401 ---- docs/docs/info.md | 6 - docs/docs/init.md | 12 - docs/docs/instance.md | 3247 ------------------------------ docs/docs/iot.md | 727 ------- docs/docs/ipam.md | 169 -- docs/docs/ipfs.md | 284 --- docs/docs/ipns.md | 169 -- docs/docs/jobs.md | 258 --- docs/docs/k8s.md | 1248 ------------ docs/docs/keymanager.md | 309 --- docs/docs/lb.md | 1447 ------------- docs/docs/login.md | 9 - docs/docs/marketplace.md | 192 -- docs/docs/mnq.md | 607 ------ docs/docs/object.md | 213 -- docs/docs/rdb.md | 1674 --------------- docs/docs/redis.md | 607 ------ docs/docs/registry.md | 381 ---- docs/docs/sdb-sql.md | 220 -- docs/docs/secret.md | 489 ----- docs/docs/shell.md | 6 - docs/docs/stylesheets/extra.css | 16 - docs/docs/tem.md | 474 ----- docs/docs/version.md | 6 - docs/docs/vpc-gw.md | 909 --------- docs/docs/vpc.md | 465 ----- docs/docs/webhosting.md | 348 ---- 52 files changed, 26152 deletions(-) delete mode 100644 docs/docs/account.md delete mode 100644 docs/docs/alias.md delete mode 100644 docs/docs/apple-silicon.md delete mode 100644 docs/docs/assets/cli-artwork.png delete mode 100644 docs/docs/assets/logo.png delete mode 100644 docs/docs/assets/logo.svg delete mode 100644 docs/docs/autocomplete.md delete mode 100644 docs/docs/baremetal.md delete mode 100644 docs/docs/billing.md delete mode 100644 docs/docs/block.md delete mode 100644 docs/docs/cli-artwork.png delete mode 100644 docs/docs/cockpit.md delete mode 100644 docs/docs/config.md delete mode 100644 docs/docs/container.md delete mode 100644 docs/docs/dedibox.md delete mode 100644 docs/docs/dns.md delete mode 100644 docs/docs/document-db.md delete mode 100644 docs/docs/edge-services.md delete mode 100644 docs/docs/feedback.md delete mode 100644 docs/docs/fip.md delete mode 100644 docs/docs/function.md delete mode 100644 docs/docs/help.md delete mode 100644 docs/docs/iam.md delete mode 100644 docs/docs/index.md delete mode 100644 docs/docs/inference.md delete mode 100644 docs/docs/info.md delete mode 100644 docs/docs/init.md delete mode 100644 docs/docs/instance.md delete mode 100644 docs/docs/iot.md delete mode 100644 docs/docs/ipam.md delete mode 100644 docs/docs/ipfs.md delete mode 100644 docs/docs/ipns.md delete mode 100644 docs/docs/jobs.md delete mode 100644 docs/docs/k8s.md delete mode 100644 docs/docs/keymanager.md delete mode 100644 docs/docs/lb.md delete mode 100644 docs/docs/login.md delete mode 100644 docs/docs/marketplace.md delete mode 100644 docs/docs/mnq.md delete mode 100644 docs/docs/object.md delete mode 100644 docs/docs/rdb.md delete mode 100644 docs/docs/redis.md delete mode 100644 docs/docs/registry.md delete mode 100644 docs/docs/sdb-sql.md delete mode 100644 docs/docs/secret.md delete mode 100644 docs/docs/shell.md delete mode 100644 docs/docs/stylesheets/extra.css delete mode 100644 docs/docs/tem.md delete mode 100644 docs/docs/version.md delete mode 100644 docs/docs/vpc-gw.md delete mode 100644 docs/docs/vpc.md delete mode 100644 docs/docs/webhosting.md diff --git a/docs/docs/account.md b/docs/docs/account.md deleted file mode 100644 index ee0402c7ad..0000000000 --- a/docs/docs/account.md +++ /dev/null @@ -1,119 +0,0 @@ - -# Documentation for `scw account` -This API allows you to manage your Scaleway Projects. - -- [Project management commands](#project-management-commands) - - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) - - [Delete an existing Project](#delete-an-existing-project) - - [Get an existing Project](#get-an-existing-project) - - [List all Projects of an Organization](#list-all-projects-of-an-organization) - - [Update Project](#update-project) - - -## Project management commands - -Project management commands. - - -### Create a new Project for an Organization - -Generate a new Project for an Organization, specifying its configuration including name and description. - -**Usage:** - -``` -scw account project create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the Project | -| description | | Description of the Project | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Delete an existing Project - -Delete an existing Project, specified by its Project ID. The Project needs to be empty (meaning there are no resources left in it) to be deleted effectively. Note that deleting a Project is permanent, and cannot be undone. - -**Usage:** - -``` -scw account project delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Get an existing Project - -Retrieve information about an existing Project, specified by its Project ID. Its full details, including ID, name and description, are returned in the response object. - -**Usage:** - -``` -scw account project get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### List all Projects of an Organization - -List all Projects of an Organization. The response will include the total number of Projects as well as their associated Organizations, names, and IDs. Other information includes the creation and update date of the Project. - -**Usage:** - -``` -scw account project list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the Project | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned Projects | -| project-ids.{index} | | Project IDs to filter for. The results will be limited to any Projects with an ID in this array | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Update Project - -Update the parameters of an existing Project, specified by its Project ID. These parameters include the name and description. - -**Usage:** - -``` -scw account project update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name of the Project | -| description | | Description of the Project | - - - diff --git a/docs/docs/alias.md b/docs/docs/alias.md deleted file mode 100644 index 744359aac2..0000000000 --- a/docs/docs/alias.md +++ /dev/null @@ -1,103 +0,0 @@ - -# Documentation for `scw alias` -This namespace allows you to manage your aliases -Aliases are store in cli config file, Default path for this configuration file is based on the following priority order: - -- $SCW_CLI_CONFIG_PATH -- $XDG_CONFIG_HOME/scw/cli.yaml -- $HOME/.config/scw/cli.yaml -- $USERPROFILE/.config/scw/cli.yaml - -You can use multiple aliases in one command -aliases in your commands are evaluated and you get completion - with: isl = instance server list - "scw isl " will complete as "scw instance server list " - "scw " will complete "isl" - - -- [Create a new alias for a command](#create-a-new-alias-for-a-command) -- [Delete an alias](#delete-an-alias) -- [List aliases and their commands](#list-aliases-and-their-commands) - - -## Create a new alias for a command - -This command help you create aliases and save it to your config - -This command help you create aliases and save it to your config - -**Usage:** - -``` -scw alias create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| alias | Required | Alias name | -| command | | Command to create an alias for | - - -**Examples:** - - -Create a custom alias 'isl' for 'instance server list' -``` -scw alias create isl command="instance server list"" -``` - -Add an alias to a verb -``` -scw alias create c command=create -``` - - - - -## Delete an alias - - - - - -**Usage:** - -``` -scw alias delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| alias | | alias name | - - - -## List aliases and their commands - - - - - -**Usage:** - -``` -scw alias list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `command_asc`
One of: `command_asc`, `command_desc`, `alias_asc`, `alias_desc` | | -| command | | filter command | -| alias | | filter alias | - - - diff --git a/docs/docs/apple-silicon.md b/docs/docs/apple-silicon.md deleted file mode 100644 index 67b8cf05f7..0000000000 --- a/docs/docs/apple-silicon.md +++ /dev/null @@ -1,319 +0,0 @@ - -# Documentation for `scw apple-silicon` -Apple silicon API. - -- [OS management commands](#os-management-commands) - - [Get an Operating System (OS)](#get-an-operating-system-(os)) - - [List all Operating Systems (OS)](#list-all-operating-systems-(os)) -- [Apple silicon management commands](#apple-silicon-management-commands) - - [Create a server](#create-a-server) - - [Delete a server](#delete-a-server) - - [Get a server](#get-a-server) - - [List all servers](#list-all-servers) - - [Reboot a server](#reboot-a-server) - - [Reinstall a server](#reinstall-a-server) - - [SSH into a server](#ssh-into-a-server) - - [Update a server](#update-a-server) - - [Wait for a server to reach a stable state](#wait-for-a-server-to-reach-a-stable-state) -- [Server-Types management commands](#server-types-management-commands) - - [Get a server type](#get-a-server-type) - - [List server types](#list-server-types) - - -## OS management commands - -OS management commands. - - -### Get an Operating System (OS) - -Get an Operating System (OS). The response will include the OS's unique ID as well as its name and label. - -**Usage:** - -``` -scw apple-silicon os get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| os-id | Required | UUID of the OS you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all Operating Systems (OS) - -List all Operating Systems (OS). The response will include the total number of OS as well as their associated IDs, names and labels. - -**Usage:** - -``` -scw apple-silicon os list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-type | | List of compatible server types | -| name | | Filter OS by name (note that "11.1" will return "11.1.2" and "11.1" but not "12")) | -| zone | Default: `fr-par-1`
One of: `fr-par-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Apple silicon management commands - -Apple silicon management commands. - - -### Create a server - -Create a new server in the targeted zone, specifying its configuration including name and type. - -**Usage:** - -``` -scw apple-silicon server create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Create a server with this given name | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| type | | Create a server of the given type | -| os-id | | Create a server with the given os_id | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a server - -Delete an existing Apple silicon server, specified by its server ID. Deleting a server is permanent, and cannot be undone. Note that the minimum allocation period for Apple silicon-as-a-service is 24 hours, meaning you cannot delete your server prior to that. - -**Usage:** - -``` -scw apple-silicon server delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a server - -Retrieve information about an existing Apple silicon server, specified by its server ID. Its full details, including name, status and IP address, are returned in the response object. - -**Usage:** - -``` -scw apple-silicon server get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all servers - -List all servers in the specified zone. By default, returned servers in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw apple-silicon server list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned servers | -| project-id | | Only list servers of this project ID | -| organization-id | | Only list servers of this Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Reboot a server - -Reboot an existing Apple silicon server, specified by its server ID. - -**Usage:** - -``` -scw apple-silicon server reboot [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server you want to reboot | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Reinstall a server - -Reinstall an existing Apple silicon server (specified by its server ID) from a new image (OS). All the data on the disk is deleted and all configuration is reset to the defailt configuration values of the image (OS). - -**Usage:** - -``` -scw apple-silicon server reinstall [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server you want to reinstall | -| os-id | | Reinstall the server with the OS corresponding to the os_id | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### SSH into a server - -Connect to distant server via the SSH protocol. - -**Usage:** - -``` -scw apple-silicon server ssh [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to SSH into | -| username | Default: `m1` | Username used for the SSH connection | -| port | Default: `22` | Port used for the SSH connection | -| command | | Command to execute on the remote server | -| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a server - -Update the parameters of an existing Apple silicon server, specified by its server ID. - -**Usage:** - -``` -scw apple-silicon server update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server you want to update | -| name | Required | Updated name for your server | -| schedule-deletion | | Specify whether the server should be flagged for automatic deletion | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for a server to reach a stable state - -Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. - -**Usage:** - -``` -scw apple-silicon server wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server. | -| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `1h0m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a server to reach a stable state -``` -scw apple-silicon server wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Server-Types management commands - -Server-Types management commands. - - -### Get a server type - -Get technical details (CPU, disk size etc.) of a server type. - -**Usage:** - -``` -scw apple-silicon server-type get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-type | Required | Server type identifier | -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List server types - -List all technical details about Apple silicon server types available in the specified zone. Since there is only one Availability Zone for Apple silicon servers, the targeted value is `fr-par-3`. - -**Usage:** - -``` -scw apple-silicon server-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-3` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/assets/cli-artwork.png b/docs/docs/assets/cli-artwork.png deleted file mode 100644 index 7f7e5a6fe11a8257e8e92ee4cf67a5cbb54a7699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102270 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

)piKZY<_h|cN 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%0AmX1-z`$-5L)>o#g!U>4 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

;V}uCJe2OZ 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 p3$5je-m>0v82fedzW@FbjcjC2f4_Tg \ No newline at end of file diff --git a/docs/docs/autocomplete.md b/docs/docs/autocomplete.md deleted file mode 100644 index 95f1777fb1..0000000000 --- a/docs/docs/autocomplete.md +++ /dev/null @@ -1,52 +0,0 @@ - -# Documentation for `scw autocomplete` -Autocomplete related commands - -- [Install autocomplete script](#install-autocomplete-script) -- [Show autocomplete script for current shell](#show-autocomplete-script-for-current-shell) - - -## Install autocomplete script - -Install autocomplete script for a given shell and OS. - -Install autocomplete script for a given shell and OS. - -**Usage:** - -``` -scw autocomplete install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| shell | | | -| basename | Default: `` | | - - - -## Show autocomplete script for current shell - -Show autocomplete script for current shell. - -Show autocomplete script for current shell. - -**Usage:** - -``` -scw autocomplete script [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| shell | Default: `/bin/bash` | | -| basename | Default: `` | | - - - diff --git a/docs/docs/baremetal.md b/docs/docs/baremetal.md deleted file mode 100644 index 266c2eb5f6..0000000000 --- a/docs/docs/baremetal.md +++ /dev/null @@ -1,948 +0,0 @@ - -# Documentation for `scw baremetal` -Elastic Metal API. - -- [Baseboard Management Controller (BMC) management commands](#baseboard-management-controller-(bmc)-management-commands) - - [Get BMC access](#get-bmc-access) - - [Start BMC access](#start-bmc-access) - - [Stop BMC access](#stop-bmc-access) -- [Server offer management commands](#server-offer-management-commands) - - [Get offer](#get-offer) - - [List offers](#list-offers) -- [Server options management commands](#server-options-management-commands) - - [Add server option](#add-server-option) - - [Delete server option](#delete-server-option) - - [Get option](#get-option) - - [List options](#list-options) -- [Operating System (OS) management commands](#operating-system-(os)-management-commands) - - [Get OS with an ID](#get-os-with-an-id) - - [List available OSes](#list-available-oses) -- [Private Network management command](#private-network-management-command) - - [Add a server to a Private Network](#add-a-server-to-a-private-network) - - [Delete a Private Network](#delete-a-private-network) - - [List the Private Networks of a server](#list-the-private-networks-of-a-server) - - [Set multiple Private Networks on a server](#set-multiple-private-networks-on-a-server) -- [Server management commands](#server-management-commands) - - [Attach a new flexible IP to a server](#attach-a-new-flexible-ip-to-a-server) - - [Create an Elastic Metal server](#create-an-elastic-metal-server) - - [Delete an Elastic Metal server](#delete-an-elastic-metal-server) - - [Get a specific Elastic Metal server](#get-a-specific-elastic-metal-server) - - [Return server metrics](#return-server-metrics) - - [Install an Elastic Metal server](#install-an-elastic-metal-server) - - [List Elastic Metal servers for an Organization](#list-elastic-metal-servers-for-an-organization) - - [List server events](#list-server-events) - - [Reboot an Elastic Metal server](#reboot-an-elastic-metal-server) - - [Start an Elastic Metal server](#start-an-elastic-metal-server) - - [Stop an Elastic Metal server](#stop-an-elastic-metal-server) - - [Update an Elastic Metal server](#update-an-elastic-metal-server) - - [Update IP](#update-ip) - - [Wait for a server to reach a stable state (delivery and installation)](#wait-for-a-server-to-reach-a-stable-state-(delivery-and-installation)) -- [Settings management commands](#settings-management-commands) - - [List all settings](#list-all-settings) - - [Update setting](#update-setting) - - -## Baseboard Management Controller (BMC) management commands - -A Baseboard Management Controller (BMC) allows you to remotely access the low-level parameters of your dedicated server. -For instance, your KVM-IP management console could be accessed with it. -You need first to create an Remote Access option. You will find the ID and the price with a call to listOffers (https://developers.scaleway.com/en/products/baremetal/api/#get-78db92). Then you can add the option https://developers.scaleway.com/en/products/baremetal/api/#post-b14abd. Do not forget to delete the Option. -Then you need to create Remote Access https://developers.scaleway.com/en/products/baremetal/api/#post-1af723. -And finally Get Remote Access to get the login/password https://developers.scaleway.com/en/products/baremetal/api/#get-cefc0f. - - -### Get BMC access - -Get the BMC (Baseboard Management Controller) access associated with the ID, including the URL and login information needed to connect. - -**Usage:** - -``` -scw baremetal bmc get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Start BMC access - -Start BMC (Baseboard Management Controller) access associated with the ID. -The BMC (Baseboard Management Controller) access is available one hour after the installation of the server. -You need first to create an option Remote Access. You will find the ID and the price with a call to listOffers (https://developers.scaleway.com/en/products/baremetal/api/#get-78db92). Then add the option https://developers.scaleway.com/en/products/baremetal/api/#post-b14abd. -After adding the BMC option, you need to Get Remote Access to get the login/password https://developers.scaleway.com/en/products/baremetal/api/#get-cefc0f. Do not forget to delete the Option after use. - -**Usage:** - -``` -scw baremetal bmc start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| ip | Required | The IP authorized to connect to the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Stop BMC access - -Stop BMC (Baseboard Management Controller) access associated with the ID. - -**Usage:** - -``` -scw baremetal bmc stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Server offer management commands - -Server offers will answer with all different Elastic Metal server ranges available in a zone. -Each of them will contain all the features of the server (CPUs, memory, disks) with their associated pricing. - - -### Get offer - -Get details of an offer identified by its offer ID. - -**Usage:** - -``` -scw baremetal offer get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | Required | ID of the researched Offer | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a server offer with the ID -``` -scw baremetal offer get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### List offers - -List all available Elastic Metal server configurations. - -**Usage:** - -``` -scw baremetal offer list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| subscription-period | One of: `unknown_subscription_period`, `hourly`, `monthly` | Subscription period type to filter offers by | -| name | | Offer name to filter offers by | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all server offers in the default zone -``` -scw baremetal offer list -``` - -List all server offers in fr-par-1 zone -``` -scw baremetal offer list zone=fr-par-1 -``` - - - - -## Server options management commands - -A Server has additional options that let you personalize it to better fit your needs. - - -### Add server option - -Add an option, such as Private Networks, to a specific server. - -**Usage:** - -``` -scw baremetal options add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| option-id | Required | ID of the option to add | -| expires-at | | Auto expire the option after this date | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Add an option, such as Private Networks, to a server -``` -scw baremetal options add server-id=11111111-1111-1111-1111-111111111111 option-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### Delete server option - -Delete an option from a specific server. - -**Usage:** - -``` -scw baremetal options delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| option-id | Required | ID of the option to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete an option from a server -``` -scw baremetal options delete server-id=11111111-1111-1111-1111-111111111111 option-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### Get option - -Return specific option for the ID. - -**Usage:** - -``` -scw baremetal options get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| option-id | Required | ID of the option | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a server option with the ID -``` -scw baremetal options get zone=fr-par-1 option-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### List options - -List all options matching with filters. - -**Usage:** - -``` -scw baremetal options list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | | Offer ID to filter options for | -| name | | Name to filter options for | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all server options in the default zone -``` -scw baremetal options list -``` - -List all server options in fr-par-1 zone -``` -scw baremetal options list zone=fr-par-1 -``` - - - - -## Operating System (OS) management commands - -An Operating System (OS) is the underlying software installed on your server. - - -### Get OS with an ID - -Return the specific OS for the ID. - -**Usage:** - -``` -scw baremetal os get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| os-id | Required | ID of the OS | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a specific OS ID -``` -scw baremetal os get -``` - - - - -### List available OSes - -List all OSes that are available for installation on Elastic Metal servers. - -**Usage:** - -``` -scw baremetal os list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | | Offer IDs to filter OSes for | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Private Network management command - -A Private Network allows you to interconnect your resources -(servers, instances, ...) in an isolated and private -network. The network reachability is limited to the -resources that are on the same Private Network . A VLAN -interface is available on the server and can be freely -managed (adding IP addresses, shutdown interface...). - -Note that a resource can be a part of multiple Private Networks. - - -### Add a server to a Private Network - -Add a server to a Private Network. - -**Usage:** - -``` -scw baremetal private-network add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | The ID of the server | -| private-network-id | Required | The ID of the Private Network | -| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a Private Network - -Delete a Private Network. - -**Usage:** - -``` -scw baremetal private-network delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | The ID of the server | -| private-network-id | Required | The ID of the Private Network | -| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | - - - -### List the Private Networks of a server - -List the Private Networks of a server. - -**Usage:** - -``` -scw baremetal private-network list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | The sort order for the returned Private Networks | -| server-id | | Filter Private Networks by server ID | -| private-network-id | | Filter Private Networks by Private Network ID | -| project-id | | Filter Private Networks by Project ID | -| organization-id | | Filter Private Networks by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-2`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Set multiple Private Networks on a server - -Set multiple Private Networks on a server. - -**Usage:** - -``` -scw baremetal private-network set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | The ID of the server | -| private-network-ids.{index} | Required | The IDs of the Private Networks | -| zone | Default: `fr-par-1`
One of: `fr-par-2` | Zone to target. If none is passed will use default zone from the config | - - - -## Server management commands - -A server is a denomination of a type of instances provided by Scaleway. - - -### Attach a new flexible IP to a server - -Create and attach a new flexible IP to a server - -**Usage:** - -``` -scw baremetal server add-flexible-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to which the newly created flexible IP will be attached. | -| description | | Flexible IP description (max. of 255 characters) | -| ip-type | One of: `IPv4`, `IPv6` | Define whether the flexible IP is an IPv4 or IPv6 | -| tags.{index} | | Tags to associate to the flexible IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Create an Elastic Metal server - -Create a new Elastic Metal server. Once the server is created, proceed with the [installation of an OS](#post-3e949e). - -**Usage:** - -``` -scw baremetal server create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Required
Default: `` | Name of the server (≠hostname) | -| description | | Description associated with the server, max 255 characters | -| type | | Server commercial type | -| tags.{index} | | Tags to associate to the server | -| install.os-id | | ID of the OS to installation on the server | -| install.hostname | | Hostname of the server | -| install.ssh-key-ids.{index} | | SSH key IDs authorized on the server | -| install.user | | User for the installation | -| install.password | | Password for the installation | -| install.service-user | | Regular user that runs the service to be installed on the server | -| install.service-password | | Password used for the service to install | -| option-ids.{index} | | IDs of options to enable on server | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create instance -``` -scw baremetal server create -``` - - - - -### Delete an Elastic Metal server - -Delete the server associated with the ID. - -**Usage:** - -``` -scw baremetal server delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete an Elastic Metal server -``` -scw baremetal server delete 11111111-1111-1111-1111-111111111111 -``` - - - - -### Get a specific Elastic Metal server - -Get full details of an existing Elastic Metal server associated with the ID. - -**Usage:** - -``` -scw baremetal server get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a specific server -``` -scw baremetal server get 11111111-1111-1111-1111-111111111111 -``` - - - - -### Return server metrics - -Get the ping status of the server associated with the ID. - -**Usage:** - -``` -scw baremetal server get-metrics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to get the metrics | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Install an Elastic Metal server - -Install an Operating System (OS) on the Elastic Metal server with a specific ID. - -**Usage:** - -``` -scw baremetal server install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to install | -| os-id | Required | ID of the OS to installation on the server | -| hostname | Required | Hostname of the server | -| all-ssh-keys | | Add all SSH keys on your baremetal instance (cannot be used with ssh-key-ids) | -| ssh-key-ids.{index} | Required | SSH key IDs authorized on the server (cannot be used with all-ssh-keys) | -| user | | User used for the installation | -| password | | Password used for the installation | -| service-user | | User used for the service to install | -| service-password | | Password used for the service to install | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Install an OS on a server with a particular SSH key ID -``` -scw baremetal server install 11111111-1111-1111-1111-111111111111 os-id=11111111-1111-1111-1111-111111111111 ssh-key-ids.0=11111111-1111-1111-1111-111111111111 -``` - - - - -### List Elastic Metal servers for an Organization - -List Elastic Metal servers for a specific Organization. - -**Usage:** - -``` -scw baremetal server list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | -| tags.{index} | | Tags to filter for | -| status.{index} | | Status to filter for | -| name | | Names to filter for | -| project-id | | Project ID to filter for | -| option-id | | Option ID to filter for | -| organization-id | | Organization ID to filter for | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all servers in your default zone -``` -scw baremetal server list -``` - - - - -### List server events - -List event (i.e. start/stop/reboot) associated to the server ID. - -**Usage:** - -``` -scw baremetal server list-events [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server events searched | -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server events | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Reboot an Elastic Metal server - -Reboot the Elastic Metal server associated with the ID, use the `boot_type` `rescue` to reboot the server in rescue mode. - -**Usage:** - -``` -scw baremetal server reboot [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to reboot | -| boot-type | Default: `normal`
One of: `unknown_boot_type`, `normal`, `rescue` | The type of boot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Reboot a server using the same os -``` -scw baremetal server reboot 11111111-1111-1111-1111-111111111111 -``` - -Reboot a server in rescue mode -``` -scw baremetal server reboot 11111111-1111-1111-1111-111111111111 boot-type=rescue -``` - - - - -### Start an Elastic Metal server - -Start the server associated with the ID. - -**Usage:** - -``` -scw baremetal server start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to start | -| boot-type | One of: `unknown_boot_type`, `normal`, `rescue` | The type of boot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Start an Elastic Metalx server -``` -scw baremetal server start 11111111-1111-1111-1111-111111111111 -``` - -Start a server in rescue mode -``` -scw baremetal server start 11111111-1111-1111-1111-111111111111 boot-type=rescue -``` - - - - -### Stop an Elastic Metal server - -Stop the server associated with the ID. The server remains allocated to your account and all data remains on the local storage of the server. - -**Usage:** - -``` -scw baremetal server stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to stop | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Stop an Elastic Metal server -``` -scw baremetal server stop 11111111-1111-1111-1111-111111111111 -``` - - - - -### Update an Elastic Metal server - -Update the server associated with the ID. You can update parameters such as the server's name, tags and description. Any parameters left null in the request body are not updated. - -**Usage:** - -``` -scw baremetal server update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to update | -| name | | Name of the server (≠hostname), not updated if null | -| description | | Description associated with the server, max 255 characters, not updated if null | -| tags.{index} | | Tags associated with the server, not updated if null | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update IP - -Configure the IP address associated with the server ID and IP ID. You can use this method to set a reverse DNS for an IP address. - -**Usage:** - -``` -scw baremetal server update-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| ip-id | Required | ID of the IP to update | -| reverse | | New reverse IP to update, not updated if null | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for a server to reach a stable state (delivery and installation) - -Wait for a server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. - -**Usage:** - -``` -scw baremetal server wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `20m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a server to reach a stable state -``` -scw baremetal server wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Settings management commands - -Allows to configure the general settings for your Elastic Metal server. - - -### List all settings - -Return all settings for a Project ID. - -**Usage:** - -``` -scw baremetal settings list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for items in the response | -| project-id | Required | ID of the Project | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update setting - -Update a setting for a Project ID (enable or disable). - -**Usage:** - -``` -scw baremetal settings update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| setting-id | Required | ID of the setting | -| enabled | | Defines whether the setting is enabled | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/billing.md b/docs/docs/billing.md deleted file mode 100644 index 4433f022ae..0000000000 --- a/docs/docs/billing.md +++ /dev/null @@ -1,184 +0,0 @@ - -# Documentation for `scw billing` -This API allows you to manage and query your Scaleway billing and consumption. - -- [Consumption management commands](#consumption-management-commands) - - [Get monthly consumption](#get-monthly-consumption) - - [Get monthly consumption taxes](#get-monthly-consumption-taxes) -- [Discount management commands](#discount-management-commands) - - [List discounts](#list-discounts) -- [Invoice management commands](#invoice-management-commands) - - [Download an invoice](#download-an-invoice) - - [Export invoices](#export-invoices) - - [Get an invoice](#get-an-invoice) - - [List invoices](#list-invoices) - - -## Consumption management commands - -Consumption management commands. - - -### Get monthly consumption - -Consumption allows you to retrieve your past or current consumption cost, by project or category. - -**Usage:** - -``` -scw billing consumption list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `updated_at_desc`, `updated_at_asc`, `category_name_desc`, `category_name_asc` | Order consumptions list in the response by their update date | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| category-name | | Filter by name of a Category as they are shown in the invoice (Compute, Network, Observability) | -| billing-period | | Filter by the billing period in the YYYY-MM format. If it is empty the current billing period will be used as default | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Get monthly consumption taxes - -Consumption Tax allows you to retrieve your past or current tax charges, by project or category. - -**Usage:** - -``` -scw billing consumption list-taxes [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `updated_at_desc`, `updated_at_asc`, `category_name_desc`, `category_name_asc` | Order consumed taxes list in the response by their update date | -| billing-period | | Filter by the billing period in the YYYY-MM format. If it is empty the current billing period will be used as default | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -## Discount management commands - -Discount management commands. - - -### List discounts - -List all discounts for your organization and usable categories, products, offers, references, regions and zones where the discount can be applied. - -**Usage:** - -``` -scw billing discount list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `creation_date_desc`, `creation_date_asc` | Order discounts in the response by their description | -| organization-id | | ID of the organization | - - - -## Invoice management commands - -Invoice management commands. - - -### Download an invoice - -Download a specific invoice, specified by its ID. - -**Usage:** - -``` -scw billing invoice download [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| invoice-id | Required | Invoice ID | -| file-path | Default: `./` | Wanted file path | -| file-type | Default: `pdf` | Wanted file extension | -| force-replace | Default: `false` | Force file replacement | - - - -### Export invoices - -Export invoices in a CSV file. - -**Usage:** - -``` -scw billing invoice export [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| organization-id | | Organization ID. If specified, only invoices from this Organization will be returned | -| billing-period-start-after | | Return only invoice with start date greater than billing_period_start | -| billing-period-start-before | | Return only invoice with start date less than billing_period_start | -| invoice-type | | Invoice type. It can either be `periodic` or `purchase` | -| file-path | Default: `./` | Wanted file path | -| file-type | Default: `csv` | Wanted file extension | -| force-replace | Default: `false` | Force file replacement | - - - -### Get an invoice - -Get a specific invoice, specified by its ID. - -**Usage:** - -``` -scw billing invoice get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| invoice-id | Required | Invoice ID | - - - -### List invoices - -List all your invoices, filtering by `start_date` and `invoice_type`. Each invoice has its own ID. - -**Usage:** - -``` -scw billing invoice list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| billing-period-start-after | | Return only invoice with start date greater than billing_period_start | -| billing-period-start-before | | Return only invoice with start date less than billing_period_start | -| invoice-type | One of: `unknown_type`, `periodic`, `purchase` | Invoice type. It can either be `periodic` or `purchase` | -| order-by | One of: `invoice_number_desc`, `invoice_number_asc`, `start_date_desc`, `start_date_asc`, `issued_date_desc`, `issued_date_asc`, `due_date_desc`, `due_date_asc`, `total_untaxed_desc`, `total_untaxed_asc`, `total_taxed_desc`, `total_taxed_asc`, `invoice_type_desc`, `invoice_type_asc` | How invoices are ordered in the response | -| organization-id | | Organization ID. If specified, only invoices from this Organization will be returned | - - - diff --git a/docs/docs/block.md b/docs/docs/block.md deleted file mode 100644 index 042a458508..0000000000 --- a/docs/docs/block.md +++ /dev/null @@ -1,304 +0,0 @@ - -# Documentation for `scw block` -This API allows you to manage your Block Storage volumes. - -- [A Block Storage snapshot is a read-only picture of a Block volume, taken at a specific time](#a-block-storage-snapshot-is-a-read-only-picture-of-a-block-volume,-taken-at-a-specific-time) - - [Create a snapshot of a volume](#create-a-snapshot-of-a-volume) - - [Delete a snapshot](#delete-a-snapshot) - - [Export a snapshot to a Scaleway Object Storage bucket](#export-a-snapshot-to-a-scaleway-object-storage-bucket) - - [Get a snapshot](#get-a-snapshot) - - [List all snapshots](#list-all-snapshots) - - [Update a snapshot](#update-a-snapshot) -- [A Block Storage volume is a logical storage drive on a network-connected storage system. It is exposed to Instances as if it were a physical disk, and can be attached and detached like a hard drive. Several Block volumes can be attached to one Instance at a time](#a-block-storage-volume-is-a-logical-storage-drive-on-a-network-connected-storage-system.-it-is-exposed-to-instances-as-if-it-were-a-physical-disk,-and-can-be-attached-and-detached-like-a-hard-drive.-several-block-volumes-can-be-attached-to-one-instance-at-a-time) - - [Create a volume](#create-a-volume) - - [Delete a detached volume](#delete-a-detached-volume) - - [Get a volume](#get-a-volume) - - [List volumes](#list-volumes) - - [Update a volume](#update-a-volume) -- [Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class](#block-storage-volume-types-are-determined-by-their-storage-class-and-their-iops.-there-are-two-storage-classes-available:-`bssd`-and-`sbs`.-the-iops-can-be-chosen-for-volumes-of-the-`sbs`-storage-class) - - [List volume types](#list-volume-types) - - -## A Block Storage snapshot is a read-only picture of a Block volume, taken at a specific time - -You can then revert your data to the previous snapshot. You can also create a new read/write Block volume from a previous snapshot. - - -### Create a snapshot of a volume - -To create a snapshot, the volume must be in the `in_use` or the `available` status. -If your volume is in a transient state, you need to wait until the end of the current operation. - -**Usage:** - -``` -scw block snapshot create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | UUID of the volume to snapshot | -| name | | Name of the snapshot | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | List of tags assigned to the snapshot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a snapshot - -You must specify the `snapshot_id` of the snapshot you want to delete. The snapshot must not be in use. - -**Usage:** - -``` -scw block snapshot delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Export a snapshot to a Scaleway Object Storage bucket - -The snapshot is exported in QCOW2 format. -The snapshot must not be in transient state. - -**Usage:** - -``` -scw block snapshot export-to-object-storage [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| bucket | | Scaleway Object Storage bucket where the object is stored | -| key | | The object key inside the given bucket | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a snapshot - -Retrieve technical information about a specific snapshot. Details such as size, volume type, and status are returned in the response. - -**Usage:** - -``` -scw block snapshot get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all snapshots - -List all available snapshots in a specified zone. By default, the snapshots listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. - -**Usage:** - -``` -scw block snapshot list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | -| project-id | | Filter by Project ID | -| volume-id | | Filter snapshots by the ID of the original volume | -| name | | Filter snapshots by their names | -| organization-id | | Filter by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a snapshot - -Update the name or tags of the snapshot. - -**Usage:** - -``` -scw block snapshot update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| name | | When defined, is the name of the snapshot | -| tags.{index} | | List of tags assigned to the snapshot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## A Block Storage volume is a logical storage drive on a network-connected storage system. It is exposed to Instances as if it were a physical disk, and can be attached and detached like a hard drive. Several Block volumes can be attached to one Instance at a time - -Block volumes can be snapshotted, mounted or unmounted. - - -### Create a volume - -To create a new volume from scratch, you must specify `from_empty` and the `size`. -To create a volume from an existing snapshot, specify `from_snapshot` and the `snapshot_id` in the request payload instead, size is optional and can be specified if you need to extend the original size. The volume will take on the same volume class and underlying IOPS limitations as the original snapshot. - -**Usage:** - -``` -scw block volume create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | Name of the volume | -| perf-iops | Required | The maximum IO/s expected, according to the different options available in stock (`5000 | 15000`) | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| from-empty.size | | Volume size in bytes, with a granularity of 1 GB (10^9 bytes) | -| from-snapshot.size | | Volume size in bytes, with a granularity of 1 GB (10^9 bytes) | -| from-snapshot.snapshot-id | | Source snapshot from which volume will be created | -| tags.{index} | | List of tags assigned to the volume | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a detached volume - -You must specify the `volume_id` of the volume you want to delete. The volume must not be in the `in_use` status. - -**Usage:** - -``` -scw block volume delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a volume - -Retrieve technical information about a specific volume. Details such as size, type, and status are returned in the response. - -**Usage:** - -``` -scw block volume get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List volumes - -List all existing volumes in a specified zone. By default, the volumes listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. - -**Usage:** - -``` -scw block volume list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | -| project-id | | Filter by Project ID | -| name | | Filter the return volumes by their names | -| product-resource-id | | Filter by a product resource ID linked to this volume (such as an Instance ID) | -| organization-id | | Filter by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a volume - -Update the technical details of a volume, such as its name, tags, or its new size and `volume_type` (within the same Block Storage class). -You can only resize a volume to a larger size. It is currently not possible to change your Block Storage Class. - -**Usage:** - -``` -scw block volume update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume | -| name | | When defined, is the new name of the volume | -| size | | Optional field for increasing the size of a volume (size must be equal or larger than the current one) | -| tags.{index} | | List of tags assigned to the volume | -| perf-iops | | The maximum IO/s expected, according to the different options available in stock (`5000 | 15000`) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class - -Block Storage volume types are determined by their storage class and their IOPS. There are two storage classes available: `bssd` and `sbs`. The IOPS can be chosen for volumes of the `sbs` storage class. - - -### List volume types - -List all available volume types in a specified zone. The volume types listed are ordered by name in ascending order. - -**Usage:** - -``` -scw block volume-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/cli-artwork.png b/docs/docs/cli-artwork.png deleted file mode 100644 index 7f7e5a6fe11a8257e8e92ee4cf67a5cbb54a7699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102270 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

)piKZY<_h|cN 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%0AmX1-z`$-5L)>o#g!U>4 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

;V}uCJe2OZ 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 -# Documentation for `scw cockpit` -This API allows you to manage your Scaleway Cockpit, for storing and visualizing metrics and logs. - -- [Alerting management commands](#alerting-management-commands) - - [Disable the Alert manager](#disable-the-alert-manager) - - [Enable the Alert manager](#enable-the-alert-manager) - - [Get the Alert manager](#get-the-alert-manager) -- [Contact point management commands](#contact-point-management-commands) - - [Create a contact point](#create-a-contact-point) - - [Delete a contact point](#delete-a-contact-point) - - [List contact points](#list-contact-points) -- [Datasource management commands](#datasource-management-commands) - - [Create a data source](#create-a-data-source) - - [Delete a data source](#delete-a-data-source) - - [Get a data source](#get-a-data-source) - - [List data sources](#list-data-sources) - - [Update a data source](#update-a-data-source) -- [Grafana user management commands](#grafana-user-management-commands) - - [Get your Cockpit's Grafana](#get-your-cockpit's-grafana) - - [Synchronize Grafana data sources](#synchronize-grafana-data-sources) -- [Grafana user management commands](#grafana-user-management-commands) - - [Create a Grafana user](#create-a-grafana-user) - - [Delete a Grafana user](#delete-a-grafana-user) - - [List Grafana users](#list-grafana-users) - - [Reset a Grafana user password](#reset-a-grafana-user-password) -- [Managed alerts management commands](#managed-alerts-management-commands) - - [Disable managed alerts](#disable-managed-alerts) - - [Enable managed alerts](#enable-managed-alerts) -- [Pricing plans management commands](#pricing-plans-management-commands) - - [Get current plan](#get-current-plan) - - [List plan types](#list-plan-types) - - [Apply a pricing plan](#apply-a-pricing-plan) -- [Product dashboards management commands](#product-dashboards-management-commands) - - [Get Scaleway resource dashboard](#get-scaleway-resource-dashboard) - - [List Scaleway resources dashboards](#list-scaleway-resources-dashboards) -- [Test alert management commands](#test-alert-management-commands) - - [Trigger a test alert](#trigger-a-test-alert) -- [Token management commands](#token-management-commands) - - [Create a token](#create-a-token) - - [Delete a token](#delete-a-token) - - [Get a token](#get-a-token) - - [List tokens](#list-tokens) -- [Usage overview management commands](#usage-overview-management-commands) - - [Get data source usage overview](#get-data-source-usage-overview) - - -## Alerting management commands - -Alerting management commands. - - -### Disable the Alert manager - -Disabling the Alert manager deletes the contact points you have created and disables managed alerts in the specified Project and region. - -**Usage:** - -``` -scw cockpit alert-manager disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable the Alert manager - -Enabling the Alert manager allows you to enable managed alerts and create contact points in the specified Project and region, to be notified when your Scaleway resources may require your attention. - -**Usage:** - -``` -scw cockpit alert-manager enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get the Alert manager - -Retrieve information about the Alert manager which is unique per Project and region. By default the Alert manager is disabled. -The output returned displays a URL to access the Alert manager, and whether the Alert manager and managed alerts are enabled. - -**Usage:** - -``` -scw cockpit alert-manager get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Contact point management commands - -Contact point management commands. - - -### Create a contact point - -Contact points are email addresses associated with the default receiver, that the Alert manager sends alerts to. -The source of the alerts are data sources within the same Project and region as the Alert manager. -If you need to receive alerts for other receivers, you can create additional contact points and receivers in Grafana. Make sure that you select the Scaleway Alert manager. - -**Usage:** - -``` -scw cockpit contact-point create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| email.to | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a contact point - -Delete a contact point associated with the default receiver. - -**Usage:** - -``` -scw cockpit contact-point delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| email.to | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List contact points - -Retrieve a list of contact points for the specified Project. The response lists all contact points and receivers created in Grafana or via the API. - -**Usage:** - -``` -scw cockpit contact-point list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Datasource management commands - -Datasource management commands. - - -### Create a data source - -You must specify the data source type upon creation. Available data source types include: - - metrics - - logs - - traces -The name of the data source will then be used as reference to name the associated Grafana data source. - -**Usage:** - -``` -scw cockpit data-source create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Data source name | -| type | One of: `unknown_type`, `metrics`, `logs`, `traces`, `alerts` | Data source type | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a data source - -Delete a given data source, specified by the data source ID. Note that deleting a data source is irreversible, and cannot be undone. - -**Usage:** - -``` -scw cockpit data-source delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| data-source-id | Required | ID of the data source to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a data source - -Retrieve information about a given data source, specified by the data source ID. The data source's information such as its name, type, URL, origin, and retention period, is returned. - -**Usage:** - -``` -scw cockpit data-source get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| data-source-id | Required | ID of the relevant data source | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List data sources - -Retrieve the list of data sources available in the specified region. By default, the data sources returned in the list are ordered by creation date, in ascending order. -You can list data sources by Project, type and origin. - -**Usage:** - -``` -scw cockpit data-source list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `type_asc`, `type_desc` | Sort order for data sources in the response | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| origin | One of: `unknown_origin`, `scaleway`, `external` | Origin to filter for, only data sources with matching origin will be returned | -| types.{index} | One of: `unknown_type`, `metrics`, `logs`, `traces`, `alerts` | Types to filter for, only data sources with matching types will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a data source - -Update a given data source name, specified by the data source ID. - -**Usage:** - -``` -scw cockpit data-source update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| data-source-id | Required | ID of the data source to update | -| name | | Updated name of the data source | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Grafana user management commands - -Grafana user management commands. - - -### Get your Cockpit's Grafana - -Retrieve information on your Cockpit's Grafana, specified by the ID of the Project the Cockpit belongs to. -The output returned displays the URL to access your Cockpit's Grafana. - -**Usage:** - -``` -scw cockpit grafana get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Synchronize Grafana data sources - -Trigger the synchronization of all your data sources and the alert manager in the relevant regions. The alert manager will only be synchronized if you have enabled it. - -**Usage:** - -``` -scw cockpit grafana sync-data-sources [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -## Grafana user management commands - -Grafana user management commands. - - -### Create a Grafana user - -Create a Grafana user to connect to your Cockpit's Grafana. Upon creation, your user password displays only once, so make sure that you save it. -Each Grafana user is associated with a role: viewer or editor. A viewer can only view dashboards, whereas an editor can create and edit dashboards. Note that the `admin` username is not available for creation. - -**Usage:** - -``` -scw cockpit grafana-user create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| login | | Username of the Grafana user. Note that the `admin` username is not available for creation | -| role | One of: `unknown_role`, `editor`, `viewer` | Role assigned to the Grafana user | - - - -### Delete a Grafana user - -Delete a Grafana user from your Cockpit's Grafana, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. - -**Usage:** - -``` -scw cockpit grafana-user delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| grafana-user-id | Required | ID of the Grafana user | - - - -### List Grafana users - -List all Grafana users created in your Cockpit's Grafana. By default, the Grafana users returned in the list are ordered in ascending order. - -**Usage:** - -``` -scw cockpit grafana-user list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `login_asc`, `login_desc` | Order of the Grafana users | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Reset a Grafana user password - -Reset the password of a Grafana user, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. -A new password regenerates and only displays once. Make sure that you save it. - -**Usage:** - -``` -scw cockpit grafana-user reset-password [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| grafana-user-id | Required | ID of the Grafana user | - - - -## Managed alerts management commands - -Managed alerts management commands. - - -### Disable managed alerts - -Disable the sending of managed alerts for the specified Project. - -**Usage:** - -``` -scw cockpit managed-alerts disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable managed alerts - -Enable the sending of managed alerts for the specified Project. Managed alerts are predefined alerts that apply to Scaleway recources integrated with Cockpit by default. - -**Usage:** - -``` -scw cockpit managed-alerts enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Pricing plans management commands - -Pricing plans management commands. - - -### Get current plan - -Retrieve a pricing plan for the given Project, specified by the ID of the Project. - -**Usage:** - -``` -scw cockpit plan get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### List plan types - -Retrieve a list of available pricing plan types. - -**Usage:** - -``` -scw cockpit plan list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc` | | - - - -### Apply a pricing plan - -Apply a pricing plan on a given Project. You must specify the ID of the pricing plan type. Note that you will be billed for the plan you apply. - -**Usage:** - -``` -scw cockpit plan select [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| plan-name | One of: `unknown_name`, `free`, `premium`, `custom` | Name of the pricing plan | - - - -## Product dashboards management commands - -Product dashboards management commands. - - -### Get Scaleway resource dashboard - -Retrieve information about the dashboard of a Scaleway resource in Grafana, specified by the ID of the Project the Cockpit belongs to, and the name of the dashboard. - -**Usage:** - -``` -scw cockpit product-dashboards get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| dashboard-name | Required | Name of the dashboard | - - - -### List Scaleway resources dashboards - -Retrieve a list of available dashboards in Grafana, for all Scaleway resources which are integrated with Cockpit. - -**Usage:** - -``` -scw cockpit product-dashboards list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags to filter for | - - - -## Test alert management commands - -Test alert management commands. - - -### Trigger a test alert - -Send a test alert to the Alert manager to make sure your contact points get notified. - -**Usage:** - -``` -scw cockpit test-alert trigger [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Token management commands - -Token management commands. - - -### Create a token - -Give your token the relevant scopes to ensure it has the right permissions to interact with your data sources and the Alert manager. Make sure that you create your token in the same regions as the data sources you want to use it for. -Upon creation, your token's secret key display only once. Make sure that you save it. - -**Usage:** - -``` -scw cockpit token create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name of the token | -| token-scopes.{index} | One of: `unknown_scope`, `read_only_metrics`, `write_only_metrics`, `full_access_metrics_rules`, `read_only_logs`, `write_only_logs`, `full_access_logs_rules`, `full_access_alert_manager`, `read_only_traces`, `write_only_traces` | Token permission scopes | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a token - -Delete a given token, specified by the token ID. Deleting a token is irreversible and cannot be undone. - -**Usage:** - -``` -scw cockpit token delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | ID of the token to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a token - -Retrieve information about a given token, specified by the token ID. The token's information such as its scopes, is returned. - -**Usage:** - -``` -scw cockpit token get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | Token ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List tokens - -Retrieve a list of all tokens in the specified region. By default, tokens returned in the list are ordered by creation date, in ascending order. -You can filter tokens by Project ID and token scopes. - -**Usage:** - -``` -scw cockpit token list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| token-scopes.{index} | One of: `unknown_scope`, `read_only_metrics`, `write_only_metrics`, `full_access_metrics_rules`, `read_only_logs`, `write_only_logs`, `full_access_logs_rules`, `full_access_alert_manager`, `read_only_traces`, `write_only_traces` | Token scopes to filter for | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Usage overview management commands - -Usage overview management commands. - - -### Get data source usage overview - -Retrieve the data source usage overview per type for the specified Project. - -**Usage:** - -``` -scw cockpit usage-overview get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| interval | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/config.md b/docs/docs/config.md deleted file mode 100644 index 24c0a01323..0000000000 --- a/docs/docs/config.md +++ /dev/null @@ -1,310 +0,0 @@ - -# Documentation for `scw config` -Config management engine is common across all Scaleway developer tools (CLI, terraform, SDK, ... ). It allows to handle Scaleway config through two ways: environment variables and/or config file. -Default path for configuration file is based on the following priority order: - -- $SCW_CONFIG_PATH -- $XDG_CONFIG_HOME/scw/config.yaml -- $HOME/.config/scw/config.yaml -- $USERPROFILE/.config/scw/config.yaml - -In this CLI, environment variables have priority over the configuration file. - -The following environment variables are supported: - -|Environment Variable|Description| -|--|--| -|SCW_ACCESS_KEY|The access key of a token (create a token at https://console.scaleway.com/iam/api-keys)| -|SCW_SECRET_KEY|The secret key of a token (create a token at https://console.scaleway.com/iam/api-keys)| -|SCW_DEFAULT_ORGANIZATION_ID|The default organization ID (get your organization ID at https://console.scaleway.com/iam/api-keys)| -|SCW_DEFAULT_PROJECT_ID|The default project ID (get your project ID at https://console.scaleway.com/iam/api-keys)| -|SCW_DEFAULT_REGION|The default region| -|SCW_DEFAULT_ZONE|The default availability zone| -|SCW_API_URL|URL of the API| -|SCW_INSECURE|Set this to true to enable the insecure mode| -|SCW_PROFILE|Set the config profile to use| - -Read more about the config management engine at https://github.com/scaleway/scaleway-sdk-go/tree/master/scw#scaleway-config - -- [Destroy the config file](#destroy-the-config-file) -- [Dump the config file](#dump-the-config-file) -- [Get a value from the config file](#get-a-value-from-the-config-file) -- [Import configurations from another file](#import-configurations-from-another-file) -- [Get config values from the config file for the current profile](#get-config-values-from-the-config-file-for-the-current-profile) -- [Allows the activation and deletion of a profile from the config file](#allows-the-activation-and-deletion-of-a-profile-from-the-config-file) - - [Mark a profile as active in the config file](#mark-a-profile-as-active-in-the-config-file) - - [Delete a profile from the config file](#delete-a-profile-from-the-config-file) -- [Reset the config](#reset-the-config) -- [Set a line from the config file](#set-a-line-from-the-config-file) -- [Unset a line from the config file](#unset-a-line-from-the-config-file) -- [Validate the config](#validate-the-config) - - -## Destroy the config file - - - - - -**Usage:** - -``` -scw config destroy -``` - - - -## Dump the config file - - - - - -**Usage:** - -``` -scw config dump -``` - - - -## Get a value from the config file - - - - - -**Usage:** - -``` -scw config get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key | Required
One of: `access-key`, `secret-key`, `api-url`, `insecure`, `default-organization-id`, `default-project-id`, `default-region`, `default-zone`, `send-telemetry` | the key to get from the config | - - -**Examples:** - - -Get the default organization ID -``` -scw config get default_organization_id -``` - -Get the default region of the profile 'prod' -``` -scw -p prod config get default_region -``` - - - - -## Import configurations from another file - - - - - -**Usage:** - -``` -scw config import [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| file | Required | Path to the configuration file to import | - - - -## Get config values from the config file for the current profile - - - - - -**Usage:** - -``` -scw config info -``` - - -**Examples:** - - -Get the default config values -``` -scw config info -``` - -Get the config values of the profile 'prod' -``` -scw -p prod config info -``` - - - - -## Allows the activation and deletion of a profile from the config file - - - - -### Mark a profile as active in the config file - - - -**Usage:** - -``` -scw config profile activate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| profile-name | Required | | - - - -### Delete a profile from the config file - - - -**Usage:** - -``` -scw config profile delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | | - - - -## Reset the config - - - - - -**Usage:** - -``` -scw config reset -``` - - - -## Set a line from the config file - -This commands overwrites the configuration file parameters with user input. -The only allowed attributes are access_key, secret_key, default_organization_id, default_region, default_zone, api_url, insecure - -This commands overwrites the configuration file parameters with user input. -The only allowed attributes are access_key, secret_key, default_organization_id, default_region, default_zone, api_url, insecure - -**Usage:** - -``` -scw config set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| access-key | | A Scaleway access key | -| secret-key | | A Scaleway secret key | -| api-url | | Scaleway API URL | -| insecure | | Set to true to allow insecure HTTPS connections | -| default-organization-id | | A default Scaleway organization id | -| default-project-id | | A default Scaleway project id | -| default-region | One of: `fr-par`, `nl-ams`, `pl-waw` | A default Scaleway region | -| default-zone | One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | A default Scaleway zone | -| send-telemetry | | Set to false to disable telemetry | - - -**Examples:** - - -Update the default organization ID -``` -scw config set default_organization_id=12903058-d0e8-4366-89c3-6e666abe1f6f -``` - -Update the default region of the profile 'prod' -``` -scw -p prod config set default_region=nl-ams -``` - - - - -## Unset a line from the config file - - - - - -**Usage:** - -``` -scw config unset [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key | Required
One of: `access-key`, `secret-key`, `api-url`, `insecure`, `default-organization-id`, `default-project-id`, `default-region`, `default-zone`, `send-telemetry` | the config config key name to unset | - - - -## Validate the config - -This command validates the configuration of your Scaleway CLI tool. - -It performs the following checks: - - - YAML syntax correctness: It checks whether your config file is a valid YAML file. - - Field validity: It checks whether the fields present in the config file are valid and expected fields. This includes fields like AccessKey, SecretKey, DefaultOrganizationID, DefaultProjectID, DefaultRegion, DefaultZone, and APIURL. - - Field values: For each of the fields mentioned above, it checks whether the value assigned to it is valid. For example, it checks if the AccessKey and SecretKey are non-empty and meet the format expectations. - -The command goes through each profile present in the config file and validates it. - -This command validates the configuration of your Scaleway CLI tool. - -It performs the following checks: - - - YAML syntax correctness: It checks whether your config file is a valid YAML file. - - Field validity: It checks whether the fields present in the config file are valid and expected fields. This includes fields like AccessKey, SecretKey, DefaultOrganizationID, DefaultProjectID, DefaultRegion, DefaultZone, and APIURL. - - Field values: For each of the fields mentioned above, it checks whether the value assigned to it is valid. For example, it checks if the AccessKey and SecretKey are non-empty and meet the format expectations. - -The command goes through each profile present in the config file and validates it. - -**Usage:** - -``` -scw config validate -``` - - - diff --git a/docs/docs/container.md b/docs/docs/container.md deleted file mode 100644 index f69c7f4477..0000000000 --- a/docs/docs/container.md +++ /dev/null @@ -1,764 +0,0 @@ - -# Documentation for `scw container` -This API allows you to manage your Serverless Containers. - -- [Container management commands](#container-management-commands) - - [Create a new container](#create-a-new-container) - - [Delete a container](#delete-a-container) - - [Deploy a container](#deploy-a-container) - - [Get a container](#get-a-container) - - [List all your containers](#list-all-your-containers) - - [Update an existing container](#update-an-existing-container) -- [Cron management commands](#cron-management-commands) - - [Create a new cron](#create-a-new-cron) - - [Delete an existing cron](#delete-an-existing-cron) - - [Get a cron](#get-a-cron) - - [List all your crons](#list-all-your-crons) - - [Update an existing cron](#update-an-existing-cron) -- [Deploy a container](#deploy-a-container) -- [Domain management commands](#domain-management-commands) - - [Create a domain name binding](#create-a-domain-name-binding) - - [Delete a domain name binding](#delete-a-domain-name-binding) - - [Get a domain name binding](#get-a-domain-name-binding) - - [List all domain name bindings](#list-all-domain-name-bindings) -- [Namespace management commands](#namespace-management-commands) - - [Create a new namespace](#create-a-new-namespace) - - [Delete an existing namespace](#delete-an-existing-namespace) - - [Get a namespace](#get-a-namespace) - - [List all your namespaces](#list-all-your-namespaces) - - [Update an existing namespace](#update-an-existing-namespace) -- [Token management commands](#token-management-commands) - - [Create a new revocable token](#create-a-new-revocable-token) - - [Delete a token](#delete-a-token) - - [Get a token](#get-a-token) - - [List all tokens](#list-all-tokens) -- [Trigger management commands](#trigger-management-commands) - - [Create a trigger](#create-a-trigger) - - [Delete a trigger](#delete-a-trigger) - - [Get a trigger](#get-a-trigger) - - [List all triggers](#list-all-triggers) - - [Update a trigger](#update-a-trigger) - - -## Container management commands - -Container management commands. - - -### Create a new container - -Create a new container in the specified region. - -**Usage:** - -``` -scw container container create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | | UUID of the namespace the container belongs to | -| name | | Name of the container | -| environment-variables.{key} | | Environment variables of the container | -| min-scale | | Minimum number of instances to scale the container to | -| max-scale | | Maximum number of instances to scale the container to | -| memory-limit | | Memory limit of the container in MB | -| cpu-limit | | CPU limit of the container in mvCPU | -| timeout | | Processing time limit for the container | -| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the container | -| description | | Description of the container | -| registry-image | | Name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). | -| max-concurrency | | Number of maximum concurrent executions of the container | -| protocol | One of: `unknown_protocol`, `http1`, `h2c` | Protocol the container uses | -| port | | Port the container listens on | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | -| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the container | -| local-storage-limit | | Local storage limit of the container (in MB) | -| deploy | Default: `true` | Deploy container after creation | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a container - -Delete the container associated with the specified ID. - -**Usage:** - -``` -scw container container delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | Required | UUID of the container to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Deploy a container - -Deploy a container associated with the specified ID. - -**Usage:** - -``` -scw container container deploy [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | Required | UUID of the container to deploy | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a container - -Get the container associated with the specified ID. - -**Usage:** - -``` -scw container container get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | Required | UUID of the container to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your containers - -List all containers for a specified region. - -**Usage:** - -``` -scw container container list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the containers | -| namespace-id | | UUID of the namespace the container belongs to | -| name | | Name of the container | -| project-id | | UUID of the Project the container belongs to | -| organization-id | | UUID of the Organization the container belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing container - -Update the container associated with the specified ID. - -**Usage:** - -``` -scw container container update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | Required | UUID of the container to update | -| environment-variables.{key} | | Environment variables of the container | -| min-scale | | Minimum number of instances to scale the container to | -| max-scale | | Maximum number of instances to scale the container to | -| memory-limit | | Memory limit of the container in MB | -| cpu-limit | | CPU limit of the container in mvCPU | -| timeout | | Processing time limit for the container | -| redeploy | | Defines whether to redeploy failed containers | -| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy settings of the container | -| description | | Description of the container | -| registry-image | | Name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). | -| max-concurrency | | Number of maximum concurrent executions of the container | -| protocol | One of: `unknown_protocol`, `http1`, `h2c` | | -| port | | | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | -| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the container | -| local-storage-limit | | Local storage limit of the container (in MB) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Cron management commands - -Cron management commands. - - -### Create a new cron - -Create a new cron. - -**Usage:** - -``` -scw container cron create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | | UUID of the container to invoke by the cron | -| schedule | | UNIX cron shedule | -| args | | Arguments to pass with the cron | -| name | | Name of the cron to create | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing cron - -Delete the cron associated with the specified ID. - -**Usage:** - -``` -scw container cron delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a cron - -Get the cron associated with the specified ID. - -**Usage:** - -``` -scw container cron get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your crons - -List all your crons. - -**Usage:** - -``` -scw container cron list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the crons | -| container-id | | UUID of the container invoked by the cron | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing cron - -Update the cron associated with the specified ID. - -**Usage:** - -``` -scw container cron update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to update | -| container-id | | UUID of the container invoked by the cron | -| schedule | | UNIX cron schedule | -| args | | Arguments to pass with the cron | -| name | | Name of the cron | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Deploy a container - -Automatically build and deploy a container. - -Automatically build and deploy a container. - -**Usage:** - -``` -scw container deploy [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the application (defaults to build-source's directory name) | -| builder | Default: `paketobuildpacks/builder:base` | Builder image to use | -| dockerfile | Default: `Dockerfile` | Path to the Dockerfile | -| force-builder | Default: `false` | Force the use of the builder image (even if a Dockerfile is present) | -| build-source | Default: `.` | Path to the build context | -| cache | Default: `true` | Use cache when building the image | -| build-args.{key} | | Build-time variables | -| port | Default: `8080` | Port to expose | -| namespace-id | | Container Namespace ID to deploy to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Domain management commands - -Domain management commands. - - -### Create a domain name binding - -Create a domain name binding for the container with the specified ID. - -**Usage:** - -``` -scw container domain create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hostname | | Domain to assign | -| container-id | | UUID of the container to assign the domain to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a domain name binding - -Delete the domain name binding with the specific ID. - -**Usage:** - -``` -scw container domain delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | UUID of the domain to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a domain name binding - -Get a domain name binding for the container with the specified ID. - -**Usage:** - -``` -scw container domain get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | UUID of the domain to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all domain name bindings - -List all domain name bindings in a specified region. - -**Usage:** - -``` -scw container domain list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `hostname_asc`, `hostname_desc` | Order of the domains | -| container-id | | UUID of the container the domain belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Namespace management commands - -Namespace management commands. - - -### Create a new namespace - -Create a new namespace in a specified region. - -**Usage:** - -``` -scw container namespace create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the namespace to create | -| environment-variables.{key} | | Environment variables of the namespace to create | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| description | | Description of the namespace to create | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing namespace - -Delete the namespace associated with the specified ID. - -**Usage:** - -``` -scw container namespace delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a namespace - -Get the namespace associated with the specified ID. - -**Usage:** - -``` -scw container namespace get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your namespaces - -List all namespaces in a specified region. - -**Usage:** - -``` -scw container namespace list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the namespaces | -| name | | Name of the namespaces | -| project-id | | UUID of the Project the namespace belongs to | -| organization-id | | UUID of the Organization the namespace belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing namespace - -Update the space associated with the specified ID. - -**Usage:** - -``` -scw container namespace update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace to update | -| environment-variables.{key} | | Environment variables of the namespace to update | -| description | | Description of the namespace to update | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Token management commands - -Token management commands. - - -### Create a new revocable token - -Create a new revocable token. - -**Usage:** - -``` -scw container token create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| container-id | | UUID of the container to create the token for | -| namespace-id | | UUID of the namespace to create the token for | -| description | | Description of the token | -| expires-at | | Expiry date of the token | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a token - -Delete a token with a specified ID. - -**Usage:** - -``` -scw container token delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | UUID of the token to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a token - -Get a token with a specified ID. - -**Usage:** - -``` -scw container token get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | UUID of the token to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all tokens - -List all tokens belonging to a specified Organization or Project. - -**Usage:** - -``` -scw container token list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the tokens | -| container-id | | UUID of the container the token belongs to | -| namespace-id | | UUID of the namespace the token belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Trigger management commands - -Trigger management commands. - - -### Create a trigger - -Create a new trigger for a specified container. - -**Usage:** - -``` -scw container trigger create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | Name of the trigger | -| container-id | Required | ID of the container to trigger | -| description | | Description of the trigger | -| scw-sqs-config.queue | | Name of the SQS queue the trigger should listen to | -| scw-sqs-config.mnq-project-id | | ID of the Messaging and Queuing project | -| scw-sqs-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | -| scw-nats-config.subject | | Name of the NATS subject the trigger should listen to | -| scw-nats-config.mnq-nats-account-id | | ID of the Messaging and Queuing NATS account | -| scw-nats-config.mnq-project-id | | ID of the Messaging and Queuing project | -| scw-nats-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a trigger - -Delete a trigger with a specified ID. - -**Usage:** - -``` -scw container trigger delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a trigger - -Get a trigger with a specified ID. - -**Usage:** - -``` -scw container trigger get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all triggers - -List all triggers belonging to a specified Organization or Project. - -**Usage:** - -``` -scw container trigger list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order in which to return results | -| container-id | | ID of the container the triggers belongs to | -| namespace-id | | ID of the namespace the triggers belongs to | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a trigger - -Update a trigger with a specified ID. - -**Usage:** - -``` -scw container trigger update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to update | -| name | | Name of the trigger | -| description | | Description of the trigger | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/dedibox.md b/docs/docs/dedibox.md deleted file mode 100644 index 5775f188fb..0000000000 --- a/docs/docs/dedibox.md +++ /dev/null @@ -1,2130 +0,0 @@ - -# Documentation for `scw dedibox` -Dedibox Phoenix API. - -- [Billing commands](#billing-commands) - - [Download-invoice dedibox resources](#download-invoice-dedibox-resources) - - [Download-refund dedibox resources](#download-refund-dedibox-resources) - - [Get-invoice dedibox resources](#get-invoice-dedibox-resources) - - [Get-order-capacity dedibox resources](#get-order-capacity-dedibox-resources) - - [Get-refund dedibox resources](#get-refund-dedibox-resources) - - [List-invoice dedibox resources](#list-invoice-dedibox-resources) - - [List-refund dedibox resources](#list-refund-dedibox-resources) -- [BMC (Baseboard Management Controller) access commands](#bmc-(baseboard-management-controller)-access-commands) - - [Get BMC (Baseboard Management Controller) access for a given baremetal server](#get-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) - - [Start BMC (Baseboard Management Controller) access for a given baremetal server](#start-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) - - [Stop BMC (Baseboard Management Controller) access for a given baremetal server](#stop-bmc-(baseboard-management-controller)-access-for-a-given-baremetal-server) -- [Failover IPs commands](#failover-ips-commands) - - [Attach failovers on baremetal server](#attach-failovers-on-baremetal-server) - - [Attach a failover IP to a MAC address](#attach-a-failover-ip-to-a-mac-address) - - [Order failover IPs](#order-failover-ips) - - [Delete a failover server](#delete-a-failover-server) - - [Detach failovers on baremetal server](#detach-failovers-on-baremetal-server) - - [Detach a failover IP from a MAC address](#detach-a-failover-ip-from-a-mac-address) - - [Get a specific baremetal server](#get-a-specific-baremetal-server) - - [Get remaining quota](#get-remaining-quota) - - [List failovers for project](#list-failovers-for-project) -- [IPv6 block commands](#ipv6-block-commands) - - [Create IPv6 block for baremetal server](#create-ipv6-block-for-baremetal-server) - - [Create IPv6 block subnet](#create-ipv6-block-subnet) - - [Delete IPv6 block](#delete-ipv6-block) - - [Get a specific IPv6 block](#get-a-specific-ipv6-block) - - [Get IPv6 block quota](#get-ipv6-block-quota) - - [List available IPv6 block subnets](#list-available-ipv6-block-subnets) - - [Update IPv6 block](#update-ipv6-block) -- [Offer commands](#offer-commands) - - [Get offer](#get-offer) - - [List offers](#list-offers) -- [Subscribable server options commands](#subscribable-server-options-commands) - - [List subscribable server options](#list-subscribable-server-options) - - [Subscribe server option](#subscribe-server-option) - - [Subscribe storage server option](#subscribe-storage-server-option) -- [OS commands](#os-commands) - - [Get an OS with a given ID](#get-an-os-with-a-given-id) - - [List all available OS that can be install on a baremetal server](#list-all-available-os-that-can-be-install-on-a-baremetal-server) -- [RAID commands](#raid-commands) - - [Get raid](#get-raid) - - [Update RAID](#update-raid) -- [Rescue commands](#rescue-commands) - - [Get rescue information](#get-rescue-information) - - [Start in rescue baremetal server](#start-in-rescue-baremetal-server) - - [Stop rescue on baremetal server](#stop-rescue-on-baremetal-server) -- [Reverse-IP commands](#reverse-ip-commands) - - [Update reverse of ip](#update-reverse-of-ip) -- [RPN's information commands](#rpn's-information-commands) - - [Get dedibox resources](#get-dedibox-resources) - - [List dedibox resources](#list-dedibox-resources) -- [RPN V1 commands](#rpn-v1-commands) - - [Accept-invite dedibox resources](#accept-invite-dedibox-resources) - - [Add-members dedibox resources](#add-members-dedibox-resources) - - [Create dedibox resources](#create-dedibox-resources) - - [Delete dedibox resources](#delete-dedibox-resources) - - [Delete-members dedibox resources](#delete-members-dedibox-resources) - - [Get dedibox resources](#get-dedibox-resources) - - [Invite dedibox resources](#invite-dedibox-resources) - - [Leave dedibox resources](#leave-dedibox-resources) - - [List dedibox resources](#list-dedibox-resources) - - [List-capable-san-server dedibox resources](#list-capable-san-server-dedibox-resources) - - [List-capable-server dedibox resources](#list-capable-server-dedibox-resources) - - [List-invites dedibox resources](#list-invites-dedibox-resources) - - [List-members dedibox resources](#list-members-dedibox-resources) - - [Refuse-invite dedibox resources](#refuse-invite-dedibox-resources) - - [Update dedibox resources](#update-dedibox-resources) -- [](#) - - [Add-members dedibox resources](#add-members-dedibox-resources) - - [Create dedibox resources](#create-dedibox-resources) - - [Delete dedibox resources](#delete-dedibox-resources) - - [Delete-members dedibox resources](#delete-members-dedibox-resources) - - [Disable-compatibility dedibox resources](#disable-compatibility-dedibox-resources) - - [Enable-compatibility dedibox resources](#enable-compatibility-dedibox-resources) - - [Get dedibox resources](#get-dedibox-resources) - - [List dedibox resources](#list-dedibox-resources) - - [List-capable-resources dedibox resources](#list-capable-resources-dedibox-resources) - - [List-logs dedibox resources](#list-logs-dedibox-resources) - - [List-members dedibox resources](#list-members-dedibox-resources) - - [Update dedibox resources](#update-dedibox-resources) - - [Update-vlan-members dedibox resources](#update-vlan-members-dedibox-resources) -- [RPN SAN (Storage Area Network) commands](#rpn-san-(storage-area-network)-commands) - - [Add-ip dedibox resources](#add-ip-dedibox-resources) - - [Create dedibox resources](#create-dedibox-resources) - - [Delete dedibox resources](#delete-dedibox-resources) - - [Get dedibox resources](#get-dedibox-resources) - - [List dedibox resources](#list-dedibox-resources) - - [List-available-ips dedibox resources](#list-available-ips-dedibox-resources) - - [List-ips dedibox resources](#list-ips-dedibox-resources) - - [Remove-ip dedibox resources](#remove-ip-dedibox-resources) -- [Baremetal server commands](#baremetal-server-commands) - - [Cancels the current (running) server installation](#cancels-the-current-(running)-server-installation) - - [Create a baremetal server](#create-a-baremetal-server) - - [Delete a baremetal server](#delete-a-baremetal-server) - - [Get a specific baremetal server](#get-a-specific-baremetal-server) - - [Get a specific server installation status](#get-a-specific-server-installation-status) - - [Get server default partitioning](#get-server-default-partitioning) - - [Install a baremetal server](#install-a-baremetal-server) - - [List baremetal servers for project](#list-baremetal-servers-for-project) - - [List server disks](#list-server-disks) - - [List server events](#list-server-events) - - [Reboot a baremetal server](#reboot-a-baremetal-server) - - [Start a baremetal server](#start-a-baremetal-server) - - [Stop a baremetal server](#stop-a-baremetal-server) - - [Update a baremetal server](#update-a-baremetal-server) -- [Service commands](#service-commands) - - [Delete a specific service](#delete-a-specific-service) - - [Get a specific service](#get-a-specific-service) - - [List services](#list-services) - - -## Billing commands - -Billing commands. - - -### Download-invoice dedibox resources - -Download-invoice dedibox resources. - -**Usage:** - -``` -scw dedibox billing download-invoice [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| invoice-id | Required | | - - - -### Download-refund dedibox resources - -Download-refund dedibox resources. - -**Usage:** - -``` -scw dedibox billing download-refund [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| refund-id | Required | | - - - -### Get-invoice dedibox resources - -Get-invoice dedibox resources. - -**Usage:** - -``` -scw dedibox billing get-invoice [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| invoice-id | Required | | - - - -### Get-order-capacity dedibox resources - -Get-order-capacity dedibox resources. - -**Usage:** - -``` -scw dedibox billing get-order-capacity [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Get-refund dedibox resources - -Get-refund dedibox resources. - -**Usage:** - -``` -scw dedibox billing get-refund [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| refund-id | Required | | - - - -### List-invoice dedibox resources - -List-invoice dedibox resources. - -**Usage:** - -``` -scw dedibox billing list-invoice [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | | -| project-id | Default: `` | | - - - -### List-refund dedibox resources - -List-refund dedibox resources. - -**Usage:** - -``` -scw dedibox billing list-refund [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | | -| project-id | Default: `` | | - - - -## BMC (Baseboard Management Controller) access commands - -BMC (Baseboard Management Controller) access commands. - - -### Get BMC (Baseboard Management Controller) access for a given baremetal server - -Get the BMC (Baseboard Management Controller) access associated with the given ID. - -**Usage:** - -``` -scw dedibox bmc get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to get BMC access | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Start BMC (Baseboard Management Controller) access for a given baremetal server - -Start BMC (Baseboard Management Controller) access associated with the given ID. -The BMC (Baseboard Management Controller) access is available one hour after the installation of the server. - -**Usage:** - -``` -scw dedibox bmc start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to start the BMC access | -| ip | | The IP authorized to connect to the given server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Stop BMC (Baseboard Management Controller) access for a given baremetal server - -Stop BMC (Baseboard Management Controller) access associated with the given ID. - -**Usage:** - -``` -scw dedibox bmc stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to stop BMC access | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## Failover IPs commands - -Failover IPs commands. - - -### Attach failovers on baremetal server - -Attach failovers on the server associated with the given ID. - -**Usage:** - -``` -scw dedibox fip attach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | | ID of the server | -| fips-ids.{index} | Required | List of ID of failovers IP to attach | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Attach a failover IP to a MAC address - -Attach a failover IP to a MAC address. - -**Usage:** - -``` -scw dedibox fip attach-mac [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the failover IP | -| type | One of: `mac_type_unknown`, `vmware`, `kvm`, `xen` | A mac type | -| mac | | A valid mac address (existing or not) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Order failover IPs - -Order X failover IPs. - -**Usage:** - -``` -scw dedibox fip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | | Failover IP offer ID | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| quantity | | Quantity | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a failover server - -Delete the failover associated with the given ID. - -**Usage:** - -``` -scw dedibox fip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the failover IP to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach failovers on baremetal server - -Detach failovers on the server associated with the given ID. - -**Usage:** - -``` -scw dedibox fip detach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fips-ids.{index} | Required | List of IDs of failovers IP to detach | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach a failover IP from a MAC address - -Detach a failover IP from a MAC address. - -**Usage:** - -``` -scw dedibox fip detach-mac [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the failover IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a specific baremetal server - -Get the server associated with the given ID. - -**Usage:** - -``` -scw dedibox fip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the failover IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get remaining quota - -Get remaining quota. - -**Usage:** - -``` -scw dedibox fip get-quota [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | Default: `` | Project ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List failovers for project - -List failovers servers for project. - -**Usage:** - -``` -scw dedibox fip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `ip_asc`, `ip_desc` | Order of the failovers IP | -| project-id | Required
Default: `` | Filter failovers IP by project ID | -| search | | Filter failovers IP which matching with this field | -| only-available | | True: return all failovers IP not attached on server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## IPv6 block commands - -IPv6 block commands. - - -### Create IPv6 block for baremetal server - -Create IPv6 block associated with the given project ID. - -**Usage:** - -``` -scw dedibox ipv6-block create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | Default: `` | ID of the project | - - - -### Create IPv6 block subnet - -Create IPv6 block subnet for the given IP ID. -/48 could create subnet in /56 (quota link to your number of server). -/56 could create subnet in /64 (quota link to your number of failover IP). - -**Usage:** - -``` -scw dedibox ipv6-block create-subnet [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| block-id | Required | ID of the IPv6 block | -| address | | Address of the IPv6 | -| cidr | | Classless InterDomain Routing notation of the IPv6 | - - - -### Delete IPv6 block - -Delete IPv6 block subnet with the given ID. - -**Usage:** - -``` -scw dedibox ipv6-block delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| block-id | Required | ID of the IPv6 block to delete | - - - -### Get a specific IPv6 block - -Get the IPv6 block associated with the given ID. - -**Usage:** - -``` -scw dedibox ipv6-block get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | Default: `` | ID of the project | - - - -### Get IPv6 block quota - -Get IPv6 block quota with the given project ID. -/48 one per organization. -/56 link to your number of server. -/64 link to your number of failover IP. - -**Usage:** - -``` -scw dedibox ipv6-block get-quota [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | Default: `` | ID of the project | - - - -### List available IPv6 block subnets - -List all available IPv6 block subnets for given IP ID. - -**Usage:** - -``` -scw dedibox ipv6-block list-subnet [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| block-id | Required | ID of the IPv6 block | - - - -### Update IPv6 block - -Update DNS associated to IPv6 block. -If DNS is used, minimum of 2 is necessary and maximum of 5 (no duplicate). - -**Usage:** - -``` -scw dedibox ipv6-block update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| block-id | Required | ID of the IPv6 block | -| nameservers.{index} | | DNS to link to the IPv6 | - - - -## Offer commands - -Offer commands. - - -### Get offer - -Return specific offer for the given ID. - -**Usage:** - -``` -scw dedibox offer get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | Required | ID of offer | -| project-id | Default: `` | Project ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List offers - -List all available server offers. - -**Usage:** - -``` -scw dedibox offer list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `price_asc`, `price_desc` | Order of the offers | -| commercial-range | | Filter on commercial range | -| catalog | One of: `all`, `default`, `beta`, `reseller`, `premium`, `volume`, `admin`, `inactive` | Filter on catalog | -| project-id | Default: `` | Project ID | -| is-failover-ip | | Get the current failover IP offer | -| is-failover-block | | Get the current failover IP block offer | -| sold-in | | Filter offers depending on their datacenter | -| available-only | | Set this filter to true to only return available offers | -| is-rpn-san | | Get the RPN SAN offers | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Subscribable server options commands - -Subscribable server options commands. - - -### List subscribable server options - -List subscribable options associated to the given server ID. - -**Usage:** - -``` -scw dedibox option list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID of the subscribable server options | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Subscribe server option - -Subscribe option for the given server ID. - -**Usage:** - -``` -scw dedibox option subscribe [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to subscribe server option | -| option-id | | Option ID to subscribe | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Subscribe storage server option - -Subscribe storage option for the given server ID. - -**Usage:** - -``` -scw dedibox option subscribe-storage [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID of the storage options to subscribe | -| options-ids.{index} | Required | Option IDs of the storage options to subscribe | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## OS commands - -OS commands. - - -### Get an OS with a given ID - -Return specific OS for the given ID. - -**Usage:** - -``` -scw dedibox os get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| os-id | Required | ID of the OS | -| server-id | | ID of the server | -| project-id | | Project ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List all available OS that can be install on a baremetal server - -List all available OS that can be install on a baremetal server. - -**Usage:** - -``` -scw dedibox os list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `released_at_asc`, `released_at_desc` | Order of the OS | -| type | One of: `unknown_type`, `server`, `virtu`, `panel`, `desktop`, `custom`, `rescue` | Type of the OS | -| server-id | | Filter OS by compatible server ID | -| project-id | Default: `` | Project ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## RAID commands - -RAID commands. - - -### Get raid - -Return raid for the given server ID. - -**Usage:** - -``` -scw dedibox raid get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Update RAID - -Update RAID associated with the given server ID. - -**Usage:** - -``` -scw dedibox raid update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| raid-arrays.{index}.raid-level | One of: `no_raid`, `raid0`, `raid1`, `raid5`, `raid6`, `raid10` | The RAID level | -| raid-arrays.{index}.disk-ids.{index} | Required | The list of Disk ID of the updatable RAID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## Rescue commands - -Rescue commands. - - -### Get rescue information - -Return rescue information for the given server ID. - -**Usage:** - -``` -scw dedibox rescue get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to get rescue | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Start in rescue baremetal server - -Start in rescue the server associated with the given ID. - -**Usage:** - -``` -scw dedibox rescue start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to start rescue | -| os-id | | OS ID to use to start rescue | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Stop rescue on baremetal server - -Stop rescue on the server associated with the given ID. - -**Usage:** - -``` -scw dedibox rescue stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to stop rescue | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## Reverse-IP commands - -Reverse-IP commands. - - -### Update reverse of ip - -Update reverse of ip associated with the given ID. - -**Usage:** - -``` -scw dedibox reverse-ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the IP | -| reverse | | Reverse to apply on the IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## RPN's information commands - -RPN's information commands. - - -### Get dedibox resources - -Get dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-info get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | Default: `` | A project ID | -| rpnv1-group-id | | An RPN v1 group ID | -| rpnv2-group-id | | An RPN v2 group ID | - - - -### List dedibox resources - -List dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-info list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | -| project-id | Default: `` | Filter servers by project ID | - - - -## RPN V1 commands - -RPN V1 commands. - - -### Accept-invite dedibox resources - -Accept-invite dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 accept-invite [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| member-id | Required | The member ID | - - - -### Add-members dedibox resources - -Add-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 add-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | The rpn v1 group ID | -| server-ids.{index} | | A collection of rpn v1 capable server IDs | -| san-server-ids.{index} | | A collection of rpn v1 capable RPN SAN server IDs | - - - -### Create dedibox resources - -Create dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | Rpn v1 group name | -| server-ids.{index} | | A collection of rpn v1 capable servers | -| san-server-ids.{index} | | A collection of rpn v1 capable rpn sans servers | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Delete dedibox resources - -Delete dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | Rpn v1 group ID | - - - -### Delete-members dedibox resources - -Delete-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 delete-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | The rpn v1 group ID | -| member-ids.{index} | Required | A collection of rpn v1 group members IDs | - - - -### Get dedibox resources - -Get dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | Rpn v1 group ID | - - - -### Invite dedibox resources - -Invite dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 invite [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | The RPN V1 group ID | -| server-ids.{index} | Required | A collection of external server IDs | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Leave dedibox resources - -Leave dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 leave [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | The RPN V1 group ID | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| member-ids.{index} | Required | A collection of rpn v1 group members IDs | - - - -### List dedibox resources - -List dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v1 groups | -| project-id | Default: `` | Filter rpn v1 groups by project ID | - - - -### List-capable-san-server dedibox resources - -List-capable-san-server dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 list-capable-san-server [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | -| project-id | Default: `` | Filter rpn capable resources by project ID | - - - -### List-capable-server dedibox resources - -List-capable-server dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 list-capable-server [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | -| project-id | Default: `` | Filter rpn capable resources by project ID | - - - -### List-invites dedibox resources - -List-invites dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 list-invites [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn capable resources | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### List-members dedibox resources - -List-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 list-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v1 group members | -| group-id | Required | Filter rpn v1 group members by group ID | -| project-id | Default: `` | A project ID | - - - -### Refuse-invite dedibox resources - -Refuse-invite dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 refuse-invite [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| member-id | Required | The member ID | - - - -### Update dedibox resources - -Update dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v1 update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | Rpn v1 group ID | -| name | Required | New rpn v1 group name | - - - -## - - - - -### Add-members dedibox resources - -Add-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 add-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | -| servers.{index} | Required | A collection of server IDs | - - - -### Create dedibox resources - -Create dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| type | One of: `unknown_type`, `standard`, `qinq` | RPN V2 group type (qing / standard) | -| name | | RPN V2 group name | -| servers.{index} | Required | A collection of server IDs | - - - -### Delete dedibox resources - -Delete dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | - - - -### Delete-members dedibox resources - -Delete-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 delete-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | -| member-ids.{index} | Required | A collection of member IDs | - - - -### Disable-compatibility dedibox resources - -Disable-compatibility dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 disable-compatibility [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | - - - -### Enable-compatibility dedibox resources - -Enable-compatibility dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 enable-compatibility [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | -| rpnv1-group-id | | RPN V1 group ID | - - - -### Get dedibox resources - -Get dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | - - - -### List dedibox resources - -List dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 groups | -| project-id | Default: `` | Filter rpn v2 groups by project ID | - - - -### List-capable-resources dedibox resources - -List-capable-resources dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 list-capable-resources [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 capable resources | -| project-id | Default: `` | Filter rpn v2 capable resources by project ID | - - - -### List-logs dedibox resources - -List-logs dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 list-logs [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 group logs | -| group-id | Required | RPN V2 group ID | - - - -### List-members dedibox resources - -List-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 list-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the rpn v2 group members | -| group-id | Required | RPN V2 group ID | -| type | One of: `unknown_type`, `rpnv1_group`, `server` | Filter members by type | - - - -### Update dedibox resources - -Update dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | -| name | | RPN V2 group name | - - - -### Update-vlan-members dedibox resources - -Update-vlan-members dedibox resources. - -**Usage:** - -``` -scw dedibox rpn-v2 update-vlan-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | RPN V2 group ID | -| member-ids.{index} | Required | RPN V2 member IDs | -| vlan | | A vlan | - - - -## RPN SAN (Storage Area Network) commands - -RPN SAN (Storage Area Network) commands. - - -### Add-ip dedibox resources - -Add-ip dedibox resources. - -**Usage:** - -``` -scw dedibox san add-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | -| ip-ids.{index} | Required | An array of IP ID | - - - -### Create dedibox resources - -Create dedibox resources. - -**Usage:** - -``` -scw dedibox san create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | Required | Offer ID | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Delete dedibox resources - -Delete dedibox resources. - -**Usage:** - -``` -scw dedibox san delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | - - - -### Get dedibox resources - -Get dedibox resources. - -**Usage:** - -``` -scw dedibox san get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | - - - -### List dedibox resources - -List dedibox resources. - -**Usage:** - -``` -scw dedibox san list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the RPN SANs | -| project-id | Default: `` | Filter RPN SANs by project ID | - - - -### List-available-ips dedibox resources - -List-available-ips dedibox resources. - -**Usage:** - -``` -scw dedibox san list-available-ips [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | -| type | One of: `unknown`, `server_ip`, `rpnv2_subnet` | Filter by IP type (server | rpnv2_subnet) | - - - -### List-ips dedibox resources - -List-ips dedibox resources. - -**Usage:** - -``` -scw dedibox san list-ips [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | -| type | One of: `unknown`, `server_ip`, `rpnv2_subnet` | Filter by IP type (server | rpnv2_subnet) | - - - -### Remove-ip dedibox resources - -Remove-ip dedibox resources. - -**Usage:** - -``` -scw dedibox san remove-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| rpn-san-id | Required | RPN SAN ID | -| ip-ids.{index} | Required | An array of IP ID | - - - -## Baremetal server commands - -Baremetal server commands. - - -### Cancels the current (running) server installation - -Cancels the current server installation associated with the given server ID. - -**Usage:** - -``` -scw dedibox server cancel-install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID of the server to cancel install | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Create a baremetal server - -Create a new baremetal server. The order return you a service ID to follow the provisionning status you could call GetService. - -**Usage:** - -``` -scw dedibox server create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | | Offer ID of the new server | -| server-option-ids.{index} | Required | Server option IDs of the new server | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| datacenter-name | | Datacenter name of the new server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a baremetal server - -Delete the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a specific baremetal server - -Get the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a specific server installation status - -Get the server installation status associated with the given server ID. - -**Usage:** - -``` -scw dedibox server get-install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID of the server to install | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get server default partitioning - -Get the server default partitioning schema associated with the given server ID and OS ID. - -**Usage:** - -``` -scw dedibox server get-partitioning [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| os-id | Required | OS ID of the default partitioning | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Install a baremetal server - -Install an OS on the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to install | -| os-id | | OS ID to install on the server | -| hostname | | Hostname of the server | -| user-login | | User to install on the server | -| user-password | | User password to install on the server | -| panel-password | | Panel password to install on the server | -| root-password | | Root password to install on the server | -| partitions.{index}.file-system | One of: `unknown`, `efi`, `swap`, `ext4`, `ext3`, `ext2`, `xfs`, `ntfs`, `fat32`, `ufs` | File system of the installation partition | -| partitions.{index}.mount-point | | Mount point of the installation partition | -| partitions.{index}.raid-level | One of: `no_raid`, `raid0`, `raid1`, `raid5`, `raid6`, `raid10` | RAID level of the installation partition | -| partitions.{index}.capacity | | Capacity of the installation partition | -| partitions.{index}.connectors.{index} | | Connectors of the installation partition | -| ssh-key-ids.{index} | | SSH key IDs authorized on the server | -| license-offer-id | | Offer ID of license to install on server | -| ip-id | | IP to link at the license to install on server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List baremetal servers for project - -List baremetal servers for project. - -**Usage:** - -``` -scw dedibox server list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the servers | -| project-id | Required
Default: `` | Filter servers by project ID | -| search | | Filter servers by hostname | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### List server disks - -List disks associated to the given server ID. - -**Usage:** - -``` -scw dedibox server list-disks [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server disks | -| server-id | Required | Server ID of the server disks | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### List server events - -List events associated to the given server ID. - -**Usage:** - -``` -scw dedibox server list-events [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the server events | -| server-id | Required | Server ID of the server events | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Reboot a baremetal server - -Reboot the server associated with the given ID, use boot param to reboot in rescue. - -**Usage:** - -``` -scw dedibox server reboot [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to reboot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Start a baremetal server - -Start the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to start | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Stop a baremetal server - -Stop the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to stop | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a baremetal server - -Update the server associated with the given ID. - -**Usage:** - -``` -scw dedibox server update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to update | -| hostname | | Hostname of the server to update | -| enable-ipv6 | | Flag to enable or not the IPv6 of server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## Service commands - -Service commands. - - -### Delete a specific service - -Delete the service associated with the given ID. - -**Usage:** - -``` -scw dedibox service delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| service-id | Required | ID of the service | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a specific service - -Get the service associated with the given ID. - -**Usage:** - -``` -scw dedibox service get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| service-id | Required | ID of the service | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List services - -List services. - -**Usage:** - -``` -scw dedibox service list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the services | -| project-id | Default: `` | Project ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/dns.md b/docs/docs/dns.md deleted file mode 100644 index c9d28e6a2e..0000000000 --- a/docs/docs/dns.md +++ /dev/null @@ -1,746 +0,0 @@ - -# Documentation for `scw dns` -This API allows you to manage your domains, DNS zones and records. - -- [TLS certificate management](#tls-certificate-management) - - [Create or get the DNS zone's TLS certificate](#create-or-get-the-dns-zone's-tls-certificate) - - [Delete a TLS certificate](#delete-a-tls-certificate) - - [Get a DNS zone's TLS certificate](#get-a-dns-zone's-tls-certificate) - - [List a user's TLS certificates](#list-a-user's-tls-certificates) -- [DNS records management](#dns-records-management) - - [Add a new DNS record](#add-a-new-dns-record) - - [Update records within a DNS zone](#update-records-within-a-dns-zone) - - [Clear records within a DNS zone](#clear-records-within-a-dns-zone) - - [Delete a DNS record](#delete-a-dns-record) - - [List records within a DNS zone](#list-records-within-a-dns-zone) - - [List name servers within a DNS zone](#list-name-servers-within-a-dns-zone) - - [Update a DNS record](#update-a-dns-record) - - [Update name servers within a DNS zone](#update-name-servers-within-a-dns-zone) -- [Transaction SIGnature key management](#transaction-signature-key-management) - - [Delete the DNS zone's TSIG key](#delete-the-dns-zone's-tsig-key) - - [Get the DNS zone's TSIG key](#get-the-dns-zone's-tsig-key) -- [DNS zones version management](#dns-zones-version-management) - - [Access differences from a specific DNS zone version](#access-differences-from-a-specific-dns-zone-version) - - [List versions of a DNS zone](#list-versions-of-a-dns-zone) - - [Restore a DNS zone version](#restore-a-dns-zone-version) - - [List records from a given version of a specific DNS zone](#list-records-from-a-given-version-of-a-specific-dns-zone) -- [DNS Zones management](#dns-zones-management) - - [Clone a DNS zone](#clone-a-dns-zone) - - [Create a DNS zone](#create-a-dns-zone) - - [Delete a DNS zone](#delete-a-dns-zone) - - [Export a raw DNS zone](#export-a-raw-dns-zone) - - [Import a raw DNS zone](#import-a-raw-dns-zone) - - [List DNS zones](#list-dns-zones) - - [Refresh a DNS zone](#refresh-a-dns-zone) - - [Update a DNS zone](#update-a-dns-zone) - - -## TLS certificate management - -TLS certificate management. - - -### Create or get the DNS zone's TLS certificate - -Create a new TLS certificate or retrieve information about an existing TLS certificate. - -**Usage:** - -``` -scw dns certificate create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | -| alternative-dns-zones.{index} | | | - - - -### Delete a TLS certificate - -Delete an existing TLS certificate specified by its DNS zone. Deleting a TLS certificate is permanent and cannot be undone. - -**Usage:** - -``` -scw dns certificate delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | - - - -### Get a DNS zone's TLS certificate - -Get the DNS zone's TLS certificate. If you do not have a certificate, the ouptut returns `no certificate found`. - -**Usage:** - -``` -scw dns certificate get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | - - - -### List a user's TLS certificates - -List all the TLS certificates a user has created, specified by the user's Project ID and the DNS zone. - -**Usage:** - -``` -scw dns certificate list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | -| project-id | | | - - - -## DNS records management - -DNS records management. - - -### Add a new DNS record - - - -**Usage:** - -``` -scw dns record add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone in which to add the record | -| data | Required | | -| name | | | -| priority | | | -| ttl | Required
Default: `3600` | | -| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | -| comment | | | -| geo-ip-config.matches.{index}.countries.{index} | | | -| geo-ip-config.matches.{index}.continents.{index} | | | -| geo-ip-config.matches.{index}.data | | | -| geo-ip-config.default | | | -| http-service-config.ips.{index} | | | -| http-service-config.must-contain | | | -| http-service-config.url | | | -| http-service-config.user-agent | | | -| http-service-config.strategy | One of: `random`, `hashed` | | -| weighted-config.weighted-ips.{index}.ip | | | -| weighted-config.weighted-ips.{index}.weight | | | -| view-config.views.{index}.subnet | | | -| view-config.views.{index}.data | | | - - -**Examples:** - - -Add a CNAME -``` -scw dns record add my-domain.tld data=www name=www2 type=CNAME -``` - -Add an IP -``` -scw dns record add my-domain.tld data=1.2.3.4 name=vpn type=A -``` - - - - -### Update records within a DNS zone - -Update records within a DNS zone that has default name servers and perform several actions on your records. - -Actions include: - - add: allows you to add a new record or add a new IP to an existing A record, for example - - set: allows you to edit a record or edit an IP from an existing A record, for example - - delete: allows you to delete a record or delete an IP from an existing A record, for example - - clear: allows you to delete all records from a DNS zone - -All edits will be versioned. - -**Usage:** - -``` -scw dns record bulk-update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone in which to update the DNS zone records | -| changes.{index}.add.records.{index}.data | | | -| changes.{index}.add.records.{index}.name | | | -| changes.{index}.add.records.{index}.priority | | | -| changes.{index}.add.records.{index}.ttl | | | -| changes.{index}.add.records.{index}.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | -| changes.{index}.add.records.{index}.comment | | | -| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.countries.{index} | | | -| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.continents.{index} | | | -| changes.{index}.add.records.{index}.geo-ip-config.matches.{index}.data | | | -| changes.{index}.add.records.{index}.geo-ip-config.default | | | -| changes.{index}.add.records.{index}.http-service-config.ips.{index} | | | -| changes.{index}.add.records.{index}.http-service-config.must-contain | | | -| changes.{index}.add.records.{index}.http-service-config.url | | | -| changes.{index}.add.records.{index}.http-service-config.user-agent | | | -| changes.{index}.add.records.{index}.http-service-config.strategy | One of: `random`, `hashed`, `all` | | -| changes.{index}.add.records.{index}.weighted-config.weighted-ips.{index}.ip | | | -| changes.{index}.add.records.{index}.weighted-config.weighted-ips.{index}.weight | | | -| changes.{index}.add.records.{index}.view-config.views.{index}.subnet | | | -| changes.{index}.add.records.{index}.view-config.views.{index}.data | | | -| changes.{index}.add.records.{index}.id | | | -| changes.{index}.set.id | | | -| changes.{index}.set.id-fields.name | | | -| changes.{index}.set.id-fields.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | -| changes.{index}.set.id-fields.data | | | -| changes.{index}.set.id-fields.ttl | | | -| changes.{index}.set.records.{index}.data | | | -| changes.{index}.set.records.{index}.name | | | -| changes.{index}.set.records.{index}.priority | | | -| changes.{index}.set.records.{index}.ttl | | | -| changes.{index}.set.records.{index}.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | -| changes.{index}.set.records.{index}.comment | | | -| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.countries.{index} | | | -| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.continents.{index} | | | -| changes.{index}.set.records.{index}.geo-ip-config.matches.{index}.data | | | -| changes.{index}.set.records.{index}.geo-ip-config.default | | | -| changes.{index}.set.records.{index}.http-service-config.ips.{index} | | | -| changes.{index}.set.records.{index}.http-service-config.must-contain | | | -| changes.{index}.set.records.{index}.http-service-config.url | | | -| changes.{index}.set.records.{index}.http-service-config.user-agent | | | -| changes.{index}.set.records.{index}.http-service-config.strategy | One of: `random`, `hashed`, `all` | | -| changes.{index}.set.records.{index}.weighted-config.weighted-ips.{index}.ip | | | -| changes.{index}.set.records.{index}.weighted-config.weighted-ips.{index}.weight | | | -| changes.{index}.set.records.{index}.view-config.views.{index}.subnet | | | -| changes.{index}.set.records.{index}.view-config.views.{index}.data | | | -| changes.{index}.set.records.{index}.id | | | -| changes.{index}.delete.id | | | -| changes.{index}.delete.id-fields.name | | | -| changes.{index}.delete.id-fields.type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | | -| changes.{index}.delete.id-fields.data | | | -| changes.{index}.delete.id-fields.ttl | | | -| return-all-records | | Specifies whether or not to return all the records | -| disallow-new-zone-creation | | Disable the creation of the target zone if it does not exist. Target zone creation is disabled by default | -| serial | | Use the provided serial (0) instead of the auto-increment serial | - - - -### Clear records within a DNS zone - -Delete all records within a DNS zone that has default name servers.
-All edits will be versioned. - -**Usage:** - -``` -scw dns record clear [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to clear | - - - -### Delete a DNS record - - - -**Usage:** - -``` -scw dns record delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone in which to delete the record | -| data | | | -| name | | | -| ttl | | | -| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | - - -**Examples:** - - -Delete a CNAME -``` -scw dns record delete my-domain.tld name=www type=CNAME -``` - -Delete a single IP from a record with more than one -``` -scw dns record delete my-domain.tld data=1.2.3.4 name=vpn type=A -``` - - - - -### List records within a DNS zone - -Retrieve a list of DNS records within a DNS zone that has default name servers. -You can filter records by type and name. - -**Usage:** - -``` -scw dns record list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID on which to filter the returned DNS zone records | -| order-by | One of: `name_asc`, `name_desc` | Sort order of the returned DNS zone records | -| dns-zone | Required | DNS zone on which to filter the returned DNS zone records | -| name | | Name on which to filter the returned DNS zone records | -| type | One of: `unknown`, `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR`, `DNAME`, `SVCB`, `HTTPS` | Record type on which to filter the returned DNS zone records | -| id | | Record ID on which to filter the returned DNS zone records | - - - -### List name servers within a DNS zone - -Retrieve a list of name servers within a DNS zone and their optional glue records. - -**Usage:** - -``` -scw dns record list-nameservers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID on which to filter the returned DNS zone name servers | -| dns-zone | Required | DNS zone on which to filter the returned DNS zone name servers | - - - -### Update a DNS record - -This command will replace all the data for this record with the given values. - -**Usage:** - -``` -scw dns record set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone in which to set the record | -| values.{index} | Required | A list of values for replacing the record data. (multiple values cannot be used for all type) | -| name | Required | | -| priority | | | -| ttl | Required
Default: `3600` | | -| type | Required
One of: `A`, `AAAA`, `CNAME`, `TXT`, `SRV`, `TLSA`, `MX`, `NS`, `PTR`, `CAA`, `ALIAS`, `LOC`, `SSHFP`, `HINFO`, `RP`, `URI`, `DS`, `NAPTR` | | -| comment | | | -| geo-ip-config.matches.{index}.countries.{index} | | | -| geo-ip-config.matches.{index}.continents.{index} | | | -| geo-ip-config.matches.{index}.data | | | -| geo-ip-config.default | | | -| http-service-config.ips.{index} | | | -| http-service-config.must-contain | | | -| http-service-config.url | | | -| http-service-config.user-agent | | | -| http-service-config.strategy | One of: `random`, `hashed` | | -| weighted-config.weighted-ips.{index}.ip | | | -| weighted-config.weighted-ips.{index}.weight | | | -| view-config.views.{index}.subnet | | | -| view-config.views.{index}.data | | | - - -**Examples:** - - -Add or replace a CNAME -``` -scw dns record set my-domain.tld values.0=www name=www2 type=CNAME -``` - -Add or replace a list of IP -``` -scw dns record set my-domain.tld values.0=1.2.3.4 values.1=1.2.3.5 name=vpn type=A -``` - - - - -### Update name servers within a DNS zone - -Update name servers within a DNS zone and set optional glue records. - -**Usage:** - -``` -scw dns record update-nameservers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone in which to update the DNS zone name servers | -| ns.{index}.name | | | -| ns.{index}.ip.{index} | | | - - - -## Transaction SIGnature key management - -Transaction SIGnature key management. - - -### Delete the DNS zone's TSIG key - -Delete an existing TSIG key specified by its DNS zone. Deleting a TSIG key is permanent and cannot be undone. - -**Usage:** - -``` -scw dns tsig-key delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | - - - -### Get the DNS zone's TSIG key - -Retrieve information about the TSIG key of a given DNS zone to allow AXFR requests. - -**Usage:** - -``` -scw dns tsig-key get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | - - - -## DNS zones version management - -DNS zones version management. - - -### Access differences from a specific DNS zone version - -Access a previous DNS zone version to see the differences from another specific version. - -**Usage:** - -``` -scw dns version diff [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone-version-id | Required | | - - - -### List versions of a DNS zone - -Retrieve a list of a DNS zone's versions.
-The maximum version count is 100. If the count reaches this limit, the oldest version will be deleted after each new modification. - -**Usage:** - -``` -scw dns version list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | | - - - -### Restore a DNS zone version - -Restore and activate a version of a specific DNS zone. - -**Usage:** - -``` -scw dns version restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone-version-id | Required | | - - - -### List records from a given version of a specific DNS zone - -Retrieve a list of records from a specific DNS zone version. - -**Usage:** - -``` -scw dns version show [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone-version-id | Required | | - - - -## DNS Zones management - -DNS Zones management. - - -### Clone a DNS zone - -Clone an existing DNS zone with all its records into a new DNS zone. - -**Usage:** - -``` -scw dns zone clone [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to clone | -| dest-dns-zone | Required | Destination DNS zone in which to clone the chosen DNS zone | -| overwrite | | Specifies whether or not the destination DNS zone will be overwritten | -| project-id | | Project ID of the destination DNS zone | - - - -### Create a DNS zone - -Create a new DNS zone specified by the domain name, the subdomain and the Project ID. - -**Usage:** - -``` -scw dns zone create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain | Required | Domain in which to crreate the DNS zone | -| subdomain | Required | Subdomain of the DNS zone to create | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Delete a DNS zone - -Delete a DNS zone and all its records. - -**Usage:** - -``` -scw dns zone delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to delete | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - -### Export a raw DNS zone - -Export a DNS zone with default name servers, in a specific format. - -**Usage:** - -``` -scw dns zone export [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to export | -| format | Default: `bind`
One of: `unknown_raw_format`, `bind` | DNS zone format | - - - -### Import a raw DNS zone - -Import and replace the format of records from a given provider, with default name servers. - -**Usage:** - -``` -scw dns zone import [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to import | -| ~~content~~ | Deprecated | | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| ~~format~~ | Deprecated
One of: `unknown_raw_format`, `bind` | | -| bind-source.content | | | -| axfr-source.name-server | | | -| axfr-source.tsig-key.name | | | -| axfr-source.tsig-key.key | | | -| axfr-source.tsig-key.algorithm | | | - - - -### List DNS zones - -Retrieve the list of DNS zones you can manage and filter DNS zones associated with specific domain names. - -**Usage:** - -``` -scw dns zone list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID on which to filter the returned DNS zones | -| order-by | One of: `domain_asc`, `domain_desc`, `subdomain_asc`, `subdomain_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Sort order of the returned DNS zones | -| domain | | Domain on which to filter the returned DNS zones | -| ~~dns-zone~~ | Deprecated | DNS zone on which to filter the returned DNS zones | -| dns-zones.{index} | | DNS zones on which to filter the returned DNS zones | -| created-after | | Only list DNS zones created after this date | -| created-before | | Only list DNS zones created before this date | -| updated-after | | Only list DNS zones updated after this date | -| updated-before | | Only list DNS zones updated before this date | -| organization-id | | Organization ID on which to filter the returned DNS zones | - - - -### Refresh a DNS zone - -Refresh an SOA DNS zone to reload the records in the DNS zone and update the SOA serial. -You can recreate the given DNS zone and its sub DNS zone if needed. - -**Usage:** - -``` -scw dns zone refresh [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to refresh | -| recreate-dns-zone | | Specifies whether or not to recreate the DNS zone | -| recreate-sub-dns-zone | | Specifies whether or not to recreate the sub DNS zone | - - - -### Update a DNS zone - -Update the name and/or the Organizations for a DNS zone. - -**Usage:** - -``` -scw dns zone update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-zone | Required | DNS zone to update | -| new-dns-zone | Required | Name of the new DNS zone to create | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - - diff --git a/docs/docs/document-db.md b/docs/docs/document-db.md deleted file mode 100644 index abd10bb3b3..0000000000 --- a/docs/docs/document-db.md +++ /dev/null @@ -1,1217 +0,0 @@ - -# Documentation for `scw document-db` -This API allows you to manage your Document Databases. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) - - [Add an ACL rule to a Database Instance](#add-an-acl-rule-to-a-database-instance) - - [Delete ACL rules of a Database Instance](#delete-acl-rules-of-a-database-instance) - - [List ACL rules of a Database Instance](#list-acl-rules-of-a-database-instance) - - [Set ACL rules for a Database Instance](#set-acl-rules-for-a-database-instance) -- [Database management commands](#database-management-commands) - - [Create a database in a Database Instance](#create-a-database-in-a-database-instance) - - [Delete a database in a Database Instance](#delete-a-database-in-a-database-instance) - - [List databases in a Database Instance](#list-databases-in-a-database-instance) -- [Endpoint management](#endpoint-management) - - [Create a new Database Instance endpoint](#create-a-new-database-instance-endpoint) - - [Delete a Database Instance endpoint](#delete-a-database-instance-endpoint) - - [Get a Database Instance endpoint](#get-a-database-instance-endpoint) - - [Migrate Database Instance endpoint](#migrate-database-instance-endpoint) -- [Database engines commands](#database-engines-commands) - - [List available database engines](#list-available-database-engines) -- [Instance management commands](#instance-management-commands) - - [Clone a Database Instance](#clone-a-database-instance) - - [Create a Database Instance](#create-a-database-instance) - - [Delete a Database Instance](#delete-a-database-instance) - - [Get a Database Instance](#get-a-database-instance) - - [Get the TLS certificate of a Database Instance](#get-the-tls-certificate-of-a-database-instance) - - [Get Database Instance metrics](#get-database-instance-metrics) - - [List Database Instances](#list-database-instances) - - [Renew the TLS certificate of a Database Instance](#renew-the-tls-certificate-of-a-database-instance) - - [Restart Database Instance](#restart-database-instance) - - [Update a Database Instance](#update-a-database-instance) - - [Upgrade a Database Instance](#upgrade-a-database-instance) -- [Instance logs management commands](#instance-logs-management-commands) - - [Get given logs of a Database Instance](#get-given-logs-of-a-database-instance) - - [List available logs of a Database Instance](#list-available-logs-of-a-database-instance) - - [List remote Database Instance logs details](#list-remote-database-instance-logs-details) - - [Purge remote Database Instance logs](#purge-remote-database-instance-logs) -- [Node types management commands](#node-types-management-commands) - - [List available node types](#list-available-node-types) -- [User privileges management commands](#user-privileges-management-commands) - - [List user privileges for a database](#list-user-privileges-for-a-database) - - [Set user privileges for a database](#set-user-privileges-for-a-database) -- [Read replica management](#read-replica-management) - - [Create a Read Replica](#create-a-read-replica) - - [Create an endpoint for a Read Replica](#create-an-endpoint-for-a-read-replica) - - [Delete a Read Replica](#delete-a-read-replica) - - [Get a Read Replica](#get-a-read-replica) - - [Resync a Read Replica](#resync-a-read-replica) -- [Setting management](#setting-management) - - [Add Database Instance advanced settings](#add-database-instance-advanced-settings) - - [Delete Database Instance advanced settings](#delete-database-instance-advanced-settings) - - [Set Database Instance advanced settings](#set-database-instance-advanced-settings) -- [Block snapshot management](#block-snapshot-management) - - [Create a Database Instance snapshot](#create-a-database-instance-snapshot) - - [Delete a Database Instance snapshot](#delete-a-database-instance-snapshot) - - [Get a Database Instance snapshot](#get-a-database-instance-snapshot) - - [List snapshots](#list-snapshots) - - [Create a new Database Instance from a snapshot](#create-a-new-database-instance-from-a-snapshot) - - [Update a Database Instance snapshot](#update-a-database-instance-snapshot) -- [User management commands](#user-management-commands) - - [Create a user for a Database Instance](#create-a-user-for-a-database-instance) - - [Delete a user on a Database Instance](#delete-a-user-on-a-database-instance) - - [List users of a Database Instance](#list-users-of-a-database-instance) - - [Update a user on a Database Instance](#update-a-user-on-a-database-instance) - - -## Access Control List (ACL) management commands - -Network Access Control Lists allow you to control incoming network traffic by setting up ACL rules. - - -### Add an ACL rule to a Database Instance - -Add an additional ACL rule to a Database Instance. - -**Usage:** - -``` -scw document-db acl add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to add ACL rules to | -| rules.{index}.ip | | | -| rules.{index}.description | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete ACL rules of a Database Instance - -Delete one or more ACL rules of a Database Instance. - -**Usage:** - -``` -scw document-db acl delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to delete an ACL rule from | -| acl-rule-ips.{index} | Required | IP addresses defined in the ACL rules of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List ACL rules of a Database Instance - -List the ACL rules for a given Database Instance. The response is an array of ACL objects, each one representing an ACL that denies, allows or redirects traffic based on certain conditions. - -**Usage:** - -``` -scw document-db acl list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set ACL rules for a Database Instance - -Replace all the ACL rules of a Database Instance. - -**Usage:** - -``` -scw document-db acl set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where the ACL rules must be set | -| rules.{index}.ip | | | -| rules.{index}.description | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Database management commands - -Databases can be used to store and manage sets of structured information, or data. The interaction between the user and a database is done using a Database Engine, which provides a structured query language to add, modify or delete information from the database. - - -### Create a database in a Database Instance - -Create a new database. You must define the `name` parameter in the request. - -**Usage:** - -``` -scw document-db database create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where to create the database | -| name | | Name of the database | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a database in a Database Instance - -Delete a given database on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the database you want to delete. - -**Usage:** - -``` -scw document-db database delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where to delete the database | -| name | Required | Name of the database to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List databases in a Database Instance - -List all databases of a given Database Instance. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `name`, `managed` and `owner`. - -**Usage:** - -``` -scw document-db database list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the database | -| managed | | Defines whether or not the database is managed | -| owner | | User that owns this database | -| order-by | One of: `name_asc`, `name_desc`, `size_asc`, `size_desc` | Criteria to use when ordering database listing | -| instance-id | Required | UUID of the Database Instance to list the databases of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Endpoint management - -A point of connection to a Database Instance. The endpoint is associated with an IPv4 address and a port. It contains the information about whether the endpoint is read-write or not. The endpoints always point to the main node of a Database Instance. - -All endpoints have TLS enabled. You can use TLS to make your data and your passwords unreadable in transit to anyone but you. - -For added security, you can set up ACL rules to restrict access to your endpoint to a set of trusted hosts or networks of your choice. - -Load Balancers are used to forward traffic to the right node based on the node state (active/hot standby). The Load Balancers' configuration is set to cut off inactive connections if no TCP traffic is sent within a 6-hour timeframe. We recommend using connection pooling on the application side to renew database connections regularly. - - -### Create a new Database Instance endpoint - -Create a new endpoint for a Database Instance. You can add `load_balancer` and `private_network` specifications to the body of the request. - -**Usage:** - -``` -scw document-db endpoint create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you to which you want to add an endpoint | -| endpoint-spec.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | -| endpoint-spec.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance endpoint - -Delete the endpoint of a Database Instance. You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. - -**Usage:** - -``` -scw document-db endpoint delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance endpoint - -Retrieve information about a Database Instance endpoint. Full details about the endpoint, like `ip`, `port`, `private_network` and `load_balancer` specifications are returned in the response. - -**Usage:** - -``` -scw document-db endpoint get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Migrate Database Instance endpoint - -Migrate an existing Database Instance endpoint to another Database Instance. - -**Usage:** - -``` -scw document-db endpoint migrate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to migrate | -| instance-id | Required | UUID of the instance you want to attach the endpoint to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Database engines commands - -A database engine is the software component that stores and retrieves your data from a database. Currently FerretDB 1.X is available. - - -### List available database engines - -List the FerretDB database engines available at Scaleway. - -**Usage:** - -``` -scw document-db engine list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the database engine | -| version | | Version of the database engine | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Instance management commands - -A Database Instance is made up of one or multiple dedicated compute nodes running a single database engine. Two node settings are available: **High-Availability (HA)**, with a main node and one replica, and **standalone** with a main node. The HA standby node is linked to the main node, using synchronous replication. Synchronous replication offers the ability to confirm that all changes intended by a transaction have been transferred and applied to the synchronous replica node, providing durability to the data. - -**Note**: HA standby nodes are not accessible to users unless the main node becomes unavailable and the standby takes over. If you wish to run queries on a read-only node, you can use [Read Replicas](#path-read-replicas-create-a-read-replica) - -Read Replicas can be used for certain read-only workflows such as Business Intelligence, or for a read-only scaling of your application. Read Replicas use asynchronous replication to replicate data from the main node. - - -### Clone a Database Instance - -Clone a given Database Instance, specified by the `region` and `instance_id` parameters. The clone feature allows you to create a new Database Instance from an existing one. The clone includes all existing databases, users and permissions. You can create a clone on a Database Instance bigger than your current one. - -**Usage:** - -``` -scw document-db instance clone [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to clone | -| name | | Name of the Database Instance clone | -| node-type | | Node type of the clone | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create a Database Instance - -Create a new Database Instance. You must set the `engine`, `user_name`, `password` and `node_type` parameters. Optionally, you can specify the volume type and size. - -**Usage:** - -``` -scw document-db instance create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name of the Database Instance | -| engine | Required | Database engine of the Database Instance | -| user-name | Required | Username created when the Database Instance is created | -| password | Required | Password of the user | -| node-type | Required | Type of node to use for the Database Instance | -| is-ha-cluster | | Defines whether or not High-Availability is enabled | -| disable-backup | | Defines whether or not backups are disabled | -| tags.{index} | | Tags to apply to the Database Instance | -| init-settings.{index}.name | | | -| init-settings.{index}.value | | | -| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Type of volume where data is stored (lssd, bssd, ...) | -| volume-size | | Volume size when volume_type is not lssd | -| init-endpoints.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | -| init-endpoints.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| backup-same-region | | Defines whether to or not to store logical backups in the same region as the Database Instance | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance - -Delete a given Database Instance, specified by the `region` and `instance_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. - -**Usage:** - -``` -scw document-db instance delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance - -Retrieve information about a given Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. - -**Usage:** - -``` -scw document-db instance get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get the TLS certificate of a Database Instance - -Retrieve information about the TLS certificate of a given Database Instance. Details like name and content are returned in the response. - -**Usage:** - -``` -scw document-db instance get-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get Database Instance metrics - -Retrieve the time series metrics of a given Database Instance. You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. - -**Usage:** - -``` -scw document-db instance get-metrics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| start-date | | Start date to gather metrics from | -| end-date | | End date to gather metrics from | -| metric-name | | Name of the metric to gather | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List Database Instances - -List all Database Instances in the specified region, for a given Scaleway Organization or Scaleway Project. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. - -**Usage:** - -``` -scw document-db instance list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tags.{index} | | List Database Instances that have a given tag | -| name | | Lists Database Instances that match a name pattern | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc`, `status_desc` | Criteria to use when ordering Database Instance listings | -| project-id | | Project ID to list the Database Instance of | -| organization-id | | Please use project_id instead | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Renew the TLS certificate of a Database Instance - -Renew a TLS for a Database Instance. Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. - -**Usage:** - -``` -scw document-db instance renew-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Restart Database Instance - -Restart a given Database Instance, specified by the `region` and `instance_id` parameters. The status of the Database Instance returned in the response. - -**Usage:** - -``` -scw document-db instance restart [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to restart | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update a Database Instance - -Update the parameters of a Database Instance, including name, tags and backup schedule details. - -**Usage:** - -``` -scw document-db instance update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-schedule-frequency | | In hours | -| backup-schedule-retention | | In days | -| is-backup-schedule-disabled | | Defines whether or not the backup schedule is disabled | -| name | | Name of the Database Instance | -| instance-id | Required | UUID of the Database Instance to update | -| tags.{index} | | Tags of a Database Instance | -| logs-policy.max-age-retention | | Max age (in days) of remote logs to keep on the Database Instance | -| logs-policy.total-disk-retention | | Max disk size of remote logs to keep on the Database Instance | -| backup-same-region | | Store logical backups in the same region as the Database Instance | -| backup-schedule-start-hour | | Defines the start time of the autobackup | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Upgrade a Database Instance - -Upgrade your current Database Instance specifications like node type, high availability, volume, or the database engine version. Note that upon upgrade the `enable_ha` parameter can only be set to `true`. - -**Usage:** - -``` -scw document-db instance upgrade [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to upgrade | -| node-type | | Node type of the Database Instance you want to upgrade to | -| enable-ha | | Defines whether or not High Availability should be enabled on the Database Instance | -| volume-size | | Increase your Block volume size | -| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Change your Database Instance storage type | -| upgradable-version-id | | Update your database engine to a newer version | -| major-upgrade-workflow.upgradable-version-id | | Update your database engine to a newer version | -| major-upgrade-workflow.with-endpoints | | Include endpoint during the migration | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Instance logs management commands - -Instance logs management commands. - - -### Get given logs of a Database Instance - -Retrieve information about the logs of a Database Instance. Specify the `instance_log_id` and `region` in your request to get information such as `download_url`, `status`, `expires_at` and `created_at` about your logs in the response. - -**Usage:** - -``` -scw document-db log get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-log-id | Required | UUID of the instance_log you want | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List available logs of a Database Instance - -List the available logs of a Database Instance. By default, the logs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw document-db log list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| order-by | One of: `created_at_asc`, `created_at_desc` | Criteria to use when ordering Database Instance logs listing | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List remote Database Instance logs details - -List remote log details. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw document-db log list-details [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Purge remote Database Instance logs - -Purge a given remote log from a Database Instance. You can specify the `log_name` of the log you wish to clean from your Database Instance. - -**Usage:** - -``` -scw document-db log purge [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| log-name | | Given log name to purge | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Node types management commands - -Two node type ranges are available: - -* **General Purpose:** production-grade nodes designed for scalable database infrastructures. -* **Development:** sandbox environments and reliable performance for development and testing purposes. - - -### List available node types - -List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw document-db node-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| include-disabled-types | | Defines whether or not to include disabled types | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## User privileges management commands - -Privileges are permissions that can be granted to database users. You can manage user permissions either via the console, the Scaleway APIs. Managed Database for FerretDB provides a simplified and unified permission model through the API and the console to make things easier to manage and understand. - -Each user has associated permissions that give them access to zero or more logical databases. These include: - -* **None:** No access to the database -* **Read:** Allow users to read tables and fields in a database -* **Write:** Allow users to write content in databases. -* **Admin:** Read and write access to the data, and extended privileges depending on the database engine. - - -### List user privileges for a database - -List privileges of a user on a database. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `database_name` and `user_name`. - -**Usage:** - -``` -scw document-db privilege list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `user_name_asc`, `user_name_desc`, `database_name_asc`, `database_name_desc` | Criteria to use when ordering privileges listing | -| database-name | | Name of the database | -| instance-id | Required | UUID of the Database Instance | -| user-name | | Name of the user | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set user privileges for a database - -Set the privileges of a user on a database. You must define `database_name`, `user_name` and `permission` in the request body. - -**Usage:** - -``` -scw document-db privilege set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| database-name | | Name of the database | -| user-name | | Name of the user | -| permission | One of: `readonly`, `readwrite`, `all`, `custom`, `none` | Permission to set (Read, Read/Write, All, Custom) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Read replica management - -A Read Replica is a live copy of a Database Instance that behaves like an Instance, but that only allows read-only connections. -The replica mirrors the data of the primary Database node and any changes made are replicated to the replica asynchronously. Read Replicas allow you to scale your Database Instance for read-heavy database workloads. They can also be used for business intelligence workloads. - -A Read Replica can have at most one direct access and one Private Network endpoint. `Loadbalancer` endpoints are not available on Read Replicas even if this resource is displayed in the Read Replica response example. - -If you want to remove a Read Replica endpoint, you can use [delete a Database Instance endpoint](#path-endpoints-delete-a-database-instance-endpoint) API call. - -Instance Access Control Lists (ACL) also apply to Read Replica direct access endpoints. - -**Limitations:** -There might be replication lags between the primary node and its Read Replica nodes. You can try to reduce this lag with some good practices: -* All your tables should have a primary key -* Don't run large transactions that modify, delete or insert lots of rows. Try to split it into several small transactions. - - -### Create a Read Replica - -Create a new Read Replica of a Database Instance. You must specify the `region` and the `instance_id`. You can only create a maximum of 3 Read Replicas per Database Instance. - -**Usage:** - -``` -scw document-db read-replica create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to create a Read Replica from | -| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | -| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| same-zone | | Defines whether or not to create the replica in the same Availability Zone as the main Database Instance nodes. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create an endpoint for a Read Replica - -Create a new endpoint for a Read Replica. Read Replicas can have at most one direct access and one Private Network endpoint. - -**Usage:** - -``` -scw document-db read-replica create-endpoint [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | -| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Read Replica - -Delete a Read Replica of a Database Instance. You must specify the `region` and `read_replica_id` parameters of the Read Replica you want to delete. - -**Usage:** - -``` -scw document-db read-replica delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Read Replica - -Retrieve information about a Database Instance Read Replica. Full details about the Read Replica, like `endpoints`, `status` and `region` are returned in the response. - -**Usage:** - -``` -scw document-db read-replica get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Resync a Read Replica - -When you resync a Read Replica, first it is reset, then its data is resynchronized from the primary node. Your Read Replica remains unavailable during the resync process. The duration of this process is proportional to the size of your Database Instance. -The configured endpoints do not change. - -**Usage:** - -``` -scw document-db read-replica reset [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Setting management - -Advanced Database Instance settings allow you to tune the behavior of your database engines to better fit your needs. - -Available settings depend on the database engine and its version. Note that some settings can only be defined upon database engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available database engines](#path-databases-list-databases-in-a-database-instance) endpoint. - -Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. - - -### Add Database Instance advanced settings - -Add an advanced setting to a Database Instance. You must set the `name` and the `value` of each setting. - -**Usage:** - -``` -scw document-db setting add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to add settings to | -| settings.{index}.name | | | -| settings.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete Database Instance advanced settings - -Delete an advanced setting in a Database Instance. You must specify the names of the settings you want to delete in the request. - -**Usage:** - -``` -scw document-db setting delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete settings from | -| setting-names.{index} | Required | Settings names to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Set Database Instance advanced settings - -Update an advanced setting for a Database Instance. Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. - -**Usage:** - -``` -scw document-db setting set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where the settings must be set | -| settings.{index}.name | | | -| settings.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Block snapshot management - -A snapshot is a consistent, instantaneous copy of the Block Storage volume of your Database Instance at a certain point in time. They are designed to recover your data in case of failure or accidental alterations of the data by a user. They allow you to quickly create a new Instance from a previous state of your database, regardless of the size of the volume. Their limitation is that, unlike backups, snapshots can only be stored in the same location as the original data. - - -### Create a Database Instance snapshot - -Create a new snapshot of a Database Instance. You must define the `name` parameter in the request. - -**Usage:** - -``` -scw document-db snapshot create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| name | Required
Default: `` | Name of the snapshot | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance snapshot - -Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `region` and `snapshot_id` parameters of the snapshot you want to delete. - -**Usage:** - -``` -scw document-db snapshot delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance snapshot - -Retrieve information about a given snapshot, specified by its `snapshot_id` and `region`. Full details about the snapshot, like size and expiration date, are returned in the response. - -**Usage:** - -``` -scw document-db snapshot get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List snapshots - -List snapshots. You can include the `instance_id` or `project_id` in your query to get the list of snapshots for specific Database Instances and/or Projects. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw document-db snapshot list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the snapshot | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `expires_at_asc`, `expires_at_desc` | Criteria to use when ordering snapshot listing | -| instance-id | | UUID of the Database Instance | -| project-id | | Project ID the snapshots belongs to | -| organization-id | | Organization ID the snapshots belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Create a new Database Instance from a snapshot - -Restore a snapshot. When you restore a snapshot, a new Instance is created and billed to your account. Note that is possible to select a larger node type for your new Database Instance. However, the Block volume size will be the same as the size of the restored snapshot. All Instance settings will be restored if you chose a node type with the same or more memory size than the initial Instance. Settings will be reset to the default if your node type has less memory. - -**Usage:** - -``` -scw document-db snapshot restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | Block snapshot of the Database Instance | -| instance-name | | Name of the Database Instance created with the snapshot | -| is-ha-cluster | | Defines whether or not High Availability is enabled on the new Database Instance | -| node-type | | The node type used to restore the snapshot | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update a Database Instance snapshot - -Update the parameters of a snapshot of a Database Instance. You can update the `name` and `expires_at` parameters. - -**Usage:** - -``` -scw document-db snapshot update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot to update | -| name | | Name of the snapshot | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## User management commands - -Users are profiles to which you can attribute database-level permissions. They allow you to define permissions specific to each type of database usage. For example, users with an `admin` role can create new databases and users. - - -### Create a user for a Database Instance - -Create a new user for a Database Instance. You must define the `name`, `password` and `is_admin` parameters. - -**Usage:** - -``` -scw document-db user create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance in which you want to create a user | -| name | | Name of the user you want to create | -| password | | Password of the user you want to create | -| is-admin | | Defines whether the user will have administrative privileges | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a user on a Database Instance - -Delete a given user on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the user you want to delete. - -**Usage:** - -``` -scw document-db user delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete the user from | -| name | Required | Name of the user | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List users of a Database Instance - -List all users of a given Database Instance. By default, the users returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw document-db user list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the user | -| order-by | One of: `name_asc`, `name_desc`, `is_admin_asc`, `is_admin_desc` | Criteria to use when requesting user listing | -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a user on a Database Instance - -Update the parameters of a user on a Database Instance. You can update the `password` and `is_admin` parameters, but you cannot change the name of the user. - -**Usage:** - -``` -scw document-db user update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance the user belongs to | -| name | Required | Name of the database user | -| password | | Password of the database user | -| is-admin | | Defines whether or not this user got administrative privileges | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/edge-services.md b/docs/docs/edge-services.md deleted file mode 100644 index 061f42965a..0000000000 --- a/docs/docs/edge-services.md +++ /dev/null @@ -1,669 +0,0 @@ - -# Documentation for `scw edge-services` -Edge Services API - -- [Backend-stage management commands](#backend-stage-management-commands) - - [Create backend stage](#create-backend-stage) - - [Delete backend stage](#delete-backend-stage) - - [Get backend stage](#get-backend-stage) - - [List backend stages](#list-backend-stages) - - [Update backend stage](#update-backend-stage) -- [Cache-stage management commands](#cache-stage-management-commands) - - [Create cache stage](#create-cache-stage) - - [Delete cache stage](#delete-cache-stage) - - [Get cache stage](#get-cache-stage) - - [List cache stages](#list-cache-stages) - - [Update cache stage](#update-cache-stage) -- [DNS-stage management commands](#dns-stage-management-commands) - - [Create DNS stage](#create-dns-stage) - - [Delete DNS stage](#delete-dns-stage) - - [Get DNS stage](#get-dns-stage) - - [List DNS stages](#list-dns-stages) - - [Update DNS stage](#update-dns-stage) -- [Pipeline management commands](#pipeline-management-commands) - - [Create pipeline](#create-pipeline) - - [Delete pipeline](#delete-pipeline) - - [Get pipeline](#get-pipeline) - - [List pipelines](#list-pipelines) - - [Update pipeline](#update-pipeline) -- [Purge-request management commands](#purge-request-management-commands) - - [Create purge request](#create-purge-request) - - [Get purge request](#get-purge-request) - - [List purge requests](#list-purge-requests) -- [TLS-stage management commands](#tls-stage-management-commands) - - [Create TLS stage](#create-tls-stage) - - [Delete TLS stage](#delete-tls-stage) - - [Get TLS stage](#get-tls-stage) - - [List TLS stages](#list-tls-stages) - - [Update TLS stage](#update-tls-stage) - - -## Backend-stage management commands - -Backend-stage management commands. - - -### Create backend stage - -Create a new backend stage. You must specify either a `scaleway_s3` (for a Scaleway Object Storage bucket) or `scaleway_lb` (for a Scaleway Load Balancer) field to configure the origin. - -**Usage:** - -``` -scw edge-services backend-stage create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| scaleway-s3.bucket-name | | Name of the Bucket | -| scaleway-s3.bucket-region | | Region of the Bucket | -| scaleway-s3.is-website | | Defines whether the bucket website feature is enabled | -| scaleway-lb.lbs.{index}.id | | ID of the Load Balancer | -| scaleway-lb.lbs.{index}.zone | | Zone of the Load Balancer | -| scaleway-lb.lbs.{index}.frontend-id | | ID of the frontend linked to the Load Balancer | -| scaleway-lb.lbs.{index}.is-ssl | | Defines whether the Load Balancer's frontend handles SSL connections | -| scaleway-lb.lbs.{index}.domain-name | | Fully Qualified Domain Name (in the format subdomain.example.com) to use in HTTP requests sent towards your Load Balancer | - - - -### Delete backend stage - -Delete an existing backend stage, specified by its `backend_stage_id`. Deleting a backend stage is permanent, and cannot be undone. - -**Usage:** - -``` -scw edge-services backend-stage delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-stage-id | Required | ID of the backend stage to delete | - - - -### Get backend stage - -Retrieve information about an existing backend stage, specified by its `backend_stage_id`. Its full details, including `scaleway_s3` or `scaleway_lb`, are returned in the response object. - -**Usage:** - -``` -scw edge-services backend-stage get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-stage-id | Required | ID of the requested backend stage | - - - -### List backend stages - -List all backend stages, for a Scaleway Organization or Scaleway Project. By default, the backend stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services backend-stage list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of backend stages in the response | -| pipeline-id | | Pipeline ID to filter for, only backend stages from this pipeline will be returned | -| project-id | | Project ID to filter for, only backend stages from this Project will be returned | -| bucket-name | | Bucket name to filter for, only backend stages from this Bucket will be returned | -| bucket-region | | Bucket region to filter for, only backend stages with buckets in this region will be returned | -| lb-id | | Load Balancer ID to filter for, only backend stages with this Load Balancer will be returned | - - - -### Update backend stage - -Update the parameters of an existing backend stage, specified by its `backend_stage_id`. - -**Usage:** - -``` -scw edge-services backend-stage update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-stage-id | Required | ID of the backend stage to update | -| scaleway-s3.bucket-name | | Name of the Bucket | -| scaleway-s3.bucket-region | | Region of the Bucket | -| scaleway-s3.is-website | | Defines whether the bucket website feature is enabled | -| scaleway-lb.lbs.{index}.id | | ID of the Load Balancer | -| scaleway-lb.lbs.{index}.zone | | Zone of the Load Balancer | -| scaleway-lb.lbs.{index}.frontend-id | | ID of the frontend linked to the Load Balancer | -| scaleway-lb.lbs.{index}.is-ssl | | Defines whether the Load Balancer's frontend handles SSL connections | -| scaleway-lb.lbs.{index}.domain-name | | Fully Qualified Domain Name (in the format subdomain.example.com) to use in HTTP requests sent towards your Load Balancer | - - - -## Cache-stage management commands - -Cache-stage management commands. - - -### Create cache stage - -Create a new cache stage. You must specify the `fallback_ttl` field to customize the TTL of the cache. - -**Usage:** - -``` -scw edge-services cache-stage create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| fallback-ttl | Default: `3600s` | Time To Live (TTL) in seconds. Defines how long content is cached | -| backend-stage-id | | Backend stage ID the cache stage will be linked to | - - - -### Delete cache stage - -Delete an existing cache stage, specified by its `cache_stage_id`. Deleting a cache stage is permanent, and cannot be undone. - -**Usage:** - -``` -scw edge-services cache-stage delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cache-stage-id | Required | ID of the cache stage to delete | - - - -### Get cache stage - -Retrieve information about an existing cache stage, specified by its `cache_stage_id`. Its full details, including Time To Live (TTL), are returned in the response object. - -**Usage:** - -``` -scw edge-services cache-stage get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cache-stage-id | Required | ID of the requested cache stage | - - - -### List cache stages - -List all cache stages, for a Scaleway Organization or Scaleway Project. By default, the cache stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services cache-stage list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of cache stages in the response | -| pipeline-id | | Pipeline ID to filter for, only cache stages from this pipeline will be returned | -| project-id | | Project ID to filter for, only cache stages from this Project will be returned | - - - -### Update cache stage - -Update the parameters of an existing cache stage, specified by its `cache_stage_id`. Parameters which can be updated include the `fallback_ttl` and `backend_stage_id`. - -**Usage:** - -``` -scw edge-services cache-stage update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cache-stage-id | Required | ID of the cache stage to update | -| fallback-ttl | | Time To Live (TTL) in seconds. Defines how long content is cached | -| backend-stage-id | | Backend stage ID the cache stage will be linked to | - - - -## DNS-stage management commands - -DNS-stage management commands. - - -### Create DNS stage - -Create a new DNS stage. You must specify the `fqdns` field to customize the domain endpoint, using a domain you already own. - -**Usage:** - -``` -scw edge-services dns-stage create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| fqdns.{index} | | Fully Qualified Domain Name (in the format subdomain.example.com) to attach to the stage | -| tls-stage-id | | TLS stage ID the DNS stage will be linked to | -| cache-stage-id | | Cache stage ID the DNS stage will be linked to | -| backend-stage-id | | Backend stage ID the DNS stage will be linked to | - - - -### Delete DNS stage - -Delete an existing DNS stage, specified by its `dns_stage_id`. Deleting a DNS stage is permanent, and cannot be undone. - -**Usage:** - -``` -scw edge-services dns-stage delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-stage-id | Required | ID of the DNS stage to delete | - - - -### Get DNS stage - -Retrieve information about an existing DNS stage, specified by its `dns_stage_id`. Its full details, including FQDNs, are returned in the response object. - -**Usage:** - -``` -scw edge-services dns-stage get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-stage-id | Required | ID of the requested DNS stage | - - - -### List DNS stages - -List all DNS stages, for a Scaleway Organization or Scaleway Project. By default, the DNS stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services dns-stage list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of DNS stages in the response | -| pipeline-id | | Pipeline ID to filter for, only DNS stages from this pipeline will be returned | -| project-id | | Project ID to filter for, only DNS stages from this Project will be returned | -| fqdn | | Fully Qualified Domain Name to filter for (in the format subdomain.example.com), only DNS stages with this FQDN will be returned | - - - -### Update DNS stage - -Update the parameters of an existing DNS stage, specified by its `dns_stage_id`. - -**Usage:** - -``` -scw edge-services dns-stage update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dns-stage-id | Required | ID of the DNS stage to update | -| fqdns.{index} | | Fully Qualified Domain Name (in the format subdomain.example.com) attached to the stage | -| tls-stage-id | | TLS stage ID the DNS stage will be linked to | -| cache-stage-id | | Cache stage ID the DNS stage will be linked to | -| backend-stage-id | | Backend stage ID the DNS stage will be linked to | - - - -## Pipeline management commands - -Pipeline management commands. - - -### Create pipeline - -Create a new pipeline. You must specify a `dns_stage_id` to form a stage-chain that goes all the way to the backend stage (origin), so the HTTP request will be processed according to the stages you created. - -**Usage:** - -``` -scw edge-services pipeline create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Required | Name of the pipeline | -| description | Required | Description of the pipeline | -| dns-stage-id | | DNS stage ID the pipeline will be attached to | - - - -### Delete pipeline - -Delete an existing pipeline, specified by its `pipeline_id`. Deleting a pipeline is permanent, and cannot be undone. Note that all stages linked to the pipeline are also deleted. - -**Usage:** - -``` -scw edge-services pipeline delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pipeline-id | Required | ID of the pipeline to delete | - - - -### Get pipeline - -Retrieve information about an existing pipeline, specified by its `pipeline_id`. Its full details, including errors, are returned in the response object. - -**Usage:** - -``` -scw edge-services pipeline get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pipeline-id | Required | ID of the requested pipeline | - - - -### List pipelines - -List all pipelines, for a Scaleway Organization or Scaleway Project. By default, the pipelines returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services pipeline list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of pipelines in the response | -| name | | Pipeline name to filter for, only pipelines with this string within their name will be returned | -| project-id | | Project ID to filter for, only pipelines from this Project will be returned | -| has-backend-stage-lb | | Filter on backend stage, only pipelines with a Load Balancer origin will be returned | -| organization-id | | Organization ID to filter for, only pipelines from this Organization will be returned | - - - -### Update pipeline - -Update the parameters of an existing pipeline, specified by its `pipeline_id`. Parameters which can be updated include the `name`, `description` and `dns_stage_id`. - -**Usage:** - -``` -scw edge-services pipeline update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pipeline-id | Required | ID of the pipeline to update | -| name | | Name of the pipeline | -| description | | Description of the pipeline | -| dns-stage-id | | DNS stage ID the pipeline will be attached to | - - - -## Purge-request management commands - -Purge-request management commands. - - -### Create purge request - -Create a new purge request. You must specify either the `all` field (to purge all content) or a list of `assets` (to define the precise assets to purge). - -**Usage:** - -``` -scw edge-services purge-request create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pipeline-id | Required | Pipeline ID in which the purge request will be created | -| assets.{index} | | List of asserts to purge | -| all | | Defines whether to purge all content | - - - -### Get purge request - -Retrieve information about a purge request, specified by its `purge_request_id`. Its full details, including `status` and `target`, are returned in the response object. - -**Usage:** - -``` -scw edge-services purge-request get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| purge-request-id | Required | ID of the requested purge request | - - - -### List purge requests - -List all purge requests, for a Scaleway Organization or Scaleway Project. This enables you to retrieve a history of all previously-made purge requests. By default, the purge requests returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services purge-request list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of purge requests in the response | -| project-id | | Project ID to filter for, only purge requests from this Project will be returned | -| pipeline-id | | Pipeline ID to filter for, only purge requests from this pipeline will be returned | -| organization-id | | Organization ID to filter for, only purge requests from this Project will be returned | - - - -## TLS-stage management commands - -TLS-stage management commands. - - -### Create TLS stage - -Create a new TLS stage. You must specify either the `secrets` or `managed_certificate` fields to customize the SSL/TLS certificate of your endpoint. Choose `secrets` if you are using a pre-existing certificate held in Scaleway Secret Manager, or `managed_certificate` to let Scaleway generate and manage a Let's Encrypt certificate for your customized endpoint. - -**Usage:** - -``` -scw edge-services tls-stage create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| secrets.{index}.secret-id | | ID of the Secret | -| secrets.{index}.region | | Region of the Secret | -| managed-certificate | | True when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint | -| cache-stage-id | | Cache stage ID the TLS stage will be linked to | -| backend-stage-id | | Backend stage ID the TLS stage will be linked to | - - - -### Delete TLS stage - -Delete an existing TLS stage, specified by its `tls_stage_id`. Deleting a TLS stage is permanent, and cannot be undone. - -**Usage:** - -``` -scw edge-services tls-stage delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tls-stage-id | Required | ID of the TLS stage to delete | - - - -### Get TLS stage - -Retrieve information about an existing TLS stage, specified by its `tls_stage_id`. Its full details, including secrets and certificate expiration date are returned in the response object. - -**Usage:** - -``` -scw edge-services tls-stage get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tls-stage-id | Required | ID of the requested TLS stage | - - - -### List TLS stages - -List all TLS stages, for a Scaleway Organization or Scaleway Project. By default, the TLS stages returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw edge-services tls-stage list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of TLS stages in the response | -| pipeline-id | | Pipeline ID to filter for, only TLS stages from this pipeline will be returned | -| project-id | | Project ID to filter for, only TLS stages from this Project will be returned | -| secret-id | | Secret ID to filter for, only TLS stages with this Secret ID will be returned | -| secret-region | | Secret region to filter for, only TLS stages with a Secret in this region will be returned | - - - -### Update TLS stage - -Update the parameters of an existing TLS stage, specified by its `tls_stage_id`. Both `tls_secrets_config` and `managed_certificate` parameters can be updated. - -**Usage:** - -``` -scw edge-services tls-stage update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tls-stage-id | Required | ID of the TLS stage to update | -| tls-secrets-config.tls-secrets.{index}.secret-id | | ID of the Secret | -| tls-secrets-config.tls-secrets.{index}.region | | Region of the Secret | -| managed-certificate | | True when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint | -| cache-stage-id | | Cache stage ID the TLS stage will be linked to | -| backend-stage-id | | Backend stage ID the TLS stage will be linked to | - - - diff --git a/docs/docs/feedback.md b/docs/docs/feedback.md deleted file mode 100644 index f0b7b37d20..0000000000 --- a/docs/docs/feedback.md +++ /dev/null @@ -1,36 +0,0 @@ - -# Documentation for `scw feedback` -Send feedback to the Scaleway CLI Team! - -- [Send a bug-report](#send-a-bug-report) -- [Send a feature request](#send-a-feature-request) - - -## Send a bug-report - -Send a bug-report to the Scaleway CLI team. - -Send a bug-report to the Scaleway CLI team. - -**Usage:** - -``` -scw feedback bug -``` - - - -## Send a feature request - -Send a feature request to the Scaleway CLI team. - -Send a feature request to the Scaleway CLI team. - -**Usage:** - -``` -scw feedback feature -``` - - - diff --git a/docs/docs/fip.md b/docs/docs/fip.md deleted file mode 100644 index 49bb6baffa..0000000000 --- a/docs/docs/fip.md +++ /dev/null @@ -1,267 +0,0 @@ - -# Documentation for `scw fip` -This API allows you to manage your Elastic Metal servers' flexible public IP addresses. - -- [Flexible IP management commands](#flexible-ip-management-commands) - - [Attach an existing flexible IP to a server](#attach-an-existing-flexible-ip-to-a-server) - - [Create a new flexible IP](#create-a-new-flexible-ip) - - [Delete an existing flexible IP](#delete-an-existing-flexible-ip) - - [Detach an existing flexible IP from a server](#detach-an-existing-flexible-ip-from-a-server) - - [Get an existing flexible IP](#get-an-existing-flexible-ip) - - [List flexible IPs](#list-flexible-ips) - - [Update an existing flexible IP](#update-an-existing-flexible-ip) -- [MAC address management commands](#mac-address-management-commands) - - [Generate a virtual MAC address on an existing flexible IP](#generate-a-virtual-mac-address-on-an-existing-flexible-ip) - - [Detach a given virtual MAC address from an existing flexible IP](#detach-a-given-virtual-mac-address-from-an-existing-flexible-ip) - - [Duplicate a virtual MAC address to another flexible IP](#duplicate-a-virtual-mac-address-to-another-flexible-ip) - - [Relocate an existing virtual MAC address to a different flexible IP](#relocate-an-existing-virtual-mac-address-to-a-different-flexible-ip) - - -## Flexible IP management commands - -A flexible IP can be attached to any Elastic Metal server within the same zone. -Multiple flexible IPs can be attached to a server. - - -### Attach an existing flexible IP to a server - -Attach an existing flexible IP to a specified Elastic Metal server. - -**Usage:** - -``` -scw fip ip attach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fips-ids.{index} | Required | List of flexible IP IDs to attach to a server | -| server-id | Required | ID of the server on which to attach the flexible IPs | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Create a new flexible IP - -Generate a new flexible IP within a given zone, specifying its configuration including Project ID and description. - -**Usage:** - -``` -scw fip ip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| description | | Flexible IP description (max. of 255 characters) | -| tags.{index} | | Tags to associate to the flexible IP | -| server-id | | ID of the server to which the newly created flexible IP will be attached. | -| reverse | | Value of the reverse DNS | -| is-ipv6 | | Defines whether the flexible IP has an IPv6 address. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an existing flexible IP - -Delete an existing flexible IP, specified by its ID and zone. Note that deleting a flexible IP is permanent and cannot be undone. - -**Usage:** - -``` -scw fip ip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach an existing flexible IP from a server - -Detach an existing flexible IP from a specified Elastic Metal server. - -**Usage:** - -``` -scw fip ip detach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fips-ids.{index} | Required | List of flexible IP IDs to detach from a server. Multiple IDs can be provided. Note that flexible IPs must belong to the same MAC group. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an existing flexible IP - -Retrieve information about an existing flexible IP, specified by its ID and zone. Its full details, including Project ID, description and status, are returned in the response object. - -**Usage:** - -``` -scw fip ip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List flexible IPs - -List all flexible IPs within a given zone. - -**Usage:** - -``` -scw fip ip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned flexible IPs | -| tags.{index} | | Filter by tag, only flexible IPs with one or more matching tags will be returned | -| status.{index} | One of: `unknown`, `ready`, `updating`, `attached`, `error`, `detaching`, `locked` | Filter by status, only flexible IPs with this status will be returned | -| server-ids.{index} | | Filter by server IDs, only flexible IPs with these server IDs will be returned | -| project-id | | Filter by Project ID, only flexible IPs from this Project will be returned | -| organization-id | | Filter by Organization ID, only flexible IPs from this Organization will be returned | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an existing flexible IP - -Update the parameters of an existing flexible IP, specified by its ID and zone. These parameters include tags and description. - -**Usage:** - -``` -scw fip ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP to update | -| description | | Flexible IP description (max. 255 characters) | -| tags.{index} | | Tags associated with the flexible IP | -| reverse | | Value of the reverse DNS | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -## MAC address management commands - -MAC address management commands. - - -### Generate a virtual MAC address on an existing flexible IP - -Generate a virtual MAC (Media Access Control) address on an existing flexible IP. - -**Usage:** - -``` -scw fip mac create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP for which to generate a virtual MAC | -| mac-type | Required
One of: `unknown_type`, `vmware`, `xen`, `kvm` | TODO | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach a given virtual MAC address from an existing flexible IP - -Detach a given MAC (Media Access Control) address from an existing flexible IP. - -**Usage:** - -``` -scw fip mac delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP from which to delete the virtual MAC | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Duplicate a virtual MAC address to another flexible IP - -Duplicate a virtual MAC address from a given flexible IP to another flexible IP attached to the same server. - -**Usage:** - -``` -scw fip mac duplicate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | ID of the flexible IP on which to duplicate the virtual MAC | -| duplicate-from-fip-id | Required | ID of the flexible IP to duplicate the Virtual MAC from | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - -### Relocate an existing virtual MAC address to a different flexible IP - -Relocate a virtual MAC (Media Access Control) address from an existing flexible IP to a different flexible IP. - -**Usage:** - -``` -scw fip mac move [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| fip-id | Required | | -| dst-fip-id | | | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/function.md b/docs/docs/function.md deleted file mode 100644 index 180cda0729..0000000000 --- a/docs/docs/function.md +++ /dev/null @@ -1,819 +0,0 @@ - -# Documentation for `scw function` -Function as a Service API. - -- [Cron management commands](#cron-management-commands) - - [Create a new cron](#create-a-new-cron) - - [Delete an existing cron](#delete-an-existing-cron) - - [Get a cron](#get-a-cron) - - [List all crons](#list-all-crons) - - [Update an existing cron](#update-an-existing-cron) -- [Deploy a function](#deploy-a-function) -- [Domain management commands](#domain-management-commands) - - [Create a domain name binding](#create-a-domain-name-binding) - - [Delete a domain name binding](#delete-a-domain-name-binding) - - [Get a domain name binding](#get-a-domain-name-binding) - - [List all domain name bindings](#list-all-domain-name-bindings) -- [Function management commands](#function-management-commands) - - [Create a new function](#create-a-new-function) - - [Delete a function](#delete-a-function) - - [Deploy a function](#deploy-a-function) - - [Get a function](#get-a-function) - - [Get a download URL of a function](#get-a-download-url-of-a-function) - - [Get an upload URL of a function](#get-an-upload-url-of-a-function) - - [List all your functions](#list-all-your-functions) - - [Update an existing function](#update-an-existing-function) -- [Function namespace management commands](#function-namespace-management-commands) - - [Create a new namespace](#create-a-new-namespace) - - [Delete an existing namespace](#delete-an-existing-namespace) - - [Get a namespace](#get-a-namespace) - - [List all your namespaces](#list-all-your-namespaces) - - [Update an existing namespace](#update-an-existing-namespace) -- [Runtime management commands](#runtime-management-commands) - - [List function runtimes](#list-function-runtimes) -- [Token management commands](#token-management-commands) - - [Create a new revocable token](#create-a-new-revocable-token) - - [Delete a token](#delete-a-token) - - [Get a token](#get-a-token) - - [List all tokens](#list-all-tokens) -- [Trigger management commands](#trigger-management-commands) - - [Create a trigger](#create-a-trigger) - - [Delete a trigger](#delete-a-trigger) - - [Get a trigger](#get-a-trigger) - - [List all triggers](#list-all-triggers) - - [Update a trigger](#update-a-trigger) - - -## Cron management commands - -Cron management commands. - - -### Create a new cron - -Create a new cronjob for a function with the specified ID. - -**Usage:** - -``` -scw function cron create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | | UUID of the function to use the cron with | -| schedule | | Schedule of the cron in UNIX cron format | -| args | | Arguments to use with the cron | -| name | | Name of the cron | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing cron - -Delete the cron associated with the specified ID. - -**Usage:** - -``` -scw function cron delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a cron - -Get the cron associated with the specified ID. - -**Usage:** - -``` -scw function cron get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all crons - -List all the cronjobs in a specified region. - -**Usage:** - -``` -scw function cron list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order of the crons | -| function-id | | UUID of the function | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing cron - -Update the cron associated with the specified ID. - -**Usage:** - -``` -scw function cron update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cron-id | Required | UUID of the cron to update | -| function-id | | UUID of the function to use the cron with | -| schedule | | Schedule of the cron in UNIX cron format | -| args | | Arguments to use with the cron | -| name | | Name of the cron | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Deploy a function - -Create or fetch, upload and deploy your function - -Create or fetch, upload and deploy your function - -**Usage:** - -``` -scw function deploy [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | | Function Namespace ID to deploy to | -| name | Required | Name of the function to deploy, will be used in namespace's name if no ID is provided | -| runtime | Required
One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | | -| zip-file | Required | Path of the zip file that contains your code | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Domain management commands - -Domain management commands. - - -### Create a domain name binding - -Create a domain name binding for the function with the specified ID. - -**Usage:** - -``` -scw function domain create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hostname | | Hostame to create | -| function-id | | UUID of the function to associate the domain with | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a domain name binding - -Delete a domain name binding for the function with the specified ID. - -**Usage:** - -``` -scw function domain delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | UUID of the domain to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a domain name binding - -Get a domain name binding for the function with the specified ID. - -**Usage:** - -``` -scw function domain get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | UUID of the domain to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all domain name bindings - -List all domain name bindings in a specified region. - -**Usage:** - -``` -scw function domain list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `hostname_asc`, `hostname_desc` | Order of the domains | -| function-id | | UUID of the function the domain is assoicated with | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Function management commands - -Function management commands. - - -### Create a new function - -Create a new function in the specified region for a specified Organization or Project. - -**Usage:** - -``` -scw function function create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the function to create | -| namespace-id | | UUID of the namespace the function will be created in | -| environment-variables.{key} | | Environment variables of the function | -| min-scale | | Minumum number of instances to scale the function to | -| max-scale | | Maximum number of instances to scale the function to | -| runtime | One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | Runtime to use with the function | -| memory-limit | | Memory limit of the function in MB | -| timeout | | Request processing time limit for the function | -| handler | | Handler to use with the function | -| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the function | -| description | | Description of the function | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | -| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the function | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a function - -Delete the function associated with the specified ID. - -**Usage:** - -``` -scw function function delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Deploy a function - -Deploy a function associated with the specified ID. - -**Usage:** - -``` -scw function function deploy [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function to deploy | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a function - -Get the function associated with the specified ID. - -**Usage:** - -``` -scw function function get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a download URL of a function - -Get a download URL for a function associated with the specified ID. - -**Usage:** - -``` -scw function function get-download-url [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function to get the the download URL for | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get an upload URL of a function - -Get an upload URL of a function associated with the specified ID. - -**Usage:** - -``` -scw function function get-upload-url [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function to get the upload URL for | -| content-length | Required | Size of the archive to upload in bytes | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your functions - -List all your functions. - -**Usage:** - -``` -scw function function list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the functions | -| namespace-id | | UUID of the namespace the function belongs to | -| name | | Name of the function | -| project-id | | UUID of the Project the function belongs to | -| organization-id | | UUID of the Organziation the function belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing function - -Update the function associated with the specified ID. - -**Usage:** - -``` -scw function function update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | Required | UUID of the function to update | -| environment-variables.{key} | | Environment variables of the function to update | -| min-scale | | Minumum number of instances to scale the function to | -| max-scale | | Maximum number of instances to scale the function to | -| runtime | One of: `unknown_runtime`, `golang`, `python`, `python3`, `node8`, `node10`, `node14`, `node16`, `node17`, `python37`, `python38`, `python39`, `python310`, `go113`, `go117`, `go118`, `node18`, `rust165`, `go119`, `python311`, `php82`, `node19`, `go120`, `node20`, `go121`, `node22`, `python312`, `php83`, `go122`, `rust179` | Runtime to use with the function | -| memory-limit | | Memory limit of the function in MB | -| timeout | | Processing time limit for the function | -| redeploy | | Redeploy failed function | -| handler | | Handler to use with the function | -| privacy | One of: `unknown_privacy`, `public`, `private` | Privacy setting of the function | -| description | | Description of the function | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| http-option | Default: `enabled`
One of: `unknown_http_option`, `enabled`, `redirected` | Configure how HTTP and HTTPS requests are handled | -| sandbox | One of: `unknown_sandbox`, `v1`, `v2` | Execution environment of the function | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Function namespace management commands - -Function namespace management commands. - - -### Create a new namespace - -Create a new namespace in a specified Organization or Project. - -**Usage:** - -``` -scw function namespace create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | | -| environment-variables.{key} | | Environment variables of the namespace | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| description | | Description of the namespace | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing namespace - -Delete the namespace associated with the specified ID. - -**Usage:** - -``` -scw function namespace delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a namespace - -Get the namespace associated with the specified ID. - -**Usage:** - -``` -scw function namespace get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your namespaces - -List all existing namespaces in the specified region. - -**Usage:** - -``` -scw function namespace list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order of the namespaces | -| name | | Name of the namespace | -| project-id | | UUID of the Project the namespace belongs to | -| organization-id | | UUID of the Organization the namespace belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing namespace - -Update the namespace associated with the specified ID. - -**Usage:** - -``` -scw function namespace update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespapce | -| environment-variables.{key} | | Environment variables of the namespace | -| description | | Description of the namespace | -| secret-environment-variables.{index}.key | | | -| secret-environment-variables.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Runtime management commands - -Runtime management commands. - - -### List function runtimes - -List available function runtimes. - -**Usage:** - -``` -scw function runtime list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Token management commands - -Token management commands. - - -### Create a new revocable token - -Create a new revocable token. - -**Usage:** - -``` -scw function token create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| function-id | | UUID of the function to associate the token with | -| namespace-id | | UUID of the namespace to associate the token with | -| description | | Description of the token | -| expires-at | | Date on which the token expires | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a token - -Delete a token. - -**Usage:** - -``` -scw function token delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | UUID of the token to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a token - -Get a token. - -**Usage:** - -``` -scw function token get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| token-id | Required | UUID of the token to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all tokens - -List all tokens. - -**Usage:** - -``` -scw function token list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for the tokens | -| function-id | | UUID of the function the token is assoicated with | -| namespace-id | | UUID of the namespace the token is associated with | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Trigger management commands - -Trigger management commands. - - -### Create a trigger - -Create a new trigger for a specified function. - -**Usage:** - -``` -scw function trigger create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | Name of the trigger | -| function-id | Required | ID of the function to trigger | -| description | | Description of the trigger | -| scw-sqs-config.queue | | Name of the SQS queue the trigger should listen to | -| scw-sqs-config.mnq-project-id | | ID of the Messaging and Queuing project | -| scw-sqs-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | -| scw-nats-config.subject | | Name of the NATS subject the trigger should listen to | -| scw-nats-config.mnq-nats-account-id | | ID of the Messaging and Queuing NATS account | -| scw-nats-config.mnq-project-id | | ID of the Messaging and Queuing project | -| scw-nats-config.mnq-region | | Region in which the Messaging and Queuing project is activated. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a trigger - -Delete a trigger with a specified ID. - -**Usage:** - -``` -scw function trigger delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a trigger - -Get a trigger with a specified ID. - -**Usage:** - -``` -scw function trigger get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all triggers - -List all triggers belonging to a specified Organization or Project. - -**Usage:** - -``` -scw function trigger list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Order in which to return results | -| function-id | | ID of the function the triggers belongs to | -| namespace-id | | ID of the namespace the triggers belongs to | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a trigger - -Update a trigger with a specified ID. - -**Usage:** - -``` -scw function trigger update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| trigger-id | Required | ID of the trigger to update | -| name | | Name of the trigger | -| description | | Description of the trigger | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/help.md b/docs/docs/help.md deleted file mode 100644 index 310efefcc1..0000000000 --- a/docs/docs/help.md +++ /dev/null @@ -1,248 +0,0 @@ - -# Documentation for `scw help` -Get help about how the CLI works - -- [Get help about how date parsing works in the CLI](#get-help-about-how-date-parsing-works-in-the-cli) -- [Get help about how the CLI output works](#get-help-about-how-the-cli-output-works) - - -## Get help about how date parsing works in the CLI - -Date parsing - -You have two ways for managing date in the CLI: Absolute and Relative - -- Absolute time - - Absolute time refers to a specific and absolute point in time. - CLI uses RFC3339 to parse those time and pass a time.Time go structure to the underlying functions. - - Example: "2006-01-02T15:04:05Z07:00" - -- Relative time - - Relative time refers to a time calculated from adding a given duration to the time when a command is launched. - - Example: - - +1d4m => current time plus 1 day and 4 minutes - - -1d4m => current time minus 1 day and 4 minutes - -- Units of time - - Nanosecond: ns - Microsecond: us, µs (U+00B5 = micro symbol), μs (U+03BC = Greek letter mu) - Millisecond: ms - Second: s, sec, second, seconds - Minute: m, min, minute, minutes - Hour: h, hr, hour, hours - Day: d, day, days - Week: w, wk, week, weeks - Month: mo, mon, month, months - Year: y, yr, year, years - - -Date parsing - -You have two ways for managing date in the CLI: Absolute and Relative - -- Absolute time - - Absolute time refers to a specific and absolute point in time. - CLI uses RFC3339 to parse those time and pass a time.Time go structure to the underlying functions. - - Example: "2006-01-02T15:04:05Z07:00" - -- Relative time - - Relative time refers to a time calculated from adding a given duration to the time when a command is launched. - - Example: - - +1d4m => current time plus 1 day and 4 minutes - - -1d4m => current time minus 1 day and 4 minutes - -- Units of time - - Nanosecond: ns - Microsecond: us, µs (U+00B5 = micro symbol), μs (U+03BC = Greek letter mu) - Millisecond: ms - Second: s, sec, second, seconds - Minute: m, min, minute, minutes - Hour: h, hr, hour, hours - Day: d, day, days - Week: w, wk, week, weeks - Month: mo, mon, month, months - Year: y, yr, year, years - - -**Usage:** - -``` -scw help date -``` - - - -## Get help about how the CLI output works - -Output formatting in the CLI - -Human output (default one) - - scw instance server list - - ID NAME TYPE STATE ZONE PUBLIC IP - 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 - -Human with column selection - -You can select the columns that you want to print with commands that return a list - - scw instance server list -o human=Name,PublicIP - - NAME PUBLIC IP - scw-cool-franklin 51.15.251.251 - -Wide output (Human without column shrinking) - - scw instance server list -o wide - - ID NAME TYPE STATE ZONE PUBLIC IP - 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 - -Wide with column selection - -You can select the columns that you want to print with commands that return a list - - scw instance server list -o wide=Name,PublicIP - - NAME PUBLIC IP - scw-cool-franklin 51.15.251.251 - - -Standard JSON output - - scw config dump -o json - - {"access_key":"SCWXXXXXXXXXXXXXXXXX","secret_key":"11111111-1111-1111-1111-111111111111","default_organization_id":"11111111-1111-1111-1111-111111111111","default_region":"fr-par","default_zone":"fr-par-1","send_telemetry":true} - -Pretty JSON output - - scw config dump -o json=pretty - - { - "access_key": "SCWXXXXXXXXXXXXXXXXX", - "secret_key": "11111111-1111-1111-1111-111111111111", - "default_organization_id": "11111111-1111-1111-1111-111111111111", - "default_region": "fr-par", - "default_zone": "fr-par-1", - "send_telemetry": true - } - -Standard YAML output - - scw config dump -o yaml - - access_key: SCWXXXXXXXXXXXXXXXXX - secret_key: 11111111-1111-1111-1111-111111111111 - default_organization_id: 11111111-1111-1111-1111-111111111111 - default_region: fr-par - default_zone: fr-par-1 - send_telemetry: true - - -Template output - -You can use Go template to manipulate the output of a command and create a custom rendering of your resources. -Visit https://golang.org/pkg/text/template/ to learn more about Go template format. - - scw instance server list -o template="{{ .Name }}||{{ .ID }}" - - foo||11111111-1111-1111-1111-111111111111 - bar||22222222-2222-2222-2222-222222222222 - - -Output formatting in the CLI - -Human output (default one) - - scw instance server list - - ID NAME TYPE STATE ZONE PUBLIC IP - 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 - -Human with column selection - -You can select the columns that you want to print with commands that return a list - - scw instance server list -o human=Name,PublicIP - - NAME PUBLIC IP - scw-cool-franklin 51.15.251.251 - -Wide output (Human without column shrinking) - - scw instance server list -o wide - - ID NAME TYPE STATE ZONE PUBLIC IP - 088b01da-9ba7-40d2-bc55-eb3170f42185 scw-cool-franklin DEV1-S running fr-par-1 51.15.251.251 - -Wide with column selection - -You can select the columns that you want to print with commands that return a list - - scw instance server list -o wide=Name,PublicIP - - NAME PUBLIC IP - scw-cool-franklin 51.15.251.251 - - -Standard JSON output - - scw config dump -o json - - {"access_key":"SCWXXXXXXXXXXXXXXXXX","secret_key":"11111111-1111-1111-1111-111111111111","default_organization_id":"11111111-1111-1111-1111-111111111111","default_region":"fr-par","default_zone":"fr-par-1","send_telemetry":true} - -Pretty JSON output - - scw config dump -o json=pretty - - { - "access_key": "SCWXXXXXXXXXXXXXXXXX", - "secret_key": "11111111-1111-1111-1111-111111111111", - "default_organization_id": "11111111-1111-1111-1111-111111111111", - "default_region": "fr-par", - "default_zone": "fr-par-1", - "send_telemetry": true - } - -Standard YAML output - - scw config dump -o yaml - - access_key: SCWXXXXXXXXXXXXXXXXX - secret_key: 11111111-1111-1111-1111-111111111111 - default_organization_id: 11111111-1111-1111-1111-111111111111 - default_region: fr-par - default_zone: fr-par-1 - send_telemetry: true - - -Template output - -You can use Go template to manipulate the output of a command and create a custom rendering of your resources. -Visit https://golang.org/pkg/text/template/ to learn more about Go template format. - - scw instance server list -o template="{{ .Name }}||{{ .ID }}" - - foo||11111111-1111-1111-1111-111111111111 - bar||22222222-2222-2222-2222-222222222222 - - -**Usage:** - -``` -scw help output -``` - - - diff --git a/docs/docs/iam.md b/docs/docs/iam.md deleted file mode 100644 index 9e1c0697bb..0000000000 --- a/docs/docs/iam.md +++ /dev/null @@ -1,1149 +0,0 @@ - -# Documentation for `scw iam` -This API allows you to manage Identity and Access Management (IAM) across your Scaleway Organizations, Projects and resources. - -- [API keys management commands](#api-keys-management-commands) - - [Create an API key](#create-an-api-key) - - [Delete an API key](#delete-an-api-key) - - [Get an API key](#get-an-api-key) - - [List API keys](#list-api-keys) - - [Update an API key](#update-an-api-key) -- [Applications management commands](#applications-management-commands) - - [Create a new application](#create-a-new-application) - - [Delete an application](#delete-an-application) - - [Get a given application](#get-a-given-application) - - [List applications of an Organization](#list-applications-of-an-organization) - - [Update an application](#update-an-application) -- [Groups management commands](#groups-management-commands) - - [Add a user or an application to a group](#add-a-user-or-an-application-to-a-group) - - [Add multiple users and applications to a group](#add-multiple-users-and-applications-to-a-group) - - [Create a group](#create-a-group) - - [Delete a group](#delete-a-group) - - [Get a group](#get-a-group) - - [List groups](#list-groups) - - [Remove a user or an application from a group](#remove-a-user-or-an-application-from-a-group) - - [Overwrite users and applications of a group](#overwrite-users-and-applications-of-a-group) - - [Update a group](#update-a-group) -- [JWTs management commands](#jwts-management-commands) - - [Delete a JWT](#delete-a-jwt) - - [Get a JWT](#get-a-jwt) - - [List JWTs](#list-jwts) -- [Log management commands](#log-management-commands) - - [Get a log](#get-a-log) - - [List logs](#list-logs) -- [Permission sets management commands](#permission-sets-management-commands) - - [List permission sets](#list-permission-sets) -- [Policies management commands](#policies-management-commands) - - [Clone a policy](#clone-a-policy) - - [Create a new policy](#create-a-new-policy) - - [Delete a policy](#delete-a-policy) - - [Get an existing policy](#get-an-existing-policy) - - [List policies of an Organization](#list-policies-of-an-organization) - - [Update an existing policy](#update-an-existing-policy) -- [Rules management commands](#rules-management-commands) - - [Create a rule for a specific IAM policy](#create-a-rule-for-a-specific-iam-policy) - - [Delete a rule for a specific IAM policy](#delete-a-rule-for-a-specific-iam-policy) - - [List rules of a given policy](#list-rules-of-a-given-policy) - - [Set rules of a given policy](#set-rules-of-a-given-policy) -- [SSH keys management commands](#ssh-keys-management-commands) - - [Create an SSH key](#create-an-ssh-key) - - [Delete an SSH key](#delete-an-ssh-key) - - [Get an SSH key](#get-an-ssh-key) - - [Initialize SSH key](#initialize-ssh-key) - - [List SSH keys](#list-ssh-keys) - - [Update an SSH key](#update-an-ssh-key) -- [Users management commands](#users-management-commands) - - [Create a new user](#create-a-new-user) - - [Delete a guest user from an Organization](#delete-a-guest-user-from-an-organization) - - [Get a given user](#get-a-given-user) - - [List users of an Organization](#list-users-of-an-organization) - - [Update a user](#update-a-user) - - -## API keys management commands - -API keys management commands. - - -### Create an API key - -Create an API key. You must specify the `application_id` or the `user_id` and the description. You can also specify the `default_project_id` which is the Project ID of your preferred Project, to use with Object Storage. The `access_key` and `secret_key` values are returned in the response. Note that he secret key is only showed once. Make sure that you copy and store both keys somewhere safe. - -**Usage:** - -``` -scw iam api-key create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| application-id | | ID of the application | -| user-id | | ID of the user | -| expires-at | | Expiration date of the API key | -| default-project-id | | Default Project ID to use with Object Storage | -| description | | Description of the API key (max length is 200 characters) | - - - -### Delete an API key - -Delete an API key. Note that this action is irreversible and cannot be undone. Make sure you update any configurations using the API keys you delete. - -**Usage:** - -``` -scw iam api-key delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| access-key | Required | Access key to delete | - - -**Examples:** - - -Delete a given API key -``` -scw iam api-key delete SCW00000000000 -``` - - - - -### Get an API key - -Retrive information about an API key, specified by the `access_key` parameter. The API key's details, including either the `user_id` or `application_id` of its bearer are returned in the response. Note that the string value for the `secret_key` is nullable, and therefore is not displayed in the response. The `secret_key` value is only displayed upon API key creation. - -**Usage:** - -``` -scw iam api-key get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| access-key | Required | Access key to search for | - - - -### List API keys - -List API keys. By default, the API keys listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters for your query such as `editable`, `expired`, `access_key` and `bearer_id`. - -**Usage:** - -``` -scw iam api-key list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `expires_at_asc`, `expires_at_desc`, `access_key_asc`, `access_key_desc` | Criteria for sorting results | -| ~~application-id~~ | Deprecated | ID of application that bears the API key | -| ~~user-id~~ | Deprecated | ID of user that bears the API key | -| editable | | Defines whether to filter out editable API keys or not | -| expired | | Defines whether to filter out expired API keys or not | -| ~~access-key~~ | Deprecated | Filter by access key (deprecated in favor of `access_keys`) | -| description | | Filter by description | -| bearer-id | | Filter by bearer ID | -| bearer-type | One of: `unknown_bearer_type`, `user`, `application` | Filter by type of bearer | -| access-keys.{index} | | Filter by a list of access keys | -| organization-id | Required
Default: `` | ID of Organization | - - - -### Update an API key - -Update the parameters of an API key, including `default_project_id` and `description`. - -**Usage:** - -``` -scw iam api-key update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| access-key | Required | Access key to update | -| default-project-id | | New default Project ID to set | -| description | | New description to update | - - - -## Applications management commands - -Applications management commands. - - -### Create a new application - -Create a new application. You must define the `name` parameter in the request. - -**Usage:** - -``` -scw iam application create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the application to create (max length is 64 characters) | -| description | | Description of the application (max length is 200 characters) | -| tags.{index} | | Tags associated with the application (maximum of 10 tags) | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Delete an application - -Delete an application. Note that this action is irreversible and will automatically delete the application's API keys. Policies attached to users and applications via this group will no longer apply. - -**Usage:** - -``` -scw iam application delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| application-id | Required | ID of the application to delete | - - - -### Get a given application - -Retrieve information about an application, specified by the `application_id` parameter. The application's full details, including `id`, `email`, `organization_id`, `status` and `two_factor_enabled` are returned in the response. - -**Usage:** - -``` -scw iam application get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| application-id | Required | ID of the application to find | - - - -### List applications of an Organization - -List the applications of an Organization. By default, the applications listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `application_ids`. - -**Usage:** - -``` -scw iam application list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Criteria for sorting results | -| name | | Name of the application to filter | -| editable | | Defines whether to filter out editable applications or not | -| application-ids.{index} | | Filter by list of IDs | -| tag | | Filter by tags containing a given string | -| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Update an application - -Update the parameters of an application, including `name` and `description`. - -**Usage:** - -``` -scw iam application update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| application-id | Required | ID of the application to update | -| name | | New name for the application (max length is 64 chars) | -| description | | New description for the application (max length is 200 chars) | -| tags.{index} | | New tags for the application (maximum of 10 tags) | - - - -## Groups management commands - -Groups management commands. - - -### Add a user or an application to a group - -Add a user or an application to a group. You can specify a `user_id` and and `application_id` in the body of your request. Note that you can only add one of each per request. - -**Usage:** - -``` -scw iam group add-member [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group | -| user-id | | ID of the user to add | -| application-id | | ID of the application to add | - - - -### Add multiple users and applications to a group - -Add multiple users and applications to a group in a single call. You can specify an array of `user_id`s and `application_id`s. Note that any existing users and applications in the group will remain. To add new users/applications and delete pre-existing ones, use the [Overwrite users and applications of a group](#path-groups-overwrite-users-and-applications-of-a-group) method. - -**Usage:** - -``` -scw iam group add-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group | -| user-ids.{index} | | IDs of the users to add | -| application-ids.{index} | | IDs of the applications to add | - - - -### Create a group - -Create a new group. You must define the `name` and `organization_id` parameters in the request. - -**Usage:** - -``` -scw iam group create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the group to create (max length is 64 chars). MUST be unique inside an Organization | -| description | | Description of the group to create (max length is 200 chars) | -| tags.{index} | | Tags associated with the group (maximum of 10 tags) | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - -**Examples:** - - -Create a group -``` -scw iam group create name=foobar -``` - - - - -### Delete a group - -Delete a group. Note that this action is irreversible and could delete permissions for group members. Policies attached to users and applications via this group will no longer apply. - -**Usage:** - -``` -scw iam group delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group to delete | - - -**Examples:** - - -Delete a given group -``` -scw iam group delete 11111111-1111-1111-1111-111111111111 -``` - - - - -### Get a group - -Retrive information about a given group, specified by the `group_id` parameter. The group's full details, including `user_ids` and `application_ids` are returned in the response. - -**Usage:** - -``` -scw iam group get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group | - - - -### List groups - -List groups. By default, the groups listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters to filter your query. Use `user_ids` or `application_ids` to list all groups certain users or applications belong to. - -**Usage:** - -``` -scw iam group list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Sort order of groups | -| name | | Name of group to find | -| application-ids.{index} | | Filter by a list of application IDs | -| user-ids.{index} | | Filter by a list of user IDs | -| group-ids.{index} | | Filter by a list of group IDs | -| tag | | Filter by tags containing a given string | -| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Remove a user or an application from a group - -Remove a user or an application from a group. You can specify a `user_id` and and `application_id` in the body of your request. Note that you can only remove one of each per request. Removing a user from a group means that any permissions given to them via the group (i.e. from an attached policy) will no longer apply. Be sure you want to remove these permissions from the user before proceeding. - -**Usage:** - -``` -scw iam group remove-member [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group | -| user-id | | ID of the user to remove | -| application-id | | ID of the application to remove | - - - -### Overwrite users and applications of a group - -Overwrite users and applications configuration in a group. Any information that you add using this command will overwrite the previous configuration. - -**Usage:** - -``` -scw iam group set-members [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | | -| user-ids.{index} | Required | | -| application-ids.{index} | Required | | - - - -### Update a group - -Update the parameters of group, including `name` and `description`. - -**Usage:** - -``` -scw iam group update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| group-id | Required | ID of the group to update | -| name | | New name for the group (max length is 64 chars). MUST be unique inside an Organization | -| description | | New description for the group (max length is 200 chars) | -| tags.{index} | | New tags for the group (maximum of 10 tags) | - - - -## JWTs management commands - -JWTs management commands. - - -### Delete a JWT - -Delete a JWT. - -**Usage:** - -``` -scw iam jwt delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| jti | Required | JWT ID of the JWT to delete | - - - -### Get a JWT - -Get a JWT. - -**Usage:** - -``` -scw iam jwt get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| jti | Required | JWT ID of the JWT to get | - - - -### List JWTs - -List JWTs. - -**Usage:** - -``` -scw iam jwt list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Criteria for sorting results | -| audience-id | Required | ID of the user to search | -| expired | | Filter out expired JWTs or not | - - - -## Log management commands - -Log management commands. - - -### Get a log - -Retrieve information about a log, specified by the `log_id` parameter. The log's full details, including `id`, `ip`, `user_agent`, `action`, `bearer_id`, `resource_type` and `resource_id` are returned in the response. - -**Usage:** - -``` -scw iam log get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| log-id | Required | ID of the log | - - - -### List logs - -List logs available for given Organization. You must define the `organization_id` in the query path of your request. - -**Usage:** - -``` -scw iam log list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc` | Criteria for sorting results | -| created-after | | Defined whether or not to filter out logs created after this timestamp | -| created-before | | Defined whether or not to filter out logs created before this timestamp | -| action | One of: `unknown_action`, `created`, `updated`, `deleted` | Defined whether or not to filter out by a specific action | -| resource-type | One of: `unknown_resource_type`, `api_key`, `user`, `application`, `group`, `policy` | Defined whether or not to filter out by a specific type of resource | -| search | | Defined whether or not to filter out log by bearer ID or resource ID | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -## Permission sets management commands - -Permission sets management commands. - - -### List permission sets - -List permission sets available for given Organization. You must define the `organization_id` in the query path of your request. - -**Usage:** - -``` -scw iam permission-set list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc` | Criteria for sorting results | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -## Policies management commands - -Policies management commands. - - -### Clone a policy - -Clone a policy. You must define specify the `policy_id` parameter in your request. - -**Usage:** - -``` -scw iam policy clone [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | | - - - -### Create a new policy - -Create a new application. You must define the `name` parameter in the request. You can specify parameters such as `user_id`, `groups_id`, `application_id`, `no_principal`, `rules` and its child attributes. - -**Usage:** - -``` -scw iam policy create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the policy to create (max length is 64 characters) | -| description | | Description of the policy to create (max length is 200 characters) | -| rules.{index}.permission-set-names.{index} | | Names of permission sets bound to the rule | -| rules.{index}.condition | | Condition expression to evaluate | -| rules.{index}.project-ids.{index} | | List of Project IDs the rule is scoped to | -| rules.{index}.organization-id | | ID of Organization the rule is scoped to | -| tags.{index} | | Tags associated with the policy (maximum of 10 tags) | -| user-id | | ID of user attributed to the policy | -| group-id | | ID of group attributed to the policy | -| application-id | | ID of application attributed to the policy | -| no-principal | | Defines whether or not a policy is attributed to a principal | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - -**Examples:** - - -Add a policy for a group that gives InstanceFullAccess on all projects -``` -scw iam policy create group-id=11111111-1111-1111-1111-111111111111 rules.0.organization-id=11111111-1111-1111-1111-111111111111 rules.0.permission-set-names.0=InstancesFullAccess -``` - - - - -### Delete a policy - -Delete a policy. You must define specify the `policy_id` parameter in your request. Note that when deleting a policy, all permissions it gives to its principal (user, group or application) will be revoked. - -**Usage:** - -``` -scw iam policy delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | Id of policy to delete | - - - -### Get an existing policy - -Retrieve information about a policy, speficified by the `policy_id` parameter. The policy's full details, including `id`, `name`, `organization_id`, `nb_rules` and `nb_scopes`, `nb_permission_sets` are returned in the response. - -**Usage:** - -``` -scw iam policy get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | Id of policy to search | - - - -### List policies of an Organization - -List the policies of an Organization. By default, the policies listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters to filter your query, such as `user_ids`, `groups_ids`, `application_ids`, and `policy_name`. - -**Usage:** - -``` -scw iam policy list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `policy_name_asc`, `policy_name_desc`, `created_at_asc`, `created_at_desc` | Criteria for sorting results | -| editable | | Defines whether or not filter out editable policies | -| user-ids.{index} | | Defines whether or not to filter by list of user IDs | -| group-ids.{index} | | Defines whether or not to filter by list of group IDs | -| application-ids.{index} | | Filter by a list of application IDs | -| no-principal | | Defines whether or not the policy is attributed to a principal | -| policy-name | | Name of the policy to fetch | -| tag | | Filter by tags containing a given string | -| policy-ids.{index} | | Filter by a list of IDs | -| organization-id | Default: `` | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Update an existing policy - -Update the parameters of a policy, including `name`, `description`, `user_id`, `group_id`, `application_id` and `no_principal`. - -**Usage:** - -``` -scw iam policy update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | Id of policy to update | -| name | | New name for the policy (max length is 64 characters) | -| description | | New description of policy (max length is 200 characters) | -| tags.{index} | | New tags for the policy (maximum of 10 tags) | -| user-id | | New ID of user attributed to the policy | -| group-id | | New ID of group attributed to the policy | -| application-id | | New ID of application attributed to the policy | -| no-principal | | Defines whether or not the policy is attributed to a principal | - - - -## Rules management commands - -Rules management commands. - - -### Create a rule for a specific IAM policy - - - -**Usage:** - -``` -scw iam rule create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | | Id of policy to update | -| permission-set-names.{index} | | Names of permission sets bound to the rule | -| project-ids.{index} | | List of Project IDs the rule is scoped to | -| organization-id | | ID of Organization the rule is scoped to | - - - -### Delete a rule for a specific IAM policy - - - -**Usage:** - -``` -scw iam rule delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | | Id of policy to update | -| rule-id | | Id of rule to delete | - - - -### List rules of a given policy - -List the rules of a given policy. By default, the rules listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `policy_id` in the query path of your request. - -**Usage:** - -``` -scw iam rule list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | Id of policy to search | - - - -### Set rules of a given policy - -Overwrite the rules of a given policy. Any information that you add using this command will overwrite the previous configuration. If you include some of the rules you already had in your previous configuration in your new one, but you change their order, the new order of display will apply. While policy rules are ordered, they have no impact on the access logic of IAM because rules are allow-only. - -**Usage:** - -``` -scw iam rule update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| policy-id | Required | Id of policy to update | -| rules.{index}.permission-set-names.{index} | | Names of permission sets bound to the rule | -| rules.{index}.condition | | Condition expression to evaluate | -| rules.{index}.project-ids.{index} | | List of Project IDs the rule is scoped to | -| rules.{index}.organization-id | | ID of Organization the rule is scoped to | - - - -## SSH keys management commands - -SSH keys management commands. - - -### Create an SSH key - -Add a new SSH key to a Scaleway Project. You must specify the `name`, `public_key` and `project_id`. - -**Usage:** - -``` -scw iam ssh-key create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the SSH key. Max length is 1000 | -| public-key | Required | SSH public key. Currently only the ssh-rsa, ssh-dss (DSA), ssh-ed25519 and ecdsa keys with NIST curves are supported. Max length is 65000 | -| project-id | | Project ID to use. If none is passed the default project ID will be used | - - -**Examples:** - - -Add a given ssh key -``` -scw iam ssh-key create name=foobar public-key="$(cat )" -``` - - - - -### Delete an SSH key - -Delete a given SSH key, specified by the `ssh_key_id`. Deleting an SSH is permanent, and cannot be undone. Note that you might need to update any configurations that used the SSH key. - -**Usage:** - -``` -scw iam ssh-key delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ssh-key-id | Required | | - - -**Examples:** - - -Delete a given SSH key -``` -scw iam ssh-key delete 11111111-1111-1111-1111-111111111111 -``` - - - - -### Get an SSH key - -Retrieve information about a given SSH key, specified by the `ssh_key_id` parameter. The SSH key's full details, including `id`, `name`, `public_key`, and `project_id` are returned in the response. - -**Usage:** - -``` -scw iam ssh-key get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ssh-key-id | Required | ID of the SSH key | - - - -### Initialize SSH key - -Initialize SSH key. - -**Usage:** - -``` -scw iam ssh-key init -``` - - - -### List SSH keys - -List SSH keys. By default, the SSH keys listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You can define additional parameters for your query such as `organization_id`, `name`, `project_id` and `disabled`. - -**Usage:** - -``` -scw iam ssh-key list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Sort order of the SSH keys | -| name | | Name of group to find | -| project-id | | Filter by Project ID | -| disabled | | Defines whether to include disabled SSH keys or not | -| organization-id | Default: `` | Filter by Organization ID | - - - -### Update an SSH key - -Update the parameters of an SSH key, including `name` and `disable`. - -**Usage:** - -``` -scw iam ssh-key update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ssh-key-id | Required | | -| name | | Name of the SSH key. Max length is 1000 | -| disabled | | Enable or disable the SSH key | - - - -## Users management commands - -Users management commands. - - -### Create a new user - -Create a new user. You must define the `organization_id` and the `email` in your request. - -**Usage:** - -``` -scw iam user create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| email | | Email of the user | -| tags.{index} | | Tags associated with the user | -| member.email | | Email of the user to create | -| member.send-password-email | | Whether or not to send an email containing the member's password. | -| member.username | | The member's username | -| member.password | | The member's password | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - - -### Delete a guest user from an Organization - -Remove a user from an Organization in which they are a guest. You must define the `user_id` in your request. Note that removing a user from an Organization automatically deletes their API keys, and any policies directly attached to them become orphaned. - -**Usage:** - -``` -scw iam user delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| user-id | Required | ID of the user to delete | - - - -### Get a given user - -Retrieve information about a user, specified by the `user_id` parameter. The user's full details, including `id`, `email`, `organization_id`, `status` and `mfa` are returned in the response. - -**Usage:** - -``` -scw iam user get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| user-id | Required | ID of the user to find | - - - -### List users of an Organization - -List the users of an Organization. By default, the users listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `user_ids`. - -**Usage:** - -``` -scw iam user list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | Default: `created_at_asc`
One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `email_asc`, `email_desc`, `last_login_asc`, `last_login_desc` | Criteria for sorting results | -| user-ids.{index} | | Filter by list of IDs | -| mfa | | Filter by MFA status | -| tag | | Filter by tags containing a given string | -| organization-id | Required
Default: `` | ID of the Organization to filter | - - - -### Update a user - -Update the parameters of a user, including `tags`. - -**Usage:** - -``` -scw iam user update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| user-id | Required | ID of the user to update | -| tags.{index} | | New tags for the user (maximum of 10 tags) | - - - diff --git a/docs/docs/index.md b/docs/docs/index.md deleted file mode 100644 index 1cb72e0cdb..0000000000 --- a/docs/docs/index.md +++ /dev/null @@ -1,149 +0,0 @@ - - -# Scaleway CLI v2 Documentation - -

- -

- CircleCI - GoReportCard -

- -Scaleway CLI is a tool to help you pilot your Scaleway infrastructure directly from your terminal. - -!!! warning - - This website is under construction and may contain out-of-date information. Refer to the [Scaleway CLI repository](https://github.com/scaleway/scaleway-cli) for the latest release. - -## Installation - -### With a Package Manager (Recommended) - -A package manager installs and upgrades the Scaleway CLI with a single command. -We recommend this installation mode for more simplicity and reliability: - -#### Homebrew - -Install the [latest stable release](https://formulae.brew.sh/formula/scw) on macOS/Linux using [Homebrew](http://brew.sh): - -```sh -brew install scw -``` - -#### Arch Linux - -Install the latest stable release on Arch Linux from [official repositories](https://archlinux.org/packages/extra/x86_64/scaleway-cli/). -For instance with `pacman`: - -```sh -pacman -S scaleway-cli -``` - -#### Chocolatey - -Install the latest stable release on Windows using [Chocolatey](https://chocolatey.org/) ([Package](https://chocolatey.org/packages/scaleway-cli)): - -```powershell -choco install scaleway-cli -``` - -### Manually - -#### Released Binaries - -We provide [static-compiled binaries](https://github.com/scaleway/scaleway-cli/releases/latest) for darwin (macOS), GNU/Linux, and Windows platforms. -You just have to download the binary compatible with your platform to a directory available in your `PATH`: - -##### Linux - -```bash -curl -s https://raw.githubusercontent.com/scaleway/scaleway-cli/master/scripts/get.sh | sh -``` - -##### Windows - -You can download the last release here:
-[This official guide](https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574%28v%3Doffice.14%29) explains how to add tools to your `PATH`. - -### Docker Image - -You can use the CLI as you would run any Docker image: - -```sh -docker run -i --rm scaleway/cli:latest -``` - -See more in-depth information about running the CLI in Docker [here](./docs/docker.md) - -# Getting Started - -## Setup your configuration - -After you [installed](#Installation) the latest release just run the initialization command and let yourself be guided! :dancer: - -```bash -scw init -``` - -It will set up your profile, the authentication, and the auto-completion. - -## Basic commands - -``` -# Create an instance server -scw instance server create type=DEV1-S image=ubuntu_focal zone=fr-par-1 tags.0="scw-cli" - -# List your servers -scw instance server list - -# Create a Kubernetes cluster named foo with cilium as CNI, in version 1.17.4 and with a pool named default composed of 3 DEV1-M and with 2 tags -scw k8s cluster create name=foo version=1.17.4 pools.0.size=3 pools.0.node-type=DEV1-M pools.0.name=default tags.0=tag1 tags.1=tag2 -``` - -## Environment - -You can configure your config or enable functionalities with environment variables. - -Variables to override config are describe in [config documentation](docs/commands/config.md). -To enable beta features, you can set `SCW_ENABLE_BETA=1` in your environment. - -## Build it yourself - -### Build Locally - -If you have a >= Go 1.13 environment, you can install the `HEAD` version to test the latest features or to [contribute](./.github/CONTRIBUTING.md). -Note that this development version could include bugs, use [tagged releases](https://github.com/scaleway/scaleway-cli/releases/latest) if you need stability. - -```bash -go install github.com/scaleway/scaleway-cli/v2/cmd/scw@latest -``` - -Dependencies: We only use go [Modules](https://github.com/golang/go/wiki/Modules) with vendoring. - -### Build with Docker - -You can build the `scw` CLI with Docker. If you have Docker installed, you can run: - -```sh -docker build -t scaleway/cli . -``` - -Once built, you can then use the CLI as you would run any image: - -```sh -docker run -i --rm scaleway/cli -``` - -See more in-depth information about running the CLI in Docker [here](./docs/docker.md) - -# Development - -This repository is at its early stage and is still in active development. -If you are looking for a way to contribute please read [CONTRIBUTING.md](./.github/CONTRIBUTING.md). - -# Reach Us - -We love feedback. -Don't hesitate to open a [Github issue](https://github.com/scaleway/scaleway-cli/issues/new) or -feel free to reach us on [Scaleway Slack community](https://slack.scaleway.com/), -we are waiting for you on [#opensource](https://scaleway-community.slack.com/app_redirect?channel=opensource). diff --git a/docs/docs/inference.md b/docs/docs/inference.md deleted file mode 100644 index 409ebe4f9a..0000000000 --- a/docs/docs/inference.md +++ /dev/null @@ -1,401 +0,0 @@ - -# Documentation for `scw inference` -This API allows you to manage your Inference services. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) - - [Add new ACLs](#add-new-acls) - - [Delete an exising ACL](#delete-an-exising-acl) - - [List your ACLs](#list-your-acls) - - [Set new ACL](#set-new-acl) -- [Deployment commands](#deployment-commands) - - [Create a deployment](#create-a-deployment) - - [Delete a deployment](#delete-a-deployment) - - [Get a deployment](#get-a-deployment) - - [Get the CA certificate](#get-the-ca-certificate) - - [List inference deployments](#list-inference-deployments) - - [Update a deployment](#update-a-deployment) -- [Endpoint management commands](#endpoint-management-commands) - - [Create an endpoint](#create-an-endpoint) - - [Delete an endpoint](#delete-an-endpoint) - - [Update an endpoint](#update-an-endpoint) -- [Models commands](#models-commands) - - [Get a model](#get-a-model) - - [List models](#list-models) -- [Node types management commands](#node-types-management-commands) - - [List available node types](#list-available-node-types) - -## Access Control List (ACL) management commands - -Access Control List (ACL) management commands. - - -### Add new ACLs - -Add new ACL rules for a specific deployment. - -**Usage:** - -``` -scw inference acl add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to add ACL rules to | -| acls.{index}.ip | | IP address to be allowed | -| acls.{index}.description | | Description of the ACL rule | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete an exising ACL - -Delete an exising ACL. - -**Usage:** - -``` -scw inference acl delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | ID of the ACL rule to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List your ACLs - -List ACLs for a specific deployment. - -**Usage:** - -``` -scw inference acl list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to list ACL rules for | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set new ACL - -Set new ACL rules for a specific deployment. - -**Usage:** - -``` -scw inference acl set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to set ACL rules for | -| acls.{index}.ip | | IP address to be allowed | -| acls.{index}.description | | Description of the ACL rule | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Deployment commands - -Deployment commands. - - -### Create a deployment - -Create a new inference deployment related to a specific model. - -**Usage:** - -``` -scw inference deployment create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the deployment | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| model-name | Required | Name of the model to use | -| accept-eula | | Accept the model's End User License Agreement (EULA). | -| node-type | Required | Name of the node type to use | -| tags.{index} | | List of tags to apply to the deployment | -| min-size | | Defines the minimum size of the pool | -| max-size | | Defines the maximum size of the pool | -| endpoints.{index}.is-public | Default: `false` | Will configure your public endpoint if true | -| endpoints.{index}.private-network.private-network-id | | ID of the Private Network | -| endpoints.{index}.disable-auth | Default: `false` | Disable the authentication on the endpoint. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a deployment - -Delete an existing inference deployment. - -**Usage:** - -``` -scw inference deployment delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a deployment - -Get the deployment for the given ID. - -**Usage:** - -``` -scw inference deployment get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to get | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get the CA certificate - -Get the CA certificate used for the deployment of private endpoints. -The CA certificate will be returned as a PEM file. - -**Usage:** - -``` -scw inference deployment get-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List inference deployments - -List all your inference deployments. - -**Usage:** - -``` -scw inference deployment list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_desc`, `created_at_asc`, `name_asc`, `name_desc` | Order in which to return results | -| project-id | | Filter by Project ID | -| name | | Filter by deployment name | -| tags.{index} | | Filter by tags | -| organization-id | | Filter by Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a deployment - -Update an existing inference deployment. - -**Usage:** - -``` -scw inference deployment update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to update | -| name | | Name of the deployment | -| tags.{index} | | List of tags to apply to the deployment | -| min-size | | Defines the new minimum size of the pool | -| max-size | | Defines the new maximum size of the pool | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Endpoint management commands - -Endpoint management commands. - - -### Create an endpoint - -Create a new Endpoint related to a specific deployment. - -**Usage:** - -``` -scw inference endpoint create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| deployment-id | Required | ID of the deployment to create the endpoint for | -| endpoint.is-public | Default: `false` | Will configure your public endpoint if true | -| endpoint.private-network.private-network-id | | ID of the Private Network | -| endpoint.disable-auth | Default: `false` | Disable the authentication on the endpoint. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete an endpoint - -Delete an existing Endpoint. - -**Usage:** - -``` -scw inference endpoint delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | ID of the endpoint to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update an endpoint - -Update an existing Endpoint. - -**Usage:** - -``` -scw inference endpoint update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | ID of the endpoint to update | -| disable-auth | | Disable the authentication on the endpoint. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Models commands - -Models commands. - - -### Get a model - -Get the model for the given ID. - -**Usage:** - -``` -scw inference model get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| model-id | Required | ID of the model to get | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List models - -List all available models. - -**Usage:** - -``` -scw inference model list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `display_rank_asc`, `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| project-id | | Filter by Project ID | -| name | | Filter by model name | -| tags.{index} | | Filter by tags | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Node types management commands - -Node types management commands. - - -### List available node types - -List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw inference node-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| include-disabled-types | | Include disabled node types in the response | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/info.md b/docs/docs/info.md deleted file mode 100644 index 105de22ad0..0000000000 --- a/docs/docs/info.md +++ /dev/null @@ -1,6 +0,0 @@ - -# Documentation for `scw info` -Get info about current settings - - - diff --git a/docs/docs/init.md b/docs/docs/init.md deleted file mode 100644 index 5a7109bbc9..0000000000 --- a/docs/docs/init.md +++ /dev/null @@ -1,12 +0,0 @@ - -# Documentation for `scw init` -Initialize the active profile of the config. -Default path for configuration file is based on the following priority order: - -- $SCW_CONFIG_PATH -- $XDG_CONFIG_HOME/scw/config.yaml -- $HOME/.config/scw/config.yaml -- $USERPROFILE/.config/scw/config.yaml - - - diff --git a/docs/docs/instance.md b/docs/docs/instance.md deleted file mode 100644 index fbc7de8e2b..0000000000 --- a/docs/docs/instance.md +++ /dev/null @@ -1,3247 +0,0 @@ - -# Documentation for `scw instance` -This API allows you to manage your Instances. - -- [Image management commands](#image-management-commands) - - [Create an Instance image](#create-an-instance-image) - - [Delete an Instance image](#delete-an-instance-image) - - [Get an Instance image](#get-an-instance-image) - - [List Instance images](#list-instance-images) - - [Update image](#update-image) - - [Wait for image to reach a stable state](#wait-for-image-to-reach-a-stable-state) -- [IP management commands](#ip-management-commands) - - [Attach an IP to a given server](#attach-an-ip-to-a-given-server) - - [Reserve a flexible IP](#reserve-a-flexible-ip) - - [Delete a flexible IP](#delete-a-flexible-ip) - - [Detach an ip from its server](#detach-an-ip-from-its-server) - - [Get a flexible IP](#get-a-flexible-ip) - - [List all flexible IPs](#list-all-flexible-ips) - - [Update a flexible IP](#update-a-flexible-ip) -- [Placement group management commands](#placement-group-management-commands) - - [Create a placement group](#create-a-placement-group) - - [Delete the specified placement group](#delete-the-specified-placement-group) - - [Get a placement group](#get-a-placement-group) - - [Get placement group servers](#get-placement-group-servers) - - [List placement groups](#list-placement-groups) - - [Set placement group](#set-placement-group) - - [Set placement group servers](#set-placement-group-servers) - - [Update a placement group](#update-a-placement-group) - - [Update placement group servers](#update-placement-group-servers) -- [Private NIC management commands](#private-nic-management-commands) - - [Create a private NIC connecting an Instance to a Private Network](#create-a-private-nic-connecting-an-instance-to-a-private-network) - - [Delete a private NIC](#delete-a-private-nic) - - [Get a private NIC](#get-a-private-nic) - - [List all private NICs](#list-all-private-nics) - - [Update a private NIC](#update-a-private-nic) -- [Security group management commands](#security-group-management-commands) - - [Remove all rules of a security group](#remove-all-rules-of-a-security-group) - - [Create a security group](#create-a-security-group) - - [Create rule](#create-rule) - - [Delete a security group](#delete-a-security-group) - - [Delete rule](#delete-rule) - - [Edit all rules of a security group](#edit-all-rules-of-a-security-group) - - [Get a security group](#get-a-security-group) - - [Get rule](#get-rule) - - [List security groups](#list-security-groups) - - [Get default rules](#get-default-rules) - - [List rules](#list-rules) - - [Update all the rules of a security group](#update-all-the-rules-of-a-security-group) - - [Update a security group](#update-a-security-group) - - [Update security group rule](#update-security-group-rule) -- [Instance management commands](#instance-management-commands) - - [Perform a raw API action on a server](#perform-a-raw-api-action-on-a-server) - - [Attach an IP to a server](#attach-an-ip-to-a-server) - - [Attach a volume to a server](#attach-a-volume-to-a-server) - - [Backup server](#backup-server) - - [Connect to the serial console of an instance](#connect-to-the-serial-console-of-an-instance) - - [Create server](#create-server) - - [Delete server](#delete-server) - - [Detach an IP from a server](#detach-an-ip-from-a-server) - - [Detach a volume from its server](#detach-a-volume-from-its-server) - - [Migrate server to IP mobility](#migrate-server-to-ip-mobility) - - [Get an Instance](#get-an-instance) - - [Get your server rdp password and decrypt it using your ssh key](#get-your-server-rdp-password-and-decrypt-it-using-your-ssh-key) - - [List all Instances](#list-all-instances) - - [List Instance actions](#list-instance-actions) - - [Reboot server](#reboot-server) - - [SSH into a server](#ssh-into-a-server) - - [Put server in standby mode](#put-server-in-standby-mode) - - [Power on server](#power-on-server) - - [Power off server](#power-off-server) - - [Terminate server](#terminate-server) - - [Update an Instance](#update-an-instance) - - [Wait for server to reach a stable state](#wait-for-server-to-reach-a-stable-state) -- [Instance type management commands](#instance-type-management-commands) - - [Get availability](#get-availability) - - [List Instance types](#list-instance-types) -- [Snapshot management commands](#snapshot-management-commands) - - [Migrate a volume and/or snapshots to SBS (Scaleway Block Storage)](#migrate-a-volume-andor-snapshots-to-sbs-(scaleway-block-storage)) - - [Create a snapshot from a specified volume or from a QCOW2 file](#create-a-snapshot-from-a-specified-volume-or-from-a-qcow2-file) - - [Delete a snapshot](#delete-a-snapshot) - - [Export a snapshot](#export-a-snapshot) - - [Get a snapshot](#get-a-snapshot) - - [List snapshots](#list-snapshots) - - [Get a volume or snapshot's migration plan](#get-a-volume-or-snapshot's-migration-plan) - - [Update a snapshot](#update-a-snapshot) - - [Wait for snapshot to reach a stable state](#wait-for-snapshot-to-reach-a-stable-state) -- [SSH Utilities](#ssh-utilities) - - [Add a public key to a server](#add-a-public-key-to-a-server) - - [Install a ssh config with all your servers as host -It generate hosts for instance servers, baremetal, apple-silicon and bastions](#install-a-ssh-config-with-all-your-servers-as-host -it-generate-hosts-for-instance-servers,-baremetal,-apple-silicon-and-bastions) - - [List manually added public keys](#list-manually-added-public-keys) - - [Remove a manually added public key from a server](#remove-a-manually-added-public-key-from-a-server) -- [User data management commands](#user-data-management-commands) - - [Delete user data](#delete-user-data) - - [Get user data](#get-user-data) - - [List user data](#list-user-data) - - [Add/set user data](#addset-user-data) -- [Volume management commands](#volume-management-commands) - - [Migrate a volume and/or snapshots to SBS (Scaleway Block Storage)](#migrate-a-volume-andor-snapshots-to-sbs-(scaleway-block-storage)) - - [Create a volume](#create-a-volume) - - [Delete a volume](#delete-a-volume) - - [Get a volume](#get-a-volume) - - [List volumes](#list-volumes) - - [Get a volume or snapshot's migration plan](#get-a-volume-or-snapshot's-migration-plan) - - [Update a volume](#update-a-volume) - - [Wait for volume to reach a stable state](#wait-for-volume-to-reach-a-stable-state) -- [Volume type management commands](#volume-type-management-commands) - - [List volume types](#list-volume-types) - - -## Image management commands - -Images are backups of your Instances. -One image will contain all the volumes of your Instance and can be used to restore your Instance and its data. You can also use it to create a series of Instances with a predefined configuration. -To copy not all but only one specified volume of an Instance, you can use the snapshot feature instead. - - -### Create an Instance image - -Create an Instance image from the specified snapshot ID. - -**Usage:** - -``` -scw instance image create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the image | -| snapshot-id | Required | UUID of the snapshot that will be used as root volume in the image | -| arch | Required
One of: `unknown_arch`, `x86_64`, `arm`, `arm64` | Architecture of the image | -| ~~default-bootscript~~ | Deprecated | Default bootscript of the image | -| additional-volumes.{index}.id | | UUID of the snapshot to add | -| additional-volumes.{index}.name | | Name of the additional snapshot | -| additional-volumes.{index}.size | | Size of the additional snapshot | -| additional-volumes.{index}.volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Underlying volume type of the additional snapshot | -| additional-volumes.{index}.project-id | | Project ID that own the additional snapshot | -| ~~additional-volumes.{index}.organization-id~~ | Deprecated | Organization ID that own the additional snapshot | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags of the image | -| public | | True to create a public image | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create an image named 'foobar' for x86_64 Instances from the specified snapshot ID -``` -scw instance server image create name=foobar snapshot-id=11111111-1111-1111-1111-111111111111 arch=x86_64 -``` - - - - -### Delete an Instance image - -Delete the image with the specified ID. - -**Usage:** - -``` -scw instance image delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | UUID of the image you want to delete | -| with-snapshots | | Delete the snapshots attached to this image | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete an image in the default zone with the specified ID -``` -scw instance image delete 11111111-1111-1111-1111-111111111111 -``` - -Delete an image in fr-par-1 zone with the specified ID -``` -scw instance image delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Get an Instance image - -Get details of an image with the specified ID. - -**Usage:** - -``` -scw instance image get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | UUID of the image you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get an image in the default zone with the specified ID -``` -scw instance image get 11111111-1111-1111-1111-111111111111 -``` - -Get an image in fr-par-1 zone with the specified ID -``` -scw instance image get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### List Instance images - -List all existing Instance images. - -**Usage:** - -``` -scw instance image list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | | -| public | | | -| arch | | | -| project-id | | | -| tags | | | -| organization-id | | | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all public images in the default zone -``` -scw instance image list -``` - - - - -### Update image - -Update the properties of an image. - -**Usage:** - -``` -scw instance image update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | UUID of the image | -| name | | Name of the image | -| arch | One of: `unknown_arch`, `x86_64`, `arm`, `arm64` | Architecture of the image | -| extra-volumes.{key}.id | | UUID of the snapshot | -| tags.{index} | | Tags of the image | -| public | | True to set the image as public | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for image to reach a stable state - -Wait for image to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the image. - -**Usage:** - -``` -scw instance image wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | ID of the image. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `1h0m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a image to reach a stable state -``` -scw instance image wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## IP management commands - -A flexible IP address is an IP address which you hold independently of any Instance. -You can attach it to any of your Instances and do live migration of the IP address between your Instances. - -Note that attaching a flexible IP address to an Instance removes its previous public IP and interrupts any ongoing public connection to the Instance. This does not apply if you have migrated your server to the new Network stack and have at least one flexible IP attached to the Instance. - - -### Attach an IP to a given server - -Attach an IP to a given server. - -**Usage:** - -``` -scw instance ip attach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip | Required | IP or UUID of the IP. | -| server-id | Required | UUID of the server to attach the IP to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Attach an IP to the given server -``` -scw instance ip attach 1.2.3.4 server-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### Reserve a flexible IP - -Reserve a flexible IP and attach it to the specified Instance. - -**Usage:** - -``` -scw instance ip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags of the IP | -| server | | UUID of the Instance you want to attach the IP to | -| type | One of: `unknown_iptype`, `nat`, `routed_ipv4`, `routed_ipv6` | IP type to reserve (either 'routed_ipv4' or 'routed_ipv6', use of 'nat' is deprecated) | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create an IP in the default zone -``` -scw instance ip create -``` - -Create an IP in fr-par-1 zone -``` -scw instance ip create zone=fr-par-1 -``` - -Create an IP and attach it to the specified Instance -``` -scw instance ip create server=11111111-1111-1111-1111-111111111111 -``` - - - - -### Delete a flexible IP - -Delete the IP with the specified ID. - -**Usage:** - -``` -scw instance ip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip | Required | ID or address of the IP to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete an IP in the default zone with the specified ID -``` -scw instance ip delete 11111111-1111-1111-1111-111111111111 -``` - -Delete an IP in fr-par-1 zone with the specified ID -``` -scw instance ip delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - -Delete an IP using directly the specified IP address -``` -scw instance ip delete 51.15.253.183 -``` - - - - -### Detach an ip from its server - -Detach an ip from its server. - -**Usage:** - -``` -scw instance ip detach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip | Required | IP or UUID of the IP. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Detach an IP by using its UUID -``` -scw instance ip detach 11111111-1111-1111-1111-111111111111 -``` - -Detach an IP by using its IP address -``` -scw instance ip detach 1.2.3.4 -``` - - - - -### Get a flexible IP - -Get details of an IP with the specified ID or address. - -**Usage:** - -``` -scw instance ip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip | Required | IP ID or address to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get an IP in the default zone with the specified ID -``` -scw instance ip get 11111111-1111-1111-1111-111111111111 -``` - -Get an IP in fr-par-1 zone with the specified ID -``` -scw instance ip get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - -Get an IP, directly using the specified IP address -``` -scw instance ip get 51.15.253.183 -``` - - - - -### List all flexible IPs - -List all flexible IPs in a specified zone. - -**Usage:** - -``` -scw instance ip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID in which the IPs are reserved | -| tags | | Filter IPs with these exact tags (to filter with several tags, use commas to separate them) | -| name | | Filter on the IP address (Works as a LIKE operation on the IP address) | -| type | | Filter on the IP Mobility IP type (whose value should be either 'routed_ipv4', 'routed_ipv6' or 'nat') | -| organization-id | | Organization ID in which the IPs are reserved | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all IPs in the default zone -``` -scw instance ip list -``` - -List all IPs in fr-par-1 zone -``` -scw instance ip list zone=fr-par-1 -``` - - - - -### Update a flexible IP - -Update a flexible IP in the specified zone with the specified ID. - -**Usage:** - -``` -scw instance ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip | Required | IP ID or IP address | -| reverse | | Reverse domain name | -| type | One of: `unknown_iptype`, `nat`, `routed_ipv4`, `routed_ipv6` | Convert a 'nat' IP to a 'routed_ipv4' | -| tags.{index} | | An array of keywords you want to tag this IP with | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Update an IP in the default zone with the specified ID -``` -scw instance ip update 11111111-1111-1111-1111-111111111111 reverse=example.com -``` - -Update an IP in fr-par-1 zone with the specified ID -``` -scw instance ip update 11111111-1111-1111-1111-111111111111 zone=fr-par-1 reverse=example.com -``` - -Update an IP using directly the specified IP address -``` -scw instance ip update 51.15.253.183 reverse=example.com -``` - - - - -## Placement group management commands - -Placement groups allow the user to express a preference regarding -the physical position of a group of Instances. The feature lets the user -choose to either group Instances on the same physical hardware for -best network throughput and low latency or to spread Instances across -physically distanced hardware to reduce the risk of physical failure. - -The operating mode is selected by a `policy_type`. Two policy -types are available: - - `low_latency` will group Instances on the same hypervisors - - `max_availability` will spread Instances across physically distanced hypervisors - -The `policy_type` is set to `max_availability` by default. - -For each policy types, one of the two `policy_mode` may be selected: - - `optional` will start your Instances even if the constraint is not respected - - `enforced` guarantees that if the Instance starts, the constraint is respected - -The `policy_mode` is set by default to `optional`. - - -### Create a placement group - -Create a new placement group in a specified Availability Zone. - -**Usage:** - -``` -scw instance placement-group create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the placement group | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags of the placement group | -| policy-mode | One of: `optional`, `enforced` | Operating mode of the placement group | -| policy-type | One of: `max_availability`, `low_latency` | Policy type of the placement group | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create a placement group with default name -``` -scw instance placement-group create -``` - -Create a placement group with the specified name -``` -scw instance placement-group create name=foobar -``` - -Create an enforced placement group -``` -scw instance placement-group create policy-mode=enforced -``` - -Create an optional placement group -``` -scw instance placement-group create policy-mode=optional -``` - -Create an optional low latency placement group -``` -scw instance placement-group create policy-mode=optional policy-type=low_latency -``` - -Create an enforced low latency placement group -``` -scw instance placement-group create policy-mode=enforced policy-type=low_latency -``` - - - - -### Delete the specified placement group - -Delete the specified placement group. - -**Usage:** - -``` -scw instance placement-group delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete a placement group in the default zone with the specified ID -``` -scw instance placement-group delete 11111111-1111-1111-1111-111111111111 -``` - -Delete a placement group in fr-par-1 zone with the specified ID -``` -scw instance placement-group delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Get a placement group - -Get the specified placement group. - -**Usage:** - -``` -scw instance placement-group get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a placement group with the specified ID -``` -scw instance placement-group get 6c15f411-3b6f-402d-8eba-ae24ef9254e9 -``` - - - - -### Get placement group servers - -Get all Instances belonging to the specified placement group. - -**Usage:** - -``` -scw instance placement-group get-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List placement groups - -List all placement groups in a specified Availability Zone. - -**Usage:** - -``` -scw instance placement-group list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | List only placement groups of this Project ID | -| tags | | List placement groups with these exact tags (to filter with several tags, use commas to separate them) | -| name | | Filter placement groups by name (for eg. "cluster1" will return "cluster100" and "cluster1" but not "foo") | -| organization-id | | List only placement groups of this Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all placement groups in the default zone -``` -scw instance placement-group list -``` - -List placement groups that match a specified name ('cluster1' will return 'cluster100' and 'cluster1' but not 'foo') -``` -scw instance placement-group list name=cluster1 -``` - - - - -### Set placement group - -Set all parameters of the specified placement group. - -**Usage:** - -``` -scw instance placement-group set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | | -| name | | | -| policy-mode | One of: `optional`, `enforced` | | -| policy-type | One of: `max_availability`, `low_latency` | | -| project | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | | -| organization | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Set placement group servers - -Set all Instances belonging to the specified placement group. - -**Usage:** - -``` -scw instance placement-group set-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group you want to set | -| servers.{index} | Required | An array of the Instances' UUIDs you want to configure | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Update the complete set of Instances in a specified placement group (all Instances must be shut down) -``` -scw instance placement-group set-servers placement-group-id=ced0fd4d-bcf0-4479-85b6-7027e54456e6 servers.0=5a250608-24ec-4c31-9631-b3ded8c861cb servers.1=e54fd249-0787-4794-ab14-af6ee74df274 -``` - - - - -### Update a placement group - -Update one or more parameter of the specified placement group. - -**Usage:** - -``` -scw instance placement-group update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group | -| name | | Name of the placement group | -| tags.{index} | | Tags of the placement group | -| policy-mode | One of: `optional`, `enforced` | Operating mode of the placement group | -| policy-type | One of: `max_availability`, `low_latency` | Policy type of the placement group | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Update the name of a placement group -``` -scw instance placement-group update 95053f33-cd3c-4cdc-b2b0-57d2dda97b13 name=foobar -``` - -Update the policy mode of a placement group (all Instances in your placement group MUST be shut down) -``` -scw instance placement-group update 1f883434-8c2d-40f0-b686-d0754b3a7bc0 policy-mode=enforced -``` - -Update the policy type of a placement group (all Instances in your placement group MUST be shutdown) -``` -scw instance placement-group update 0954ec26-9917-47b6-8c5c-7bc81d7bb9d2 policy-type=low_latency -``` - - - - -### Update placement group servers - -Update all Instances belonging to the specified placement group. - -**Usage:** - -``` -scw instance placement-group update-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| placement-group-id | Required | UUID of the placement group you want to update | -| servers.{index} | Required | An array of the Instances' UUIDs you want to configure | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Private NIC management commands - -A Private NIC is the network interface that connects an Instance to a -Private Network. An Instance can have multiple private NICs at the same -time, but each NIC must belong to a different Private Network. - - -### Create a private NIC connecting an Instance to a Private Network - -Create a private NIC connecting an Instance to a Private Network. - -**Usage:** - -``` -scw instance private-nic create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance the private NIC will be attached to | -| private-network-id | Required | UUID of the private network where the private NIC will be attached | -| tags.{index} | | Private NIC tags | -| ~~ip-ids.{index}~~ | Deprecated | Ip_ids defined from IPAM | -| ipam-ip-ids.{index} | | UUID of IPAM ips, to be attached to the instance in the requested private network | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a private NIC - -Delete a private NIC. - -**Usage:** - -``` -scw instance private-nic delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Instance to which the private NIC is attached | -| private-nic-id | Required | Private NIC unique ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a private NIC - -Get private NIC properties. - -**Usage:** - -``` -scw instance private-nic get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Instance to which the private NIC is attached | -| private-nic-id | Required | The private NIC unique ID or MAC address | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all private NICs - -List all private NICs of a specified Instance. - -**Usage:** - -``` -scw instance private-nic list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Instance to which the private NIC is attached | -| tags | | Private NIC tags | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all private NICs on a specified server -``` -scw instance private-nic list -``` - -List private NICs of the Instance ID 'my_server_id' -``` -scw instance private-nic list server-id=my_server_id -``` - - - - -### Update a private NIC - -Update one or more parameter(s) of a specified private NIC. - -**Usage:** - -``` -scw instance private-nic update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance the private NIC will be attached to | -| private-nic-id | Required | Private NIC unique ID | -| tags.{index} | | Tags used to select private NIC/s | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Update tags of a private NIC -``` -scw instance private-nic update server-id=11111111-1111-1111-1111-111111111111 private-nic-id=11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar -``` - - - - -## Security group management commands - -A security group is a set of firewall rules on a set of Instances. -Security groups enable you to create rules that either drop or allow incoming traffic from certain ports of your Instances. - -Security groups are stateful by default which means return traffic is automatically allowed, regardless of any rules. -As a contrary, you have to switch in a stateless mode to define explicitly allowed. - - -### Remove all rules of a security group - - - -**Usage:** - -``` -scw instance security-group clear [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | ID of the security group to reset. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Remove all rules of the given security group -``` -scw instance security-group clear security-group-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### Create a security group - -Create a security group with a specified name and description. - -**Usage:** - -``` -scw instance security-group create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the security group | -| description | | Description of the security group | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags of the security group | -| ~~organization-default~~ | Deprecated | Defines whether this security group becomes the default security group for new Instances | -| project-default | | Whether this security group becomes the default security group for new Instances | -| stateful | Default: `true` | Whether the security group is stateful or not | -| inbound-default-policy | Default: `accept`
One of: `unknown_policy`, `accept`, `drop` | Default policy for inbound rules | -| outbound-default-policy | Default: `accept`
One of: `unknown_policy`, `accept`, `drop` | Default policy for outbound rules | -| enable-default-security | | True to block SMTP on IPv4 and IPv6. This feature is read only, please open a support ticket if you need to make it configurable | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create a security group with a specified name and description -``` -scw instance security-group create name=foobar description=foobar foobar -``` - -Create a security group that will be applied as default on all Instances of this Project -``` -scw instance security-group create project-default=true -``` - -Create a security group that will have a default drop inbound policy (traffic your Instance receives) -``` -scw instance security-group create inbound-default-policy=drop -``` - -Create a security group that will have a default drop outbound policy (traffic your Instance transmits) -``` -scw instance security-group create outbound-default-policy=drop -``` - -Create a stateless security group -``` -scw instance security-group create -``` - - - - -### Create rule - -Create a rule in the specified security group ID. - -**Usage:** - -``` -scw instance security-group create-rule [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group | -| protocol | Required
One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | | -| direction | Required
One of: `unknown_direction`, `inbound`, `outbound` | | -| action | Required
One of: `unknown_action`, `accept`, `drop` | | -| ip-range | Required
Default: `0.0.0.0/0` | | -| dest-port-from | | Beginning of the range of ports to apply this rule to (inclusive) | -| dest-port-to | | End of the range of ports to apply this rule to (inclusive) | -| position | | Position of this rule in the security group rules list | -| editable | | Indicates if this rule is editable (will be ignored) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Allow incoming SSH -``` -scw instance security-group create-rule security-group-id=1248283f-17de-464a-b03b-3f975ada3fa8 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=22 -``` - -Allow HTTP -``` -scw instance security-group create-rule security-group-id=e8ba77c1-9ccb-4c0c-b08d-555cfd7f57e4 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=80 -``` - -Allow HTTPS -``` -scw instance security-group create-rule security-group-id=e5906437-8650-4fe2-8ca7-32e1d7320c1b protocol=TCP direction=inbound action=accept ip-range= dest-port-from=443 -``` - -Allow a specified IP range -``` -scw instance security-group create-rule security-group-id=b6a58155-a2f8-48bd-9da9-3ff9783fa0d4 protocol=ANY direction=inbound action=accept ip-range=10.0.0.0/16 -``` - -Allow FTP -``` -scw instance security-group create-rule security-group-id=9c46df03-83c2-46fb-936c-16ecb44860e1 protocol=TCP direction=inbound action=accept ip-range= dest-port-from=20 dest-port-to=21 -``` - - - - -### Delete a security group - -Delete a security group with the specified ID. - -**Usage:** - -``` -scw instance security-group delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete the security group with the specified ID -``` -scw instance security-group delete 69e17c83-9945-47ac-8b29-8c1ad050ee83 -``` - - - - -### Delete rule - -Delete a security group rule with the specified ID. - -**Usage:** - -``` -scw instance security-group delete-rule [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | | -| security-group-rule-id | Required | | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete a security group rule with the specified ID -``` -scw instance security-group delete-rule security-group-id=a01a36e5-5c0c-42c1-ae06-167e587b7ac4 security-group-rule-id=b8c773ef-a6ea-4b50-a7c1-737864290a3f -``` - - - - -### Edit all rules of a security group - -This command starts your default editor to edit a marshaled version of your resource -Default editor will be taken from $VISUAL, then $EDITOR or an editor based on your system - -**Usage:** - -``` -scw instance security-group edit [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | ID of the security group to reset. | -| mode | Default: `yaml`
One of: `yaml`, `json` | marshaling used when editing data | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a security group - -Get the details of a security group with the specified ID. - -**Usage:** - -``` -scw instance security-group get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a security group with the specified ID -``` -scw instance security-group get a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - - - - -### Get rule - -Get details of a security group rule with the specified ID. - -**Usage:** - -``` -scw instance security-group get-rule [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | | -| security-group-rule-id | Required | | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get details of a security group rule with the specified ID -``` -scw instance security-group get-rule security-group-id=d900fa38-2f0d-4b09-b6d7-f3e46a13f34c security-group-rule-id=1f9a16a5-7229-4c03-9327-253e257cf38a -``` - - - - -### List security groups - -List all existing security groups. - -**Usage:** - -``` -scw instance security-group list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the security group | -| project-id | | Security group Project ID | -| tags | | List security groups with these exact tags (to filter with several tags, use commas to separate them) | -| project-default | | Filter security groups with this value for project_default | -| organization-id | | Security group Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all security groups that match the specified name -``` -scw instance security-group list name=foobar -``` - - - - -### Get default rules - -Lists the default rules applied to all the security groups. - -**Usage:** - -``` -scw instance security-group list-default-rules [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List rules - -List the rules of the a specified security group ID. - -**Usage:** - -``` -scw instance security-group list-rules [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update all the rules of a security group - -Replaces the existing rules of the security group with the rules provided. This endpoint supports the update of existing rules, creation of new rules and deletion of existing rules when they are not passed in the request. - -**Usage:** - -``` -scw instance security-group set-rules [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group to update the rules on | -| rules.{index}.id | | UUID of the security rule to update. If no value is provided, a new rule will be created | -| rules.{index}.action | One of: `unknown_action`, `accept`, `drop` | Action to apply when the rule matches a packet | -| rules.{index}.protocol | One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | Protocol family this rule applies to | -| rules.{index}.direction | One of: `unknown_direction`, `inbound`, `outbound` | Direction the rule applies to | -| rules.{index}.ip-range | | Range of IP addresses these rules apply to | -| rules.{index}.dest-port-from | | Beginning of the range of ports this rule applies to (inclusive). This value will be set to null if protocol is ICMP or ANY | -| rules.{index}.dest-port-to | | End of the range of ports this rule applies to (inclusive). This value will be set to null if protocol is ICMP or ANY, or if it is equal to dest_port_from | -| rules.{index}.position | | Position of this rule in the security group rules list. If several rules are passed with the same position, the resulting order is undefined | -| rules.{index}.editable | | Indicates if this rule is editable. Rules with the value false will be ignored | -| rules.{index}.zone | | Zone of the rule. This field is ignored | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a security group - -Update the properties of security group. - -**Usage:** - -``` -scw instance security-group update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group | -| name | | Name of the security group | -| description | | Description of the security group | -| enable-default-security | | True to block SMTP on IPv4 and IPv6. This feature is read only, please open a support ticket if you need to make it configurable | -| inbound-default-policy | One of: `unknown_policy`, `accept`, `drop` | Default inbound policy | -| tags.{index} | | Tags of the security group | -| ~~organization-default~~ | Deprecated | Please use project_default instead | -| project-default | | True use this security group for future Instances created in this project | -| outbound-default-policy | One of: `unknown_policy`, `accept`, `drop` | Default outbound policy | -| stateful | | True to set the security group as stateful | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update security group rule - -Update the properties of a rule from a specified security group. - -**Usage:** - -``` -scw instance security-group update-rule [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| security-group-id | Required | UUID of the security group | -| security-group-rule-id | Required | UUID of the rule | -| protocol | One of: `unknown_protocol`, `TCP`, `UDP`, `ICMP`, `ANY` | Protocol family this rule applies to | -| direction | One of: `unknown_direction`, `inbound`, `outbound` | Direction the rule applies to | -| action | One of: `unknown_action`, `accept`, `drop` | Action to apply when the rule matches a packet | -| ip-range | | Range of IP addresses these rules apply to | -| dest-port-from | | Beginning of the range of ports this rule applies to (inclusive). If 0 is provided, unset the parameter. | -| dest-port-to | | End of the range of ports this rule applies to (inclusive). If 0 is provided, unset the parameter. | -| position | | Position of this rule in the security group rules list | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Instance management commands - -Instances are computing units providing resources to run your applications on. -Scaleway offers various Instance types including **Virtual Instances** and **dedicated GPU Instances**. -**Note: Instances can be referenced as "servers" in API endpoints.** - - -### Perform a raw API action on a server - - - -**Usage:** - -``` -scw instance server action [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| action | Required | The raw API action to perform, as listed with 'scw instance server list-actions' | -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Start a server in the default zone with a given id -``` -scw instance server action 11111111-1111-1111-1111-111111111111 action=poweron -``` - - - - -### Attach an IP to a server - - - -**Usage:** - -``` -scw instance server attach-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| ip | Required | UUID of the IP to attach or its UUID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Attach an IP to a server -``` -scw instance server attach-ip 11111111-1111-1111-1111-111111111111 ip=11111111-1111-1111-1111-111111111111 -``` - -Attach an IP to a server -``` -scw instance server attach-ip 11111111-1111-1111-1111-111111111111 ip=1.2.3.4 -``` - - - - -### Attach a volume to a server - - - -**Usage:** - -``` -scw instance server attach-volume [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server | -| volume-id | Required | ID of the volume to attach | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Attach a volume to a server -``` -scw instance server attach-volume server-id=11111111-1111-1111-1111-111111111111 volume-id=22222222-1111-5555-2222-666666111111 -``` - - - - -### Backup server - -Create a new image based on the server. - -This command: - - creates a snapshot of all attached volumes. - - creates an image based on all these snapshots. - -Once your image is ready you will be able to create a new server based on this image. - - -**Usage:** - -``` -scw instance server backup [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server to backup. | -| name | Default: `` | Name of your backup. | -| unified | | Whether or not the type of the snapshot is unified. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create a new image based on a server -``` -scw instance server backup 11111111-1111-1111-1111-111111111111 -``` - - - - -### Connect to the serial console of an instance - - - -**Usage:** - -``` -scw instance server console [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to connect to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Create server - -Create an instance server. - -**Usage:** - -``` -scw instance server create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image | Required
Default: `ubuntu_jammy` | Image ID or label of the server | -| type | Required
Default: `DEV1-S` | Server commercial type (help: https://www.scaleway.com/en/docs/compute/instances/reference-content/choosing-instance-type/) | -| name | Default: `` | Server name | -| root-volume | | Local root volume of the server | -| additional-volumes.{index} | | Additional local and block volumes attached to your server | -| ip | Default: `new` | Either an IP, an IP ID, 'new' to create a new IP, 'dynamic' to use a dynamic IP or 'none' for no public IP (new | dynamic | none | |
) | -| tags.{index} | | Server tags | -| ipv6 | | Enable IPv6, to be used with routed-ip-enabled=false | -| stopped | | Do not start server after its creation | -| security-group-id | | The security group ID used for this server | -| placement-group-id | | The placement group ID in which the server has to be created | -| cloud-init | | The cloud-init script to use | -| boot-type | Default: `local`
One of: `local`, `bootscript`, `rescue` | The boot type to use, if empty the local boot will be used. Will be overwritten to bootscript if bootscript-id is set. | -| routed-ip-enabled | | Enable routed IP support | -| admin-password-encryption-ssh-key-id | | ID of the IAM SSH Key used to encrypt generated admin password. Required when creating a windows server. | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | - - -**Examples:** - - -Create and start an instance on Ubuntu Focal -``` -scw instance server create image=ubuntu_focal -``` - -Create a GP1-XS instance, give it a name and add tags -``` -scw instance server create image=ubuntu_focal type=GP1-XS name=foo tags.0=prod tags.1=blue -``` - -Create an instance with 2 additional block volumes (50GB and 100GB) -``` -scw instance server create image=ubuntu_focal additional-volumes.0=block:50GB additional-volumes.1=block:100GB -``` - -Create an instance with 2 local volumes (10GB and 10GB) -``` -scw instance server create image=ubuntu_focal root-volume=local:10GB additional-volumes.0=local:10GB -``` - -Create an instance with volumes from snapshots -``` -scw instance server create image=ubuntu_focal root-volume=local: additional-volumes.0=block: -``` - -Create and start an instance from a snapshot -``` -scw instance server create image=none root-volume=local: -``` - -Create and start an instance using existing volume -``` -scw instance server create image=ubuntu_focal additional-volumes.0= -``` - -Use an existing IP -``` -ip=$(scw instance ip create | grep id | awk '{ print $2 }') -scw instance server create image=ubuntu_focal ip=$ip -``` - - - - -### Delete server - -Delete a server with the given ID. - -**Usage:** - -``` -scw instance server delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | | -| with-volumes | Default: `all`
One of: `none`, `local`, `block`, `root`, `all` | Delete the volumes attached to the server | -| with-ip | | Delete the IP attached to the server | -| force-shutdown | | Force shutdown of the instance server before deleting it | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete a server in the default zone with a given id -``` -scw instance server delete 11111111-1111-1111-1111-111111111111 -``` - -Delete a server in fr-par-1 zone with a given id -``` -scw instance server delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Detach an IP from a server - - - -**Usage:** - -``` -scw instance server detach-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the server. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Detach IP from a given server -``` -scw instance server detach-ip 11111111-1111-1111-1111-111111111111 -``` - - - - -### Detach a volume from its server - - - -**Usage:** - -``` -scw instance server detach-volume [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | ID of the volume to detach | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Detach a volume from its server -``` -scw instance server detach-volume volume-id=22222222-1111-5555-2222-666666111111 -``` - - - - -### Migrate server to IP mobility - -Enable routed IP for this server and migrate the nat public IP to routed -Server will reboot ! -https://www.scaleway.com/en/docs/compute/instances/api-cli/using-ip-mobility/ - - -**Usage:** - -``` -scw instance server enable-routed-ip [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Migrate a server with legacy network to IP mobility -``` -scw instance server enable-routed-ip 11111111-1111-1111-1111-111111111111 -``` - - - - -### Get an Instance - -Get the details of a specified Instance. - -**Usage:** - -``` -scw instance server get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get the Instance with its specified ID -``` -scw instance server get 94ededdf-358d-4019-9886-d754f8a2e78d -``` - - - - -### Get your server rdp password and decrypt it using your ssh key - - - -**Usage:** - -``` -scw instance server get-rdp-password [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to connect to | -| key | Default: `~/.ssh/id_rsa` | Path of the SSH key used to decrypt the rdp password | -| zone | Default: `fr-par-1` | Zone to target. If none is passed will use default zone from the config | - - - -### List all Instances - -List all Instances in a specified Availability Zone, e.g. `fr-par-1`. - -**Usage:** - -``` -scw instance server list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | List only Instances of this Project ID | -| name | | Filter Instances by name (eg. "server1" will return "server100" and "server1" but not "foo") | -| ~~private-ip~~ | Deprecated | List Instances by private_ip | -| without-ip | | List Instances that are not attached to a public IP | -| with-ip | | List Instances by IP (both private_ip and public_ip are supported) | -| commercial-type | | List Instances of this commercial type | -| state | One of: `running`, `stopped`, `stopped in place`, `starting`, `stopping`, `locked` | List Instances in this state | -| tags | | List Instances with these exact tags (to filter with several tags, use commas to separate them) | -| private-network | | List Instances in this Private Network | -| order | One of: `creation_date_desc`, `creation_date_asc`, `modification_date_desc`, `modification_date_asc` | Define the order of the returned servers | -| private-networks | | List Instances from the given Private Networks (use commas to separate them) | -| private-nic-mac-address | | List Instances associated with the given private NIC MAC address | -| servers | | List Instances from these server ids (use commas to separate them) | -| organization-id | | List only Instances of this Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all Instances on your default zone -``` -scw instance server list -``` - -List Instances of this commercial type -``` -scw instance server list commercial-type=DEV1-S -``` - -List Instances that are not attached to a public IP -``` -scw instance server list without-ip=true -``` - -List Instances that match the specified name ('server1' will return 'server100' and 'server1' but not 'foo') -``` -scw instance server list name=server1 -``` - - - - -### List Instance actions - -List all actions (e.g. power on, power off, reboot) that can currently be performed on an Instance. - -**Usage:** - -``` -scw instance server list-actions [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Reboot server - - - -**Usage:** - -``` -scw instance server reboot [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Reboot a server in the default zone with a given id -``` -scw instance server reboot 11111111-1111-1111-1111-111111111111 -``` - -Reboot a server in fr-par-1 zone with a given id -``` -scw instance server reboot 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### SSH into a server - -Connect to distant server via the SSH protocol. - -**Usage:** - -``` -scw instance server ssh [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server ID to SSH into | -| username | Default: `root` | Username used for the SSH connection | -| port | Default: `22` | Port used for the SSH connection | -| command | | Command to execute on the remote server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Put server in standby mode - - - -**Usage:** - -``` -scw instance server standby [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Put in standby a server in the default zone with a given id -``` -scw instance server standby 11111111-1111-1111-1111-111111111111 -``` - -Put in standby a server in fr-par-1 zone with a given id -``` -scw instance server standby 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Power on server - - - -**Usage:** - -``` -scw instance server start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Start a server in the default zone with a given id -``` -scw instance server start 11111111-1111-1111-1111-111111111111 -``` - -Start a server in fr-par-1 zone with a given id -``` -scw instance server start 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Power off server - - - -**Usage:** - -``` -scw instance server stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Stop a server in the default zone with a given id -``` -scw instance server stop 11111111-1111-1111-1111-111111111111 -``` - -Stop a server in fr-par-1 zone with a given id -``` -scw instance server stop 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Terminate server - -Terminates a server with the given ID and all of its volumes. - -**Usage:** - -``` -scw instance server terminate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | | -| with-ip | | Delete the IP attached to the server | -| with-block | Default: `prompt`
One of: `prompt`, `true`, `false` | Delete the Block Storage volumes attached to the server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Terminate a server in the default zone with a given id -``` -scw instance server terminate 11111111-1111-1111-1111-111111111111 -``` - -Terminate a server in fr-par-1 zone with a given id -``` -scw instance server terminate 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - -Terminate a server and also delete its flexible IPs -``` -scw instance server terminate 11111111-1111-1111-1111-111111111111 with-ip=true -``` - - - - -### Update an Instance - -Update the Instance information, such as name, boot mode, or tags. - -**Usage:** - -``` -scw instance server update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance | -| name | | Name of the Instance | -| ip | | IP that should be attached to the server (use ip=none to detach) | -| cloud-init | | The cloud-init script to use | -| boot-type | One of: `local`, `bootscript`, `rescue` | | -| tags.{index} | | Tags of the Instance | -| volumes.{key}.boot | Default: `false` | Force the Instance to boot on this volume | -| volumes.{key}.base-snapshot | | ID of the snapshot on which this volume will be based | -| volumes.{key}.project | | Project ID of the volume | -| volumes.{key}.organization | | Organization ID of the volume | -| ~~bootscript~~ | Deprecated | | -| dynamic-ip-required | | | -| ~~routed-ip-enabled~~ | Deprecated | True to configure the instance so it uses the new routed IP mode (once this is set to True you cannot set it back to False) | -| public-ips.{index} | | A list of reserved IP IDs to attach to the Instance | -| ~~enable-ipv6~~ | Deprecated | | -| protected | | | -| security-group-id | | | -| volume-ids.{index} | | Will update ALL volume IDs at once, including the root volume of the server (use volume-ids=none to detach all volumes) | -| placement-group-id | | Placement group ID if Instance must be part of a placement group | -| private-nics.{index} | | Instance private NICs | -| commercial-type | | Set the commercial_type for this Instance. | -| admin-password-encryption-ssh-key-id | | UUID of the SSH RSA key that will be used to encrypt the initial admin password for OS requiring it. Mandatory for Windows OS. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Update the name of a specified Instance -``` -scw instance server update 11111111-1111-1111-1111-111111111111 name=foobar -``` - -Switch a specified Instance to rescue mode (reboot is required to access rescue mode) -``` -scw instance server update 11111111-1111-1111-1111-111111111111 boot-type=rescue -``` - -Overwrite tags of a specified Instance -``` -scw instance server update 11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar -``` - -Apply the specified security group to a specified server -``` -scw instance server server update 11111111-1111-1111-1111-111111111111 security-group-id=11111111-1111-1111-1111-111111111111 -``` - -Put a specified Instance in the specified placement group. Instance must be off -``` -scw instance server server update 11111111-1111-1111-1111-111111111111 placement-group-id=11111111-1111-1111-1111-111111111111 -``` - - - - -### Wait for server to reach a stable state - -Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. - -**Usage:** - -``` -scw instance server wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| timeout | Default: `10m0s` | Timeout of the wait | -| server-id | Required | ID of the server affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Wait for a server to reach a stable state -``` -scw instance server wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Instance type management commands - -All Instance types available in a specified zone. -Each type contains all the features of the Instance (CPU, RAM, Storage) as well as their associated pricing. - - -### Get availability - -Get availability for all Instance types. - -**Usage:** - -``` -scw instance server-type get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List Instance types - -List available Instance types and their technical details. - -**Usage:** - -``` -scw instance server-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all server-types in the default zone -``` -scw instance server-type list -``` - -List all server-types in fr-par-1 zone -``` -scw instance server-type list zone=fr-par-1 -``` - - - - -## Snapshot management commands - -Snapshots contain the data of a specified volume at a particular point in time. -The data can include the Instance's operating system, -configuration information and/or files stored on the volume. - -A snapshot can be done from a specified volume, e.g. you -have one Instance with a volume containing the OS and another one -containing the application data, and you want to use different -snapshot strategies on both volumes. - -A snapshot's volume type is its original volume's type (`l_ssd` or `b_ssd`). -Volumes can be created from snapshots of their own type. - - -### Migrate a volume and/or snapshots to SBS (Scaleway Block Storage) - -To be used, the call to this endpoint must be preceded by a call to the "Plan a migration" endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. - -**Usage:** - -``` -scw instance snapshot apply-migration [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | | The snapshot to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. | -| validation-key | Required | A value to be retrieved from a call to the "Plan a migration" endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Create a snapshot from a specified volume or from a QCOW2 file - -Create a snapshot from a specified volume or from a QCOW2 file in a specified Availability Zone. - -**Usage:** - -``` -scw instance snapshot create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Name of the snapshot | -| volume-id | | UUID of the volume | -| unified | | Whether a snapshot is unified or not. | -| tags.{index} | | Tags of the snapshot | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| bucket | | Bucket name for snapshot imports | -| key | | Object key for snapshot imports | -| size | | Imported snapshot size, must be a multiple of 512 | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create a snapshot in the default zone from the specified volume ID -``` -scw instance snapshot create volume-id=11111111-1111-1111-1111-111111111111 -``` - -Create a snapshot in fr-par-1 zone from the specified volume ID -``` -scw instance snapshot create zone=fr-par-1 volume-id=11111111-1111-1111-1111-111111111111 -``` - -Create a named snapshot from the specified volume ID -``` -scw instance snapshot create name=foobar volume-id=11111111-1111-1111-1111-111111111111 -``` - -Import a QCOW file as an Instance snapshot -``` -scw instance snapshot create zone=fr-par-1 name=my-imported-snapshot volume-type=b_ssd bucket=my-bucket key=my-qcow2-file-name -``` - - - - -### Delete a snapshot - -Delete the snapshot with the specified ID. - -**Usage:** - -``` -scw instance snapshot delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete a snapshot in the default zone with the specified ID -``` -scw instance snapshot delete 11111111-1111-1111-1111-111111111111 -``` - -Delete a snapshot in fr-par-1 zone with the specified ID -``` -scw instance snapshot delete 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### Export a snapshot - -Export a snapshot to a specified S3 bucket in the same region. - -**Usage:** - -``` -scw instance snapshot export [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| bucket | | S3 bucket name | -| key | | S3 object key | -| snapshot-id | Required | Snapshot ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Export a snapshot to an S3 bucket -``` -scw instance snapshot export zone=fr-par-1 snapshot-id=11111111-1111-1111-1111-111111111111 bucket=my-bucket key=my-qcow2-file-name -``` - - - - -### Get a snapshot - -Get details of a snapshot with the specified ID. - -**Usage:** - -``` -scw instance snapshot get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a snapshot in the default zone with the specified ID -``` -scw instance snapshot get 11111111-1111-1111-1111-111111111111 -``` - -Get a snapshot in fr-par-1 zone with the specified ID -``` -scw instance snapshot get 11111111-1111-1111-1111-111111111111 zone=fr-par-1 -``` - - - - -### List snapshots - -List all snapshots of an Organization in a specified Availability Zone. - -**Usage:** - -``` -scw instance snapshot list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | List snapshots only for this Project ID | -| name | | List snapshots of the requested name | -| tags | | List snapshots that have the requested tag | -| base-volume-id | | List snapshots originating only from this volume | -| organization-id | | List snapshots only for this Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all snapshots in the default zone -``` -scw instance snapshot list -``` - -List all snapshots in fr-par-1 zone -``` -scw instance snapshot list zone=fr-par-1 -``` - - - - -### Get a volume or snapshot's migration plan - -Given a volume or snapshot, returns the migration plan for a call to the "Apply a migration plan" endpoint. This plan will include zero or one volume, and zero or more snapshots, which will need to be migrated together. This endpoint does not perform the actual migration itself, the "Apply a migration plan" endpoint must be used. The validation_key value returned by this endpoint must be provided to the call to the "Apply a migration plan" endpoint to confirm that all resources listed in the plan should be migrated. - -**Usage:** - -``` -scw instance snapshot plan-migration [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | | The snapshot for which the migration plan will be generated. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a snapshot - -Update the properties of a snapshot. - -**Usage:** - -``` -scw instance snapshot update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| name | | Name of the snapshot | -| tags.{index} | | Tags of the snapshot | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for snapshot to reach a stable state - -Wait for snapshot to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the snapshot. - -**Usage:** - -``` -scw instance snapshot wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | ID of the snapshot. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `1h0m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a snapshot to reach a stable state -``` -scw instance snapshot wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## SSH Utilities - -Command utilities around server SSH -- Manage keys per server -- Generate ssh config - - -### Add a public key to a server - -Key will be added to server's tags and added to root user on next restart. -Key is expected in openssh format "(format) (key) (comment)". -The comment will be used as key name or generated -Lookup /root/.ssh/authorized_keys on your server for more information - -**Usage:** - -``` -scw instance ssh add-key [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | | Server to add your key to | -| public-key | | Public key you want to add to your server | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Install a ssh config with all your servers as host -It generate hosts for instance servers, baremetal, apple-silicon and bastions - -Path of the config will be $HOME/.ssh/scaleway.config - -**Usage:** - -``` -scw instance ssh install-config [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### List manually added public keys - -List only keys added manually to a server using tags. -The key comment is used as key name or generated -Lookup /root/.ssh/authorized_keys on your server for more information - -**Usage:** - -``` -scw instance ssh list-keys [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server to add your key to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Remove a manually added public key from a server - -Key will be remove from server's tags and removed from root user on next restart. -Keys are identified by their comment as in openssh format. -Lookup /root/.ssh/authorized_keys on your server for more information - -**Usage:** - -``` -scw instance ssh remove-key [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | Server to add your key to | -| name | | Name of the key you want to remove, has to be the key comment or the index | -| public-key | | Public key you want to remove | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## User data management commands - -User data is a key/value store you can use to provide your instance with introspective data. - -As an example of use, Scaleway images contain the `scw-generate-ssh-keys` script, which generates the SSH server’s host keys, then stores their fingerprints as user data under the `ssh-host-fingerprints` key. -This way, before connecting to the instance using SSH, one can query the fingerprints to ensure that the remote host is the expected one, thus avoiding any man-in-the-middle attack. - -There are two ways of accessing user data: - - **From within a running Instance**, by requesting the Metadata API at http://169.254.42.42/user_data (or http://[fd00:42::42]/user_data using IPv6). - The `scaleway-ecosystem` package, installed by default on all OS images provided by Scaleway, ships with the `scw-userdata` helper command that allows you to easily query the user data from the instance. - For security reasons, viewing and editing user data is only allowed to queries originating from a port below 1024 (by default, only the super-user can bind to ports below 1024). - To specify the source port with cURL, use the `--local-port` option (e.g. `curl --local-port 1-1023 http://169.254.42.42/user_data`). - - **From the Instance API** by using the methods described below. - - -### Delete user data - -Delete the specified key from an Instance's user data. - -**Usage:** - -``` -scw instance user-data delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance | -| key | Required | Key of the user data to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get user data - -Get the content of a user data with the specified key on an Instance. - -**Usage:** - -``` -scw instance user-data get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance | -| key | Required | Key of the user data to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List user data - -List all user data keys registered on a specified Instance. - -**Usage:** - -``` -scw instance user-data list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Add/set user data - -Add or update a user data with the specified key on an Instance. - -**Usage:** - -``` -scw instance user-data set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| server-id | Required | UUID of the Instance | -| key | Required | Key of the user data to set | -| content | Required | Content of the user data | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Volume management commands - -A volume is where you store your data inside your Instance. It -appears as a block device on Linux that you can use to create -a filesystem and mount it. - -Two different types of volume (`volume_type`) are available: - - `l_ssd` is a local block storage: your data is downloaded on - the hypervisor and you need to power off your Instance to attach - or detach a volume. - - `b_ssd` is a remote block storage: your data is stored on a - centralized cluster. You can plug and unplug a volume while - your Instance is running. - -Minimum and maximum volume sizes for each volume types can be queried -from the zone `/products/volumes` API endpoint. _I.e_ for: - - `fr-par-1` use https://api.scaleway.com/instance/v1/zones/fr-par-1/products/volumes - - `nl-ams-1` use https://api.scaleway.com/instance/v1/zones/nl-ams-1/products/volumes - -Each type of volume is also subject to a global quota for the sum of all the -volumes. This quota depends of the level of support and may be -changed on demand. - -Be wary that when terminating an Instance, if you want to keep -your block storage volume, **you must** detach it before you -issue the `terminate` call. - -When using multiple block devices, it's advised to mount them by -using their UUID instead of their device name. A device name is -subject to change depending on the volumes order. Block devices -UUIDs can be found in `/dev/disk/by-id/`. - - -### Migrate a volume and/or snapshots to SBS (Scaleway Block Storage) - -To be used, the call to this endpoint must be preceded by a call to the "Plan a migration" endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. - -**Usage:** - -``` -scw instance volume apply-migration [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | The volume to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. | -| validation-key | Required | A value to be retrieved from a call to the "Plan a migration" endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Create a volume - -Create a volume of a specified type in an Availability Zone. - -**Usage:** - -``` -scw instance volume create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Volume name | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Volume tags | -| volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Volume type | -| size | | Volume disk size, must be a multiple of 512 | -| base-snapshot | | ID of the snapshot on which this volume will be based | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Create a volume called 'my-volume' -``` -scw instance volume create name=my-volume -``` - -Create a volume with a size of 50GB -``` -scw instance volume create size=50GB -``` - - - - -### Delete a volume - -Delete the volume with the specified ID. - -**Usage:** - -``` -scw instance volume delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Delete a volume with the specified ID -``` -scw instance volume delete af136619-bc59-4b48-a0ed-ed7dceaad9a6 -``` - - - - -### Get a volume - -Get details of a volume with the specified ID. - -**Usage:** - -``` -scw instance volume get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Get a volume with the specified ID -``` -scw instance volume get b70e9a0e-28b1-4542-bb9b-06d2d6debc0f -``` - - - - -### List volumes - -List volumes in the specified Availability Zone. You can filter the output by volume type. - -**Usage:** - -``` -scw instance volume list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-type | One of: `l_ssd`, `b_ssd`, `unified`, `scratch`, `sbs_volume`, `sbs_snapshot` | Filter by volume type | -| project-id | | Filter volume by Project ID | -| tags | | Filter volumes with these exact tags (to filter with several tags, use commas to separate them) | -| name | | Filter volume by name (for eg. "vol" will return "myvolume" but not "data") | -| organization-id | | Filter volume by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all volumes -``` -scw instance volume list -``` - -List all block storage volumes -``` -scw instance volume list volume-type=b_ssd -``` - -List all local storage volumes -``` -scw instance volume list volume-type=l_ssd -``` - -List all volumes that match a name -``` -scw instance volume list name=foobar -``` - -List all block storage volumes that match a name -``` -scw instance volume list volume-type=b_ssd name=foobar -``` - - - - -### Get a volume or snapshot's migration plan - -Given a volume or snapshot, returns the migration plan for a call to the "Apply a migration plan" endpoint. This plan will include zero or one volume, and zero or more snapshots, which will need to be migrated together. This endpoint does not perform the actual migration itself, the "Apply a migration plan" endpoint must be used. The validation_key value returned by this endpoint must be provided to the call to the "Apply a migration plan" endpoint to confirm that all resources listed in the plan should be migrated. - -**Usage:** - -``` -scw instance volume plan-migration [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | The volume for which the migration plan will be generated. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a volume - -Replace the name and/or size properties of a volume specified by its ID, with the specified value(s). Any volume name can be changed, however only `b_ssd` volumes can currently be increased in size. - -**Usage:** - -``` -scw instance volume update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | UUID of the volume | -| name | | Volume name | -| tags.{index} | | Tags of the volume | -| size | | Volume disk size, must be a multiple of 512 | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Change the volume name -``` -scw instance volume update 11111111-1111-1111-1111-111111111111 name=my-new-name -``` - -Change the volume disk size (bytes) -``` -scw instance volume update 11111111-1111-1111-1111-111111111111 size=60GB -``` - -Change the volume name and disk size -``` -scw instance volume update 11111111-1111-1111-1111-111111111111 name=a-new-name size=70GB -``` - - - - -### Wait for volume to reach a stable state - -Wait for volume to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the volume. - -**Usage:** - -``` -scw instance volume wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| timeout | Default: `10m0s` | Timeout of the wait | -| volume-id | Required | ID of the volume affected by the action. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -Wait for a volume to reach a stable state -``` -scw instance volume wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Volume type management commands - -All volume types available in a specified zone. -Each of these types will contains all the capabilities and constraints of the volume (min size, max size, snapshot). - - -### List volume types - -List all volume types and their technical details. - -**Usage:** - -``` -scw instance volume-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `fr-par-3`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - -**Examples:** - - -List all volume-types in the default zone -``` -scw instance volume-type list -``` - -List all volume-types in fr-par-1 zone -``` -scw instance volume-type list zone=fr-par-1 -``` - - - - diff --git a/docs/docs/iot.md b/docs/docs/iot.md deleted file mode 100644 index 25d12b5873..0000000000 --- a/docs/docs/iot.md +++ /dev/null @@ -1,727 +0,0 @@ - -# Documentation for `scw iot` -This API allows you to manage your IoT hubs and devices. - -- [IoT Device commands](#iot-device-commands) - - [Add a device](#add-a-device) - - [Remove a device](#remove-a-device) - - [Disable a device](#disable-a-device) - - [Enable a device](#enable-a-device) - - [Get a device](#get-a-device) - - [Get a device's certificate](#get-a-device's-certificate) - - [Get a device's metrics](#get-a-device's-metrics) - - [List devices](#list-devices) - - [Renew a device certificate](#renew-a-device-certificate) - - [Set a custom certificate on a device](#set-a-custom-certificate-on-a-device) - - [Update a device](#update-a-device) -- [IoT Hub commands](#iot-hub-commands) - - [Create a hub](#create-a-hub) - - [Delete a hub](#delete-a-hub) - - [Disable a hub](#disable-a-hub) - - [Enable a hub](#enable-a-hub) - - [Get a hub](#get-a-hub) - - [Get the certificate authority of a hub](#get-the-certificate-authority-of-a-hub) - - [List hubs](#list-hubs) - - [Set the certificate authority of a hub](#set-the-certificate-authority-of-a-hub) - - [Update a hub](#update-a-hub) -- [IoT Network commands](#iot-network-commands) - - [Create a new network](#create-a-new-network) - - [Delete a Network](#delete-a-network) - - [Retrieve a specific network](#retrieve-a-specific-network) - - [List the networks](#list-the-networks) -- [IoT Route commands](#iot-route-commands) - - [Create a route](#create-a-route) - - [Delete a route](#delete-a-route) - - [Get a route](#get-a-route) - - [List routes](#list-routes) - - [Update a route](#update-a-route) - - -## IoT Device commands - -IoT Device commands. - - -### Add a device - -Attach a device to a given Hub. - -**Usage:** - -``` -scw iot device create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Device name | -| hub-id | Required | Hub ID of the device | -| allow-insecure | | Defines whether to allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones | -| allow-multiple-connections | | Defines whether to allow multiple physical devices to connect with this device's credentials | -| message-filters.publish.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | -| message-filters.publish.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | -| message-filters.subscribe.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | -| message-filters.subscribe.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | -| description | | Device description | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Remove a device - -Remove a specific device from the specific Hub it is attached to. - -**Usage:** - -``` -scw iot device delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Disable a device - -Disable an existing device, specified by its device ID. - -**Usage:** - -``` -scw iot device disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Enable a device - -Enable a specific device, specified by its device ID. - -**Usage:** - -``` -scw iot device enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a device - -Retrieve information about an existing device, specified by its device ID. Its full details, including name, status and ID, are returned in the response object. - -**Usage:** - -``` -scw iot device get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a device's certificate - -Get information for a particular PEM-encoded certificate, specified by the device ID. The response returns full details of the device, including its type of certificate. - -**Usage:** - -``` -scw iot device get-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a device's metrics - -Get the metrics of an existing device, specified by its device ID. - -**Usage:** - -``` -scw iot device get-metrics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| start-date | Required | Start date used to compute the best scale for the returned metrics | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List devices - -List all devices in the specified region. By default, returned devices are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw iot device list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc`, `status_asc`, `status_desc`, `hub_id_asc`, `hub_id_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `allow_insecure_asc`, `allow_insecure_desc` | Ordering of requested devices | -| name | | Name to filter for, only devices with this name will be returned | -| hub-id | | Hub ID to filter for, only devices attached to this Hub will be returned | -| allow-insecure | | Defines wheter to filter the allow_insecure flag | -| status | One of: `unknown`, `error`, `enabled`, `disabled` | Device status (enabled, disabled, etc.) | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Renew a device certificate - -Renew the certificate of an existing device, specified by its device ID. - -**Usage:** - -``` -scw iot device renew-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Set a custom certificate on a device - -Switch the existing certificate of a given device with an EM-encoded custom certificate. - -**Usage:** - -``` -scw iot device set-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| certificate-pem | Required | PEM-encoded custom certificate | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update a device - -Update the parameters of an existing device, specified by its device ID. - -**Usage:** - -``` -scw iot device update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| device-id | Required | Device ID | -| description | | Description for the device | -| allow-insecure | | Defines whether to allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones | -| allow-multiple-connections | | Defines whether to allow multiple physical devices to connect with this device's credentials | -| message-filters.publish.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | -| message-filters.publish.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | -| message-filters.subscribe.policy | One of: `unknown`, `accept`, `reject` | How to use the topic list | -| message-filters.subscribe.topics.{index} | | List of topics to accept or reject. It must be valid MQTT topics and up to 65535 characters | -| hub-id | | Change Hub for this device, additional fees may apply, see IoT Hub pricing | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## IoT Hub commands - -IoT Hub commands. - - -### Create a hub - -Create a new Hub in the targeted region, specifying its configuration including name and product plan. - -**Usage:** - -``` -scw iot hub create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Hub name (up to 255 characters) | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| product-plan | Required
Default: `plan_shared`
One of: `plan_unknown`, `plan_shared`, `plan_dedicated`, `plan_ha` | Hub product plan | -| disable-events | | Disable Hub events | -| events-topic-prefix | | Topic prefix (default '$SCW/events') of Hub events | -| twins-graphite-config.push-uri | | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a hub - -Delete an existing IoT Hub, specified by its Hub ID. Deleting a Hub is permanent, and cannot be undone. - -**Usage:** - -``` -scw iot hub delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | Hub ID | -| delete-devices | | Defines whether to force the deletion of devices added to this Hub or reject the operation | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Disable a hub - -Disable an existing IoT Hub, specified by its Hub ID. - -**Usage:** - -``` -scw iot hub disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | Hub ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Enable a hub - -Enable an existing IoT Hub, specified by its Hub ID. - -**Usage:** - -``` -scw iot hub enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | Hub ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a hub - -Retrieve information about an existing IoT Hub, specified by its Hub ID. Its full details, including name, status and endpoint, are returned in the response object. - -**Usage:** - -``` -scw iot hub get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | Hub ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get the certificate authority of a hub - -Get information for a particular PEM-encoded certificate, specified by the Hub ID. - -**Usage:** - -``` -scw iot hub get-ca [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List hubs - -List all Hubs in the specified zone. By default, returned Hubs are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw iot hub list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc`, `status_asc`, `status_desc`, `product_plan_asc`, `product_plan_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Sort order of Hubs in the response | -| project-id | | Only list Hubs of this Project ID | -| name | | Hub name | -| organization-id | | Only list Hubs of this Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set the certificate authority of a hub - -Set a particular PEM-encoded certificate, specified by the Hub ID. - -**Usage:** - -``` -scw iot hub set-ca [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | Hub ID | -| ca-cert-pem | Required | CA's PEM-encoded certificate | -| challenge-cert-pem | Required | Proof of possession of PEM-encoded certificate | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update a hub - -Update the parameters of an existing IoT Hub, specified by its Hub ID. - -**Usage:** - -``` -scw iot hub update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hub-id | Required | ID of the Hub you want to update | -| name | | Hub name (up to 255 characters) | -| product-plan | One of: `plan_unknown`, `plan_shared`, `plan_dedicated`, `plan_ha` | Hub product plan | -| disable-events | | Disable Hub events | -| events-topic-prefix | | Topic prefix of Hub events | -| enable-device-auto-provisioning | | Enable device auto provisioning | -| twins-graphite-config.push-uri | | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## IoT Network commands - -IoT Network commands. - - -### Create a new network - -Create a new network for an existing hub. Beside the default network, you can add networks for different data providers. Possible network types are Sigfox and REST. - -**Usage:** - -``` -scw iot network create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Network name | -| type | Required
One of: `unknown`, `sigfox`, `rest` | Type of network to connect with | -| hub-id | Required | Hub ID to connect the Network to | -| topic-prefix | Required | Topic prefix for the Network | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Network - -Delete an existing network, specified by its network ID. Deleting a network is permanent, and cannot be undone. - -**Usage:** - -``` -scw iot network delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| network-id | Required | Network ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Retrieve a specific network - -Retrieve an existing network, specified by its network ID. The response returns full details of the network, including its type, the topic prefix and its endpoint. - -**Usage:** - -``` -scw iot network get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| network-id | Required | Network ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List the networks - -List the networks. - -**Usage:** - -``` -scw iot network list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc`, `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering of requested routes | -| name | | Network name to filter for | -| hub-id | | Hub ID to filter for | -| topic-prefix | | Topic prefix to filter for | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -## IoT Route commands - -IoT Route commands. - - -### Create a route - -Multiple kinds of routes can be created, such as: -- Database Route - Create a route that will record subscribed MQTT messages into your database. - You need to manage the database by yourself. -- REST Route. - Create a route that will call a REST API on received subscribed MQTT messages. -- S3 Routes. - Create a route that will put subscribed MQTT messages into an S3 bucket. - You need to create the bucket yourself and grant write access. - Granting can be done with s3cmd (`s3cmd setacl s3:// --acl-grant=write:555c69c3-87d0-4bf8-80f1-99a2f757d031:555c69c3-87d0-4bf8-80f1-99a2f757d031`). - -**Usage:** - -``` -scw iot route create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | Route name | -| hub-id | | Hub ID of the route | -| topic | | Topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters | -| s3-config.bucket-region | | | -| s3-config.bucket-name | | | -| s3-config.object-prefix | | | -| s3-config.strategy | One of: `unknown`, `per_topic`, `per_message` | | -| db-config.host | | | -| db-config.port | | | -| db-config.dbname | | | -| db-config.username | | | -| db-config.password | | | -| db-config.query | | | -| db-config.engine | One of: `unknown`, `postgresql`, `mysql` | | -| rest-config.verb | One of: `unknown`, `get`, `post`, `put`, `patch`, `delete` | | -| rest-config.uri | | | -| rest-config.headers.{key} | | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a route - -Delete an existing route, specified by its route ID. Deleting a route is permanent, and cannot be undone. - -**Usage:** - -``` -scw iot route delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a route - -Get information for a particular route, specified by the route ID. The response returns full details of the route, including its type, the topic it subscribes to and its configuration. - -**Usage:** - -``` -scw iot route get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List routes - -List all routes in the specified region. By default, returned routes are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw iot route list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc`, `hub_id_asc`, `hub_id_desc`, `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering of requested routes | -| hub-id | | Hub ID to filter for | -| name | | Route name to filter for | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a route - -Update the parameters of an existing route, specified by its route ID. - -**Usage:** - -``` -scw iot route update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route id | -| name | | Route name | -| topic | | Topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters | -| s3-config.bucket-region | | | -| s3-config.bucket-name | | | -| s3-config.object-prefix | | | -| s3-config.strategy | One of: `unknown`, `per_topic`, `per_message` | | -| db-config.host | | | -| db-config.port | | | -| db-config.dbname | | | -| db-config.username | | | -| db-config.password | | | -| db-config.query | | | -| db-config.engine | One of: `unknown`, `postgresql`, `mysql` | | -| rest-config.verb | One of: `unknown`, `get`, `post`, `put`, `patch`, `delete` | | -| rest-config.uri | | | -| rest-config.headers.{key} | | | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/ipam.md b/docs/docs/ipam.md deleted file mode 100644 index 084700fa8b..0000000000 --- a/docs/docs/ipam.md +++ /dev/null @@ -1,169 +0,0 @@ - -# Documentation for `scw ipam` -This API allows you to manage your Scaleway IP addresses with our IP Address Management tool. - -- [IP management command](#ip-management-command) - - [Reserve a new IP](#reserve-a-new-ip) - - [Release an IP](#release-an-ip) - - [Get an IP](#get-an-ip) - - [List existing IPs](#list-existing-ips) - - [Update an IP](#update-an-ip) -- [Management command for sets of IPs](#management-command-for-sets-of-ips) - - [Release ipam resources](#release-ipam-resources) - - -## IP management command - -*ips_long. - - -### Reserve a new IP - -Reserve a new IP from the specified source. Currently IPs can only be reserved from a Private Network. - -**Usage:** - -``` -scw ipam ip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| source.zonal | | Zone the IP lives in if the IP is a public zoned IP. | -| source.private-network-id | | Private Network the IP lives in if the IP is a private IP. | -| source.subnet-id | | Private Network subnet the IP lives in if the IP is a private IP in a Private Network. | -| is-ipv6 | | Request an IPv6 instead of an IPv4 | -| address | | Request this specific IP address in the specified source pool | -| tags.{index} | | Tags for the IP | -| resource.mac-address | | MAC address of the custom resource | -| resource.name | | Name of the custom resource | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Release an IP - -Release an IP not currently attached to a resource, and returns it to the available IP pool. - -**Usage:** - -``` -scw ipam ip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get an IP - -Retrieve details of an existing IP, specified by its IP ID. - -**Usage:** - -``` -scw ipam ip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List existing IPs - -List existing IPs in the specified region using various filters. For example, you can filter for IPs within a specified Private Network, or for public IPs within a specified Project. By default, the IPs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw ipam ip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_desc`, `created_at_asc`, `updated_at_desc`, `updated_at_asc`, `attached_at_desc`, `attached_at_asc` | Sort order of the returned IPs | -| project-id | | Project ID to filter for. Only IPs belonging to this Project will be returned | -| zonal | | Zone to filter for. Only IPs that are zonal, and in this zone, will be returned | -| private-network-id | | Private Network to filter for. | -| subnet-id | | Subnet ID to filter for. | -| vpc-id | | VPC ID to filter for. | -| attached | | Defines whether to filter only for IPs which are attached to a resource | -| resource-id | | Resource ID to filter for. Only IPs attached to this resource will be returned | -| resource-type | One of: `unknown_type`, `custom`, `instance_server`, `instance_ip`, `instance_private_nic`, `lb_server`, `fip_ip`, `vpc_gateway`, `vpc_gateway_network`, `k8s_node`, `k8s_cluster`, `rdb_instance`, `redis_cluster`, `baremetal_server`, `baremetal_private_nic`, `llm_deployment` | Resource type to filter for. Only IPs attached to this type of resource will be returned | -| mac-address | | MAC address to filter for. Only IPs attached to a resource with this MAC address will be returned | -| tags.{index} | | Tags to filter for, only IPs with one or more matching tags will be returned | -| is-ipv6 | | Defines whether to filter only for IPv4s or IPv6s | -| resource-name | | Attached resource name to filter for, only IPs attached to a resource with this string within their name will be returned. | -| resource-types.{index} | One of: `unknown_type`, `custom`, `instance_server`, `instance_ip`, `instance_private_nic`, `lb_server`, `fip_ip`, `vpc_gateway`, `vpc_gateway_network`, `k8s_node`, `k8s_cluster`, `rdb_instance`, `redis_cluster`, `baremetal_server`, `baremetal_private_nic`, `llm_deployment` | Resource types to filter for. Only IPs attached to these types of resources will be returned | -| organization-id | | Organization ID to filter for. Only IPs belonging to this Organization will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an IP - -Update parameters including tags of the specified IP. - -**Usage:** - -``` -scw ipam ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP ID | -| tags.{index} | | Tags for the IP | -| reverses.{index}.hostname | | Reverse domain name | -| reverses.{index}.address | | IP corresponding to the hostname | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Management command for sets of IPs - -*ips_long. - - -### Release ipam resources - -Release ipam resources. - -**Usage:** - -``` -scw ipam ip-set release [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-ids.{index} | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/ipfs.md b/docs/docs/ipfs.md deleted file mode 100644 index 9abe39d43a..0000000000 --- a/docs/docs/ipfs.md +++ /dev/null @@ -1,284 +0,0 @@ - -# Documentation for `scw ipfs` -IPFS Pinning service API. - -- [A pin is an abstract object that holds a Content Identifier (CID). It is defined that during the lifespan of a pin, the CID (and all sub-CIDs) must be hosted by the service](#a-pin-is-an-abstract-object-that-holds-a-content-identifier-(cid).-it-is-defined-that-during-the-lifespan-of-a-pin,-the-cid-(and-all-sub-cids)-must-be-hosted-by-the-service) - - [Create a pin by CID](#create-a-pin-by-cid) - - [Create a pin by URL](#create-a-pin-by-url) - - [Create an unpin request](#create-an-unpin-request) - - [Get pin information](#get-pin-information) - - [List all pins within a volume](#list-all-pins-within-a-volume) - - [Replace pin by CID](#replace-pin-by-cid) -- [A volume is bucket of pins. It is similar to an Object Storage bucket. Volumes are useful to gather pins with similar lifespans](#a-volume-is-bucket-of-pins.-it-is-similar-to-an-object-storage-bucket.-volumes-are-useful-to-gather-pins-with-similar-lifespans) - - [Create a new volume](#create-a-new-volume) - - [Delete an existing volume](#delete-an-existing-volume) - - [Get information about a volume](#get-information-about-a-volume) - - [List all volumes by a Project ID](#list-all-volumes-by-a-project-id) - - [Update volume information](#update-volume-information) - - -## A pin is an abstract object that holds a Content Identifier (CID). It is defined that during the lifespan of a pin, the CID (and all sub-CIDs) must be hosted by the service - -It is possible that many pins target the same CID, regardless of the user. - - -### Create a pin by CID - -Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. -The content (IPFS blocks) will be host by the pinning service until pin deletion. -From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. -Many pin requests (from different users) can target the same CID. -A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. - -**Usage:** - -``` -scw ipfs pin create-by-cid [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | Volume ID on which you want to pin your content | -| cid | Required | CID containing the content you want to pin | -| origins.{index} | | Node containing the content you want to pin | -| name | | Pin name | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create a pin by URL - -Will fetch and store the content pointed by the provided URL. The content must be available on the public IPFS network. -The content (IPFS blocks) will be host by the pinning service until pin deletion. -From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. -Many pin requests (from different users) can target the same CID. -A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. - -**Usage:** - -``` -scw ipfs pin create-by-url [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | Volume ID on which you want to pin your content | -| url | Required | URL containing the content you want to pin | -| name | | Pin name | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create an unpin request - -An unpin request means that you no longer own the content. -This content can therefore be removed and no longer provided on the IPFS network. - -**Usage:** - -``` -scw ipfs pin delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | Volume ID | -| pin-id | Required | Pin ID you want to remove from the volume | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get pin information - -Retrieve information about the provided **pin ID**, such as status, last modification, and CID. - -**Usage:** - -``` -scw ipfs pin get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | Volume ID | -| pin-id | Required | Pin ID of which you want to obtain information | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all pins within a volume - -Retrieve information about all pins within a volume. - -**Usage:** - -``` -scw ipfs pin list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | Volume ID of which you want to list the pins | -| project-id | | Project ID | -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned Volume | -| status | One of: `unknown_status`, `queued`, `pinning`, `failed`, `pinned` | List pins by status | -| organization-id | | Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Replace pin by CID - -Deletes the given resource ID and pins the new CID in its place. -Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. -The content (IPFS blocks) is hosted by the pinning service until the pin is deleted. -While the content is available any other IPFS peer can fetch and host your content. For this reason, we recommend that you pin either public or encrypted content. -Several different pin requests can target the same CID. -A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. - -**Usage:** - -``` -scw ipfs pin replace [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | | Volume ID | -| pin-id | Required | Pin ID whose information you wish to replace | -| cid | | New CID you want to pin in place of the old one | -| name | | New name to replace | -| origins.{index} | | Node containing the content you want to pin | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## A volume is bucket of pins. It is similar to an Object Storage bucket. Volumes are useful to gather pins with similar lifespans - -All pins must be attached to a volume. And all volumes must be attached to a Project ID. - - -### Create a new volume - -Create a new volume from a Project ID. Volume is identified by an ID and used to host pin references. -Volume is personal (at least to your organization) even if IPFS blocks and CID are available to anyone. -Should be the first command you made because every pin must be attached to a volume. - -**Usage:** - -``` -scw ipfs volume create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Required | Volume name | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing volume - -Delete a volume by its ID and every pin attached to this volume. This process can take a while to conclude, depending on the size of your pinned content. - -**Usage:** - -``` -scw ipfs volume delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | Volume ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get information about a volume - -Retrieve information about a specific volume. - -**Usage:** - -``` -scw ipfs volume get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| volume-id | Required | Volume ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all volumes by a Project ID - -Retrieve information about all volumes from a Project ID. - -**Usage:** - -``` -scw ipfs volume list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort the order of the returned volumes | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update volume information - -Update volume information (tag, name...). - -**Usage:** - -``` -scw ipfs volume update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Volume name | -| volume-id | Required | Volume ID | -| tags.{index} | | Tags of the volume | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/ipns.md b/docs/docs/ipns.md deleted file mode 100644 index 6d22a59830..0000000000 --- a/docs/docs/ipns.md +++ /dev/null @@ -1,169 +0,0 @@ - -# Documentation for `scw ipns` -IPFS Naming service API - -- [A name is a hash of the public key within the IPNS (InterPlanetary Name System)](#a-name-is-a-hash-of-the-public-key-within-the-ipns-(interplanetary-name-system)) - - [Create a new name](#create-a-new-name) - - [Delete an existing name](#delete-an-existing-name) - - [Export your private key](#export-your-private-key) - - [Get information about a name](#get-information-about-a-name) - - [Import your private key](#import-your-private-key) - - [List all names by a Project ID](#list-all-names-by-a-project-id) - - [Update name information](#update-name-information) - - -## A name is a hash of the public key within the IPNS (InterPlanetary Name System) - -This is the PKI namespace, where the private key is used to publish (sign) a record. - - -### Create a new name - -You can use the `ipns key` command to list and generate more names and their respective keys. - -**Usage:** - -``` -scw ipns name create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name for your records | -| value | | Value you want to associate with your records, CID or IPNS key | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an existing name - -Delete a name by its ID. - -**Usage:** - -``` -scw ipns name delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name-id | Required | Name ID you wish to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Export your private key - -Export a private key by its ID. - -**Usage:** - -``` -scw ipns name export-key [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name-id | Required | Name ID whose keys you want to export | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get information about a name - -Retrieve information about a specific name. - -**Usage:** - -``` -scw ipns name get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name-id | Required | Name ID whose information you want to retrieve | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Import your private key - -Import a private key. - -**Usage:** - -``` -scw ipns name import-key [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name for your records | -| private-key | Required | Base64 private key | -| value | | Value you want to associate with your records, CID or IPNS key | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all names by a Project ID - -Retrieve information about all names from a Project ID. - -**Usage:** - -``` -scw ipns name list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID | -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort the order of the returned names | -| organization-id | | Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update name information - -Update name information (CID, tag, name...). - -**Usage:** - -``` -scw ipns name update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name-id | Required | Name ID you wish to update | -| name | | New name you want to associate with your record | -| tags.{index} | | New tags you want to associate with your record | -| value | | Value you want to associate with your records, CID or IPNS key | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/jobs.md b/docs/docs/jobs.md deleted file mode 100644 index f189863b9a..0000000000 --- a/docs/docs/jobs.md +++ /dev/null @@ -1,258 +0,0 @@ - -# Documentation for `scw jobs` -This API allows you to manage your Serverless Jobs. - -- [](#) - - [Create a new job definition in a specified Project](#create-a-new-job-definition-in-a-specified-project) - - [Delete an exsisting job definition by its unique identifier](#delete-an-exsisting-job-definition-by-its-unique-identifier) - - [Get a job definition by its unique identifier](#get-a-job-definition-by-its-unique-identifier) - - [List all your job definitions with filters](#list-all-your-job-definitions-with-filters) - - [Run an existing job definition by its unique identifier. This will create a new job run](#run-an-existing-job-definition-by-its-unique-identifier.-this-will-create-a-new-job-run) - - [Update an existing job definition associated with the specified unique identifier](#update-an-existing-job-definition-associated-with-the-specified-unique-identifier) -- [](#) - - [Get a job run by its unique identifier](#get-a-job-run-by-its-unique-identifier) - - [List all job runs with filters](#list-all-job-runs-with-filters) - - [Stop a job run by its unique identifier](#stop-a-job-run-by-its-unique-identifier) - - [Wait for a job run to reach a stable state](#wait-for-a-job-run-to-reach-a-stable-state) - - -## - - - - -### Create a new job definition in a specified Project - -Create a new job definition in a specified Project. - -**Usage:** - -``` -scw jobs definition create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the job definition | -| cpu-limit | Required | CPU limit of the job | -| memory-limit | Required | Memory limit of the job (in MiB) | -| local-storage-capacity | | Local storage capacity of the job (in MiB) | -| image-uri | Required | Image to use for the job | -| command | | Startup command. If empty or not defined, the image's default command is used. | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| environment-variables.{key} | | Environment variables of the job | -| description | | Description of the job | -| job-timeout | | Timeout of the job in seconds | -| cron-schedule.schedule | | | -| cron-schedule.timezone | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete an exsisting job definition by its unique identifier - -Delete an exsisting job definition by its unique identifier. - -**Usage:** - -``` -scw jobs definition delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-definition-id | Required | UUID of the job definition to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a job definition by its unique identifier - -Get a job definition by its unique identifier. - -**Usage:** - -``` -scw jobs definition get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-definition-id | Required | UUID of the job definition to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all your job definitions with filters - -List all your job definitions with filters. - -**Usage:** - -``` -scw jobs definition list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | | -| project-id | | | -| organization-id | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Run an existing job definition by its unique identifier. This will create a new job run - -Run an existing job definition by its unique identifier. This will create a new job run. - -**Usage:** - -``` -scw jobs definition start [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-definition-id | Required | UUID of the job definition to start | -| command | | Contextual startup command for this specific job run | -| environment-variables.{key} | | Contextual environment variables for this specific job run | -| replicas | | Number of jobs to run | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update an existing job definition associated with the specified unique identifier - -Update an existing job definition associated with the specified unique identifier. - -**Usage:** - -``` -scw jobs definition update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-definition-id | Required | UUID of the job definition to update | -| name | | Name of the job definition | -| cpu-limit | | CPU limit of the job | -| memory-limit | | Memory limit of the job (in MiB) | -| local-storage-capacity | | Local storage capacity of the job (in MiB) | -| image-uri | | Image to use for the job | -| command | | Startup command | -| environment-variables.{key} | | Environment variables of the job | -| description | | Description of the job | -| job-timeout | | Timeout of the job in seconds | -| cron-schedule.schedule | | | -| cron-schedule.timezone | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## - - - - -### Get a job run by its unique identifier - -Get a job run by its unique identifier. - -**Usage:** - -``` -scw jobs run get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-run-id | Required | UUID of the job run to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List all job runs with filters - -List all job runs with filters. - -**Usage:** - -``` -scw jobs run list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | | -| job-definition-id | | | -| project-id | | | -| organization-id | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Stop a job run by its unique identifier - -Stop a job run by its unique identifier. - -**Usage:** - -``` -scw jobs run stop [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-run-id | Required | UUID of the job run to stop | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Wait for a job run to reach a stable state - -Wait for a job run to reach a stable state. This is similar to using --wait flag. - -**Usage:** - -``` -scw jobs run wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| job-run-id | Required | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/k8s.md b/docs/docs/k8s.md deleted file mode 100644 index 2efe66c4ae..0000000000 --- a/docs/docs/k8s.md +++ /dev/null @@ -1,1248 +0,0 @@ - -# Documentation for `scw k8s` -This API allows you to manage Kubernetes Kapsule and Kosmos clusters. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) -- [Kapsule cluster management commands](#kapsule-cluster-management-commands) - - [Create a new Cluster](#create-a-new-cluster) - - [Delete a Cluster](#delete-a-cluster) - - [Get a Cluster](#get-a-cluster) - - [List Clusters](#list-clusters) - - [List available cluster types for a cluster](#list-available-cluster-types-for-a-cluster) - - [List available versions for a Cluster](#list-available-versions-for-a-cluster) - - [Migrate a cluster to Routed IPs](#migrate-a-cluster-to-routed-ips) - - [Migrate a cluster to SBS CSI](#migrate-a-cluster-to-sbs-csi) - - [Reset the admin token of a Cluster](#reset-the-admin-token-of-a-cluster) - - [Change the Cluster type](#change-the-cluster-type) - - [Update a Cluster](#update-a-cluster) - - [Upgrade a Cluster](#upgrade-a-cluster) - - [Wait for a cluster to reach a stable state](#wait-for-a-cluster-to-reach-a-stable-state) -- [Cluster type management commands](#cluster-type-management-commands) - - [List cluster types](#list-cluster-types) -- [Manage your Kubernetes Kapsule cluster's kubeconfig files](#manage-your-kubernetes-kapsule-cluster's-kubeconfig-files) - - [Retrieve a kubeconfig](#retrieve-a-kubeconfig) - - [Install a kubeconfig](#install-a-kubeconfig) - - [Uninstall a kubeconfig](#uninstall-a-kubeconfig) -- [Kapsule node management commands](#kapsule-node-management-commands) - - [Delete a Node in a Cluster](#delete-a-node-in-a-cluster) - - [Get a Node in a Cluster](#get-a-node-in-a-cluster) - - [List Nodes in a Cluster](#list-nodes-in-a-cluster) - - [Reboot a Node in a Cluster](#reboot-a-node-in-a-cluster) - - [Replace a Node in a Cluster](#replace-a-node-in-a-cluster) - - [Wait for a node to reach a stable state](#wait-for-a-node-to-reach-a-stable-state) -- [Kapsule pool management commands](#kapsule-pool-management-commands) - - [Create a new Pool in a Cluster](#create-a-new-pool-in-a-cluster) - - [Delete a Pool in a Cluster](#delete-a-pool-in-a-cluster) - - [Get a Pool in a Cluster](#get-a-pool-in-a-cluster) - - [List Pools in a Cluster](#list-pools-in-a-cluster) - - [Update a Pool in a Cluster](#update-a-pool-in-a-cluster) - - [Upgrade a Pool in a Cluster](#upgrade-a-pool-in-a-cluster) - - [Wait for a pool to reach a stable state](#wait-for-a-pool-to-reach-a-stable-state) -- [Available Kubernetes versions commands](#available-kubernetes-versions-commands) - - [Get a Version](#get-a-version) - - [List all available Versions](#list-all-available-versions) - - -## Access Control List (ACL) management commands - -Network Access Control Lists (ACLs) allow you to manage inbound network traffic by setting up ACL rules. - -Network Access Control Lists (ACLs) allow you to manage inbound network traffic by setting up ACL rules. - -**Usage:** - -``` -scw k8s acl -``` - - - -## Kapsule cluster management commands - -A cluster is a fully managed Kubernetes cluster -It is composed of different pools, each pool containing the same kind of nodes. - - -### Create a new Cluster - -Create a new Kubernetes cluster in a Scaleway region. - -**Usage:** - -``` -scw k8s cluster create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| type | | Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16) | -| name | Required
Default: `` | Cluster name | -| description | | Cluster description | -| tags.{index} | | Tags associated with the cluster | -| version | Required
Default: `latest` | Kubernetes version of the cluster | -| cni | Required
Default: `cilium`
One of: `unknown_cni`, `cilium`, `calico`, `weave`, `flannel`, `kilo`, `none` | Container Network Interface (CNI) plugin running in the cluster | -| pools.{index}.name | | Name of the pool | -| pools.{index}.node-type | | Node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster | -| pools.{index}.placement-group-id | | Placement group ID in which all the nodes of the pool will be created | -| pools.{index}.autoscaling | | Defines whether the autoscaling feature is enabled for the pool | -| pools.{index}.size | | Size (number of nodes) of the pool | -| pools.{index}.min-size | | Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | -| pools.{index}.max-size | | Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | -| pools.{index}.container-runtime | One of: `unknown_runtime`, `docker`, `containerd`, `crio` | Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24 | -| pools.{index}.autohealing | | Defines whether the autohealing feature is enabled for the pool | -| pools.{index}.tags.{index} | | Tags associated with the pool | -| pools.{index}.kubelet-args.{key} | | Kubelet arguments to be used by this pool. Note that this feature is experimental | -| pools.{index}.upgrade-policy.max-unavailable | | The maximum number of nodes that can be not ready at the same time | -| pools.{index}.upgrade-policy.max-surge | | The maximum number of nodes to be created during the upgrade | -| pools.{index}.zone | | Zone in which the pool's nodes will be spawned | -| pools.{index}.root-volume-type | One of: `default_volume_type`, `l_ssd`, `b_ssd` | Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster | -| pools.{index}.root-volume-size | | System volume disk size | -| pools.{index}.public-ip-disabled | | Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway | -| autoscaler-config.scale-down-disabled | | Disable the cluster autoscaler | -| autoscaler-config.scale-down-delay-after-add | | How long after scale up that scale down evaluation resumes | -| autoscaler-config.estimator | One of: `unknown_estimator`, `binpacking` | Type of resource estimator to be used in scale up | -| autoscaler-config.expander | One of: `unknown_expander`, `random`, `most_pods`, `least_waste`, `priority`, `price` | Type of node group expander to be used in scale up | -| autoscaler-config.ignore-daemonsets-utilization | | Ignore DaemonSet pods when calculating resource utilization for scaling down | -| autoscaler-config.balance-similar-node-groups | | Detect similar node groups and balance the number of nodes between them | -| autoscaler-config.expendable-pods-priority-cutoff | | Pods with priority below cutoff will be expendable. They can be killed without any consideration during scale down and they won't cause scale up. Pods with null priority (PodPriority disabled) are non expendable | -| autoscaler-config.scale-down-unneeded-time | | How long a node should be unneeded before it is eligible to be scaled down | -| autoscaler-config.scale-down-utilization-threshold | | Node utilization level, defined as a sum of requested resources divided by capacity, below which a node can be considered for scale down | -| autoscaler-config.max-graceful-termination-sec | | Maximum number of seconds the cluster autoscaler waits for pod termination when trying to scale down a node | -| auto-upgrade.enable | | Defines whether auto upgrade is enabled for the cluster | -| auto-upgrade.maintenance-window.start-hour | | Start time of the two-hour maintenance window | -| auto-upgrade.maintenance-window.day | One of: `any`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | Day of the week for the maintenance window | -| feature-gates.{index} | | List of feature gates to enable | -| admission-plugins.{index} | | List of admission plugins to enable | -| open-id-connect-config.issuer-url | | URL of the provider which allows the API server to discover public signing keys. Only URLs using the `https://` scheme are accepted. This is typically the provider's discovery URL without a path, for example "https://accounts.google.com" or "https://login.salesforce.com" | -| open-id-connect-config.client-id | | A client ID that all tokens must be issued for | -| open-id-connect-config.username-claim | | JWT claim to use as the user name. The default is `sub`, which is expected to be the end user's unique identifier. Admins can choose other claims, such as `email` or `name`, depending on their provider. However, claims other than `email` will be prefixed with the issuer URL to prevent name collision | -| open-id-connect-config.username-prefix | | Prefix prepended to username claims to prevent name collision (such as `system:` users). For example, the value `oidc:` will create usernames like `oidc:jane.doe`. If this flag is not provided and `username_claim` is a value other than `email`, the prefix defaults to `( Issuer URL )#` where `( Issuer URL )` is the value of `issuer_url`. The value `-` can be used to disable all prefixing | -| open-id-connect-config.groups-claim.{index} | | JWT claim to use as the user's group | -| open-id-connect-config.groups-prefix | | Prefix prepended to group claims to prevent name collision (such as `system:` groups). For example, the value `oidc:` will create group names like `oidc:engineering` and `oidc:infra` | -| open-id-connect-config.required-claim.{index} | | Multiple key=value pairs describing a required claim in the ID token. If set, the claims are verified to be present in the ID token with a matching value | -| apiserver-cert-sans.{index} | | Additional Subject Alternative Names for the Kubernetes API server certificate | -| private-network-id | | Private network ID for internal cluster communication (cannot be changed later). For Kapsule clusters, if none is provided, a private network will be created | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Create a Kubernetes cluster named foo with cilium as CNI, in version 1.27.0 and with a pool named default composed of 3 DEV1-M -``` -scw k8s cluster create name=foo version=1.27.0 pools.0.size=3 pools.0.node-type=DEV1-M pools.0.name=default -``` - -Create a Kubernetes cluster named bar, tagged, calico as CNI, in version 1.27.0 and with a tagged pool named default composed of 2 RENDER-S and autohealing and autoscaling enabled (between 1 and 10 nodes) -``` -scw k8s cluster create name=bar version=1.27.0 tags.0=tag1 tags.1=tag2 cni=calico pools.0.size=2 pools.0.node-type=RENDER-S pools.0.min-size=1 pools.0.max-size=10 pools.0.autohealing=true pools.0.autoscaling=true pools.0.tags.0=pooltag1 pools.0.tags.1=pooltag2 pools.0.name=default -``` - - - - -### Delete a Cluster - -Delete a specific Kubernetes cluster and all its associated pools and nodes. Note that this method will not delete any Load Balancer or Block Volume that are associated with the cluster. - -**Usage:** - -``` -scw k8s cluster delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster to delete | -| with-additional-resources | | Defines whether all volumes (including retain volume type), empty Private Networks and Load Balancers with a name starting with the cluster ID will also be deleted | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a cluster -``` -scw k8s cluster delete 11111111-1111-1111-111111111111 -``` - -Delete a cluster with its Block volumes and Load Balancers -``` -scw k8s cluster delete 11111111-1111-1111-111111111111 with-additional-resources=true -``` - - - - -### Get a Cluster - -Retrieve information about a specific Kubernetes cluster. - -**Usage:** - -``` -scw k8s cluster get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the requested cluster | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get a cluster information -``` -scw k8s cluster get 11111111-1111-1111-111111111111 -``` - - - - -### List Clusters - -List all existing Kubernetes clusters in a specific region. - -**Usage:** - -``` -scw k8s cluster list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID on which to filter the returned clusters | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc`, `version_asc`, `version_desc` | Sort order of returned clusters | -| name | | Name to filter on, only clusters containing this substring in their name will be returned | -| status | One of: `unknown`, `creating`, `ready`, `deleting`, `deleted`, `updating`, `locked`, `pool_required` | Status to filter on, only clusters with this status will be returned | -| type | | Type to filter on, only clusters with this type will be returned | -| private-network-id | | Private Network ID to filter on, only clusters within this Private Network will be returned | -| organization-id | | Organization ID on which to filter the returned clusters | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all clusters on your default region -``` -scw k8s cluster list -``` - -List the ready clusters on your default region -``` -scw k8s cluster list status=ready -``` - -List the clusters that match the given name on fr-par ('cluster1' will return 'cluster100' and 'cluster1' but not 'foo') -``` -scw k8s cluster list region=fr-par name=cluster1 -``` - - - - -### List available cluster types for a cluster - -List the cluster types that a specific Kubernetes cluster is allowed to switch to. - -**Usage:** - -``` -scw k8s cluster list-available-types [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID for which the available Kubernetes types will be listed | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all cluster types that a cluster can upgrade to -``` -scw k8s cluster list-available-types 11111111-1111-1111-111111111111 -``` - - - - -### List available versions for a Cluster - -List the versions that a specific Kubernetes cluster is allowed to upgrade to. Results will include every patch version greater than the current patch, as well as one minor version ahead of the current version. Any upgrade skipping a minor version will not work. - -**Usage:** - -``` -scw k8s cluster list-available-versions [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID for which the available Kubernetes versions will be listed | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all versions that a cluster can upgrade to -``` -scw k8s cluster list-available-versions 11111111-1111-1111-111111111111 -``` - - - - -### Migrate a cluster to Routed IPs - -Migrate the nodes of an existing cluster to Routed IPs and enable Routed IPs for all future nodes. - -**Usage:** - -``` -scw k8s cluster migrate-to-routed-ips [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID for which the routed ip will be enabled for the nodes | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Migrate a cluster to Routed IPs -``` -scw k8s cluster migrate-to-routed-ips 11111111-1111-1111-111111111111 -``` - - - - -### Migrate a cluster to SBS CSI - -Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. - -**Usage:** - -``` -scw k8s cluster migrate-to-sbs-csi [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID for which the latest CSI compatible with Scaleway Block Storage will be enabled | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Migrate a cluster to SBS CSI -``` -scw k8s cluster migrate-to-sbs-csi 11111111-1111-1111-111111111111 -``` - - - - -### Reset the admin token of a Cluster - -Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download kubeconfig again to keep interacting with the cluster. - -**Usage:** - -``` -scw k8s cluster reset-admin-token [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID on which the admin token will be renewed | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Reset the admin token for a cluster -``` -scw k8s cluster reset-admin-token 11111111-1111-1111-111111111111 -``` - - - - -### Change the Cluster type - -Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#path-clusters-list-available-cluster-types-for-a-cluster). - -**Usage:** - -``` -scw k8s cluster set-type [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster to migrate from one type to another | -| type | Required | Type of the cluster. Note that some migrations are not possible (please refer to product documentation) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Convert a kapsule cluster to a kapsule-dedicated-16 cluster -``` -scw k8s cluster set-type 11111111-1111-1111-111111111111 type=kapsule-dedicated-16 -``` - - - - -### Update a Cluster - -Update information on a specific Kubernetes cluster. You can update details such as its name, description, tags and configuration. To upgrade a cluster, you will need to use the dedicated endpoint. - -**Usage:** - -``` -scw k8s cluster update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster to update | -| name | | New external name for the cluster | -| description | | New description for the cluster | -| tags.{index} | | New tags associated with the cluster | -| autoscaler-config.scale-down-disabled | | Disable the cluster autoscaler | -| autoscaler-config.scale-down-delay-after-add | | How long after scale up that scale down evaluation resumes | -| autoscaler-config.estimator | One of: `unknown_estimator`, `binpacking` | Type of resource estimator to be used in scale up | -| autoscaler-config.expander | One of: `unknown_expander`, `random`, `most_pods`, `least_waste`, `priority`, `price` | Type of node group expander to be used in scale up | -| autoscaler-config.ignore-daemonsets-utilization | | Ignore DaemonSet pods when calculating resource utilization for scaling down | -| autoscaler-config.balance-similar-node-groups | | Detect similar node groups and balance the number of nodes between them | -| autoscaler-config.expendable-pods-priority-cutoff | | Pods with priority below cutoff will be expendable. They can be killed without any consideration during scale down and they won't cause scale up. Pods with null priority (PodPriority disabled) are non expendable | -| autoscaler-config.scale-down-unneeded-time | | How long a node should be unneeded before it is eligible to be scaled down | -| autoscaler-config.scale-down-utilization-threshold | | Node utilization level, defined as a sum of requested resources divided by capacity, below which a node can be considered for scale down | -| autoscaler-config.max-graceful-termination-sec | | Maximum number of seconds the cluster autoscaler waits for pod termination when trying to scale down a node | -| auto-upgrade.enable | | Defines whether auto upgrade is enabled for the cluster | -| auto-upgrade.maintenance-window.start-hour | | Start time of the two-hour maintenance window | -| auto-upgrade.maintenance-window.day | One of: `any`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | Day of the week for the maintenance window | -| feature-gates.{index} | | List of feature gates to enable | -| admission-plugins.{index} | | List of admission plugins to enable | -| open-id-connect-config.issuer-url | | URL of the provider which allows the API server to discover public signing keys. Only URLs using the `https://` scheme are accepted. This is typically the provider's discovery URL without a path, for example "https://accounts.google.com" or "https://login.salesforce.com" | -| open-id-connect-config.client-id | | A client ID that all tokens must be issued for | -| open-id-connect-config.username-claim | | JWT claim to use as the user name. The default is `sub`, which is expected to be the end user's unique identifier. Admins can choose other claims, such as `email` or `name`, depending on their provider. However, claims other than `email` will be prefixed with the issuer URL to prevent name collision | -| open-id-connect-config.username-prefix | | Prefix prepended to username claims to prevent name collision (such as `system:` users). For example, the value `oidc:` will create usernames like `oidc:jane.doe`. If this flag is not provided and `username_claim` is a value other than `email`, the prefix defaults to `( Issuer URL )#` where `( Issuer URL )` is the value of `issuer_url`. The value `-` can be used to disable all prefixing | -| open-id-connect-config.groups-claim.{index} | | JWT claim to use as the user's group | -| open-id-connect-config.groups-prefix | | Prefix prepended to group claims to prevent name collision (such as `system:` groups). For example, the value `oidc:` will create group names like `oidc:engineering` and `oidc:infra` | -| open-id-connect-config.required-claim.{index} | | Multiple key=value pairs describing a required claim in the ID token. If set, the claims are verified to be present in the ID token with a matching value | -| apiserver-cert-sans.{index} | | Additional Subject Alternative Names for the Kubernetes API server certificate | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Add TTLAfterFinished and ServiceNodeExclusion as feature gates on a cluster -``` -scw k8s cluster update 11111111-1111-1111-111111111111 feature-gates.0=TTLAfterFinished feature-gates.1=ServiceNodeExclusion -``` - - - - -### Upgrade a Cluster - -Upgrade a specific Kubernetes cluster and possibly its associated pools to a specific and supported Kubernetes version. - -**Usage:** - -``` -scw k8s cluster upgrade [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster to upgrade | -| version | Required | New Kubernetes version of the cluster. Note that the version should either be a higher patch version of the same minor version or the direct minor version after the current one | -| upgrade-pools | | Defines whether pools will also be upgraded once the control plane is upgraded | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Upgrade a cluster version 1.27.0 of Kubernetes (pools *are not* included) -``` -scw k8s cluster upgrade 11111111-1111-1111-111111111111 version=1.27.0 -``` - -Upgrade a cluster to version 1.27.0 of Kubernetes (pools *are* included) -``` -scw k8s cluster upgrade 11111111-1111-1111-111111111111 version=1.27.0 upgrade-pools=true -``` - - - - -### Wait for a cluster to reach a stable state - -Wait for server to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the server. - -**Usage:** - -``` -scw k8s cluster wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster. | -| wait-for-pools | | Wait for pools to be ready. | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | -| timeout | Default: `10m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a cluster to reach a stable state -``` -scw k8s cluster wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Cluster type management commands - -All cluster types available in a specified region -A cluster type represents the different commercial types of clusters offered by Scaleway. - - -### List cluster types - -List available cluster types and their technical details. - -**Usage:** - -``` -scw k8s cluster-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Manage your Kubernetes Kapsule cluster's kubeconfig files - - - - -### Retrieve a kubeconfig - -Retrieve the kubeconfig for a specified cluster. - -**Usage:** - -``` -scw k8s kubeconfig get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID from which to retrieve the kubeconfig | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get the kubeconfig for a given cluster -``` -scw k8s kubeconfig get 11111111-1111-1111-1111-111111111111 -``` - - - - -### Install a kubeconfig - -Retrieve the kubeconfig for a specified cluster and write it on disk. -It will merge the new kubeconfig in the file pointed by the KUBECONFIG variable. If empty it will default to $HOME/.kube/config. - -**Usage:** - -``` -scw k8s kubeconfig install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID from which to retrieve the kubeconfig | -| keep-current-context | | Whether or not to keep the current kubeconfig context unmodified | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Install the kubeconfig for a given cluster and using the new context -``` -scw k8s kubeconfig install 11111111-1111-1111-1111-111111111111 -``` - - - - -### Uninstall a kubeconfig - -Remove specified cluster from kubeconfig file specified by the KUBECONFIG env, if empty it will default to $HOME/.kube/config. -If the current context points to this cluster, it will be set to an empty context. - -**Usage:** - -``` -scw k8s kubeconfig uninstall [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID from which to uninstall the kubeconfig | - - -**Examples:** - - -Uninstall the kubeconfig for a given cluster -``` -scw k8s kubeconfig uninstall 11111111-1111-1111-1111-111111111111 -``` - - - - -## Kapsule node management commands - -A node (short for worker node) is an abstraction for a Scaleway Instance -A node is always part of a pool. Each of them has the Kubernetes software automatically installed and configured by Scaleway. - - -### Delete a Node in a Cluster - -Delete a specific Node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. - -**Usage:** - -``` -scw k8s node delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| node-id | Required | ID of the node to replace | -| skip-drain | | Skip draining node from its workload (Note: this parameter is currently inactive) | -| replace | | Add a new node after the deletion of this node | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a node -``` -scw k8s node delete 11111111-1111-1111-111111111111 -``` - -Delete a node without evicting workloads -``` -scw k8s node delete 11111111-1111-1111-111111111111 skip-drain=true -``` - -Replace a node by a new one -``` -scw k8s node delete 11111111-1111-1111-111111111111 replace=true -``` - - - - -### Get a Node in a Cluster - -Retrieve details about a specific Kubernetes Node. - -**Usage:** - -``` -scw k8s node get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| node-id | Required | ID of the requested node | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get a node -``` -scw k8s node get 11111111-1111-1111-111111111111 -``` - - - - -### List Nodes in a Cluster - -List all the existing nodes for a specific Kubernetes cluster. - -**Usage:** - -``` -scw k8s node list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID from which the nodes will be listed from | -| pool-id | | Pool ID on which to filter the returned nodes | -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of the returned nodes | -| name | | Name to filter on, only nodes containing this substring in their name will be returned | -| status | One of: `unknown`, `creating`, `not_ready`, `ready`, `deleting`, `deleted`, `locked`, `rebooting`, `creation_error`, `upgrading`, `starting`, `registering` | Status to filter on, only nodes with this status will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all the nodes in the cluster -``` -scw k8s node list cluster-id=11111111-1111-1111-111111111111 -``` - -List all the nodes in the cluster's 2222222222222-2222-222222222222 pool -``` -scw k8s node list cluster-id=11111111-1111-1111-111111111111 pool-id=2222222222222-2222-222222222222 -``` - -List all cluster nodes that are ready -``` -scw k8s node list cluster-id=11111111-1111-1111-111111111111 status=ready -``` - - - - -### Reboot a Node in a Cluster - -Reboot a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. - -**Usage:** - -``` -scw k8s node reboot [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| node-id | Required | ID of the node to reboot | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Reboot a node -``` -scw k8s node reboot 11111111-1111-1111-111111111111 -``` - - - - -### Replace a Node in a Cluster - -Replace a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. - -**Usage:** - -``` -scw k8s node replace [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| node-id | Required | ID of the node to replace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Replace a node -``` -scw k8s node replace 11111111-1111-1111-111111111111 -``` - - - - -### Wait for a node to reach a stable state - -Wait for a node to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the node. - -**Usage:** - -``` -scw k8s node wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| node-id | Required | ID of the node. | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | -| timeout | Default: `10m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a node to reach a stable state -``` -scw k8s node wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Kapsule pool management commands - -A pool is a set of identical nodes -A pool has a name, a size (its desired number of nodes), node number limits (min, max), and a Scaleway Instance type. Changing those limits increases/decreases the size of a pool. As a result and depending on its load, the pool will grow or shrink within those limits when autoscaling is enabled. A "default pool" is automatically created with every cluster via the console. - - -### Create a new Pool in a Cluster - -Create a new pool in a specific Kubernetes cluster. - -**Usage:** - -``` -scw k8s pool create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | Cluster ID to which the pool will be attached | -| name | Required
Default: `` | Pool name | -| node-type | Required
Default: `DEV1-M` | Node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster | -| placement-group-id | | Placement group ID in which all the nodes of the pool will be created | -| autoscaling | | Defines whether the autoscaling feature is enabled for the pool | -| size | Required
Default: `1` | Size (number of nodes) of the pool | -| min-size | | Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | -| max-size | | Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool | -| container-runtime | One of: `unknown_runtime`, `docker`, `containerd`, `crio` | Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24 | -| autohealing | | Defines whether the autohealing feature is enabled for the pool | -| tags.{index} | | Tags associated with the pool | -| kubelet-args.{key} | | Kubelet arguments to be used by this pool. Note that this feature is experimental | -| upgrade-policy.max-unavailable | | | -| upgrade-policy.max-surge | | | -| zone | | Zone in which the pool's nodes will be spawned | -| root-volume-type | One of: `default_volume_type`, `l_ssd`, `b_ssd` | Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster | -| root-volume-size | | System volume disk size | -| public-ip-disabled | | Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Create a pool named 'bar' with 2 DEV1-XL on a cluster -``` -scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=bar node-type=DEV1-XL size=2 -``` - -Create a pool named 'fish' with 5 GP1-L, autoscaling within 0 and 10 nodes and autohealing enabled, and containerd as the cluster container runtime -``` -scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=fish node-type=GP1-L size=5 min-size=0 max-size=10 autoscaling=true autohealing=true container-runtime=containerd -``` - -Create a tagged pool named 'turtle' with 1 GP1-S which is using the already created placement group 2222222222222-2222-222222222222 for all the nodes in the pool on a cluster -``` -scw k8s pool create cluster-id=11111111-1111-1111-111111111111 name=turtle node-type=GP1-S size=1 placement-group-id=2222222222222-2222-222222222222 tags.0=turtle tags.1=placement-group -``` - - - - -### Delete a Pool in a Cluster - -Delete a specific pool from a cluster. Note that all the pool's nodes will also be deleted. - -**Usage:** - -``` -scw k8s pool delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pool-id | Required | ID of the pool to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a specific pool -``` -scw k8s pool delete 11111111-1111-1111-111111111111 -``` - - - - -### Get a Pool in a Cluster - -Retrieve details about a specific pool in a Kubernetes cluster. - -**Usage:** - -``` -scw k8s pool get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pool-id | Required | ID of the requested pool | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get a given pool -``` -scw k8s pool get 11111111-1111-1111-111111111111 -``` - - - - -### List Pools in a Cluster - -List all the existing pools for a specific Kubernetes cluster. - -**Usage:** - -``` -scw k8s pool list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster whose pools will be listed | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc`, `version_asc`, `version_desc` | Sort order of returned pools | -| name | | Name to filter on, only pools containing this substring in their name will be returned | -| status | One of: `unknown`, `ready`, `deleting`, `deleted`, `scaling`, `warning`, `locked`, `upgrading` | Status to filter on, only pools with this status will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all pools for a cluster -``` -scw k8s pool list cluster-id=11111111-1111-1111-111111111111 -``` - -List all scaling pools for a cluster -``` -scw k8s pool list cluster-id=11111111-1111-1111-111111111111 status=scaling -``` - -List all pools for clusters containing 'foo' in their name -``` -scw k8s pool list cluster-id=11111111-1111-1111-111111111111 name=foo -``` - -List all pools for a cluster and order them by ascending creation date -``` -scw k8s pool list cluster-id=11111111-1111-1111-111111111111 order-by=created_at_asc -``` - - - - -### Update a Pool in a Cluster - -Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. - -**Usage:** - -``` -scw k8s pool update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pool-id | Required | ID of the pool to update | -| autoscaling | | New value for the pool autoscaling enablement | -| size | | New desired pool size | -| min-size | | New minimum size for the pool | -| max-size | | New maximum size for the pool | -| autohealing | | New value for the pool autohealing enablement | -| tags.{index} | | New tags associated with the pool | -| kubelet-args.{key} | | New Kubelet arguments to be used by this pool. Note that this feature is experimental | -| upgrade-policy.max-unavailable | | | -| upgrade-policy.max-surge | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Enable autoscaling on a given pool -``` -scw k8s pool update 11111111-1111-1111-111111111111 autoscaling=true -``` - -Reduce the size and maximum size of a given pool to 4 -``` -scw k8s pool update 11111111-1111-1111-111111111111 size=4 max-size=4 -``` - -Modify the tags of a given pool -``` -scw k8s pool update 11111111-1111-1111-111111111111 tags.0=my tags.1=new tags.2=pool -``` - - - - -### Upgrade a Pool in a Cluster - -Upgrade the Kubernetes version of a specific pool. Note that it only works if the targeted version matches the cluster's version. - -**Usage:** - -``` -scw k8s pool upgrade [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pool-id | Required | ID of the pool to upgrade | -| version | Required | New Kubernetes version for the pool | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Upgrade a specific pool to the Kubernetes version 1.27.0 -``` -scw k8s pool upgrade 11111111-1111-1111-111111111111 version=1.27.0 -``` - - - - -### Wait for a pool to reach a stable state - -Wait for a pool to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the node. - -**Usage:** - -``` -scw k8s pool wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pool-id | Required | ID of the pool. | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | -| timeout | Default: `10m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a pool to reach a stable state -``` -scw k8s pool wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Available Kubernetes versions commands - -A version is a vanilla Kubernetes version like `x.y.z` -It comprises a major version `x`, a minor version `y`, and a patch version `z`. At the minimum, Kapsule (Scaleway's managed Kubernetes), will support the last patch version for the past three minor releases. Also, each version has a different set of CNIs, eventually container runtimes, feature gates, and admission plugins available. See our [Version Support Policy](https://www.scaleway.com/en/docs/containers/kubernetes/reference-content/version-support-policy/). - - -### Get a Version - -Retrieve a specific Kubernetes version and its details. - -**Usage:** - -``` -scw k8s version get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| version-name | Required | Requested version name | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get the Kubernetes version 1.27.0 -``` -scw k8s version get 1.27.0 -``` - - - - -### List all available Versions - -List all available versions for the creation of a new Kubernetes cluster. - -**Usage:** - -``` -scw k8s version list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all available Kubernetes version in Kapsule -``` -scw k8s version list -``` - - - - diff --git a/docs/docs/keymanager.md b/docs/docs/keymanager.md deleted file mode 100644 index e2ac7a6623..0000000000 --- a/docs/docs/keymanager.md +++ /dev/null @@ -1,309 +0,0 @@ - -# Documentation for `scw keymanager` -This API allows you to conveniently store and use cryptographic keys. - -- [Key management commands](#key-management-commands) - - [Create a key](#create-a-key) - - [Decrypt data](#decrypt-data) - - [Delete a key](#delete-a-key) - - [Disable key](#disable-key) - - [Enable key](#enable-key) - - [Encrypt data](#encrypt-data) - - [Generate a data encryption key](#generate-a-data-encryption-key) - - [Get key metadata](#get-key-metadata) - - [List keys](#list-keys) - - [Apply key protection](#apply-key-protection) - - [Rotate a key](#rotate-a-key) - - [Remove key protection](#remove-key-protection) - - [Update a key](#update-a-key) - - -## Key management commands - -Keys are logical containers which store cryptographic keys. - - -### Create a key - -Create a key in a given region specified by the `region` parameter. Keys only support symmetric encryption. You can use keys to encrypt or decrypt arbitrary payloads, or to generate data encryption keys that can be used without being stored in Key Manager. - -**Usage:** - -``` -scw keymanager key create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | (Optional) Name of the key | -| usage.symmetric-encryption | One of: `unknown_symmetric_encryption`, `aes_256_gcm` | | -| description | | (Optional) Description of the key | -| tags.{index} | | (Optional) List of the key's tags | -| rotation-policy.rotation-period | | Rotation period | -| rotation-policy.next-rotation-at | | Key next rotation date | -| unprotected | | (Optional) Defines whether key protection is applied to a key. Protected keys can be used but not deleted | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Decrypt data - -Decrypt data using an existing key, specified by the `key_id` parameter. The maximum payload size that can be decrypted is the result of the encryption of 64KB of data (around 131KB). - -**Usage:** - -``` -scw keymanager key decrypt [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to decrypt | -| ciphertext | Required | Base64 Ciphertext data to decrypt | -| associated-data | | (Optional) Additional authenticated data | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a key - -Delete an existing key specified by the `region` and `key_id` parameters. Deleting a key is permanent and cannot be undone. All data encrypted using this key, including data encryption keys, will become unusable. - -**Usage:** - -``` -scw keymanager key delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Disable key - -Disable a given key to be used for cryptographic operations. Disabling a key renders it unusable. You must specify the `region` and `key_id` parameters. - -**Usage:** - -``` -scw keymanager key disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to disable | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable key - -Enable a given key to be used for cryptographic operations. Enabling a key allows you to make a disabled key usable again. You must specify the `region` and `key_id` parameters. - -**Usage:** - -``` -scw keymanager key enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to enable | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Encrypt data - -Encrypt data using an existing key, specified by the `key_id` parameter. Only keys with a usage set to **symmetric_encryption** are supported by this method. The maximum payload size that can be encrypted is 64KB of plaintext. - -**Usage:** - -``` -scw keymanager key encrypt [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to encrypt | -| plaintext | Required | Base64 Plaintext data to encrypt | -| associated-data | | (Optional) Additional authenticated data | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Generate a data encryption key - -Generate a new data encryption key to use for cryptographic operations outside of Key Manager. Note that Key Manager does not store your data encryption key. The data encryption key is encrypted and must be decrypted using the key you have created in Key Manager. The data encryption key's plaintext is returned in the response object, for immediate usage. - -Always store the data encryption key's ciphertext, rather than its plaintext, which must not be stored. To retrieve your key's plaintext, call the Decrypt endpoint with your key's ID and ciphertext. - -**Usage:** - -``` -scw keymanager key generate-data-key [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key | -| algorithm | One of: `unknown_symmetric_encryption`, `aes_256_gcm` | Symmetric encryption algorithm of the data encryption key | -| without-plaintext | | (Optional) Defines whether to return the data encryption key's plaintext in the response object | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get key metadata - -Retrieve the metadata of a key specified by the `region` and `key_id` parameters. - -**Usage:** - -``` -scw keymanager key get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to target | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List keys - -Retrieve the list of keys created within all Projects of an Organization or in a given Project. You must specify the `region`, and either the `organization_id` or the `project_id`. - -**Usage:** - -``` -scw keymanager key list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | (Optional) Filter by Project ID | -| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | | -| tags.{index} | | (Optional) List of tags to filter on | -| name | | (Optional) Filter by key name | -| organization-id | | (Optional) Filter by Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Apply key protection - -Apply key protection to a given key specified by the `key_id` parameter. Applying key protection means that your key can be used and modified, but it cannot be deleted. - -**Usage:** - -``` -scw keymanager key protect [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to apply key protection to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Rotate a key - -Generate a new version of an existing key with randomly generated key material. Rotated keys can still be used to decrypt previously encrypted data. The key's new material will be used for subsequent encryption operations and data key generation. - -**Usage:** - -``` -scw keymanager key rotate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to rotate | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Remove key protection - -Remove key protection from a given key specified by the `key_id` parameter. Removing key protection means that your key can be deleted anytime. - -**Usage:** - -``` -scw keymanager key unprotect [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to remove key protection from | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update a key - -Update a key's metadata (name, description and tags), specified by the `key_id` and `region` parameters. - -**Usage:** - -``` -scw keymanager key update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| key-id | Required | ID of the key to update | -| name | | (Optional) Updated name of the key | -| description | | (Optional) Updated description of the key | -| tags.{index} | | (Optional) Updated list of the key's tags | -| rotation-policy.rotation-period | | Rotation period | -| rotation-policy.next-rotation-at | | Key next rotation date | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/lb.md b/docs/docs/lb.md deleted file mode 100644 index 482039446c..0000000000 --- a/docs/docs/lb.md +++ /dev/null @@ -1,1447 +0,0 @@ - -# Documentation for `scw lb` -This API allows you to manage your Scaleway Load Balancer services. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) - - [Create an ACL for a given frontend](#create-an-acl-for-a-given-frontend) - - [Delete an ACL](#delete-an-acl) - - [Get an ACL](#get-an-acl) - - [List ACLs for a given frontend](#list-acls-for-a-given-frontend) - - [Define all ACLs for a given frontend](#define-all-acls-for-a-given-frontend) - - [Update an ACL](#update-an-acl) -- [Backend management commands](#backend-management-commands) - - [Add a set of backend servers to a given backend](#add-a-set-of-backend-servers-to-a-given-backend) - - [Create a backend for a given Load Balancer](#create-a-backend-for-a-given-load-balancer) - - [Delete a backend of a given Load Balancer](#delete-a-backend-of-a-given-load-balancer) - - [Get a backend of a given Load Balancer](#get-a-backend-of-a-given-load-balancer) - - [List the backends of a given Load Balancer](#list-the-backends-of-a-given-load-balancer) - - [List backend server statistics](#list-backend-server-statistics) - - [Remove a set of servers for a given backend](#remove-a-set-of-servers-for-a-given-backend) - - [Define all backend servers for a given backend](#define-all-backend-servers-for-a-given-backend) - - [Update a backend of a given Load Balancer](#update-a-backend-of-a-given-load-balancer) - - [Update a health check for a given backend](#update-a-health-check-for-a-given-backend) -- [TLS certificate management commands](#tls-certificate-management-commands) - - [Create an SSL/TLS certificate](#create-an-ssltls-certificate) - - [Delete an SSL/TLS certificate](#delete-an-ssltls-certificate) - - [Get an SSL/TLS certificate](#get-an-ssltls-certificate) - - [List all SSL/TLS certificates on a given Load Balancer](#list-all-ssltls-certificates-on-a-given-load-balancer) - - [Update an SSL/TLS certificate](#update-an-ssltls-certificate) -- [Frontend management commands](#frontend-management-commands) - - [Create a frontend in a given Load Balancer](#create-a-frontend-in-a-given-load-balancer) - - [Delete a frontend](#delete-a-frontend) - - [Get a frontend](#get-a-frontend) - - [List frontends of a given Load Balancer](#list-frontends-of-a-given-load-balancer) - - [Update a frontend](#update-a-frontend) -- [IP management commands](#ip-management-commands) - - [Create an IP address](#create-an-ip-address) - - [Delete an IP address](#delete-an-ip-address) - - [Get an IP address](#get-an-ip-address) - - [List IP addresses](#list-ip-addresses) - - [Update an IP address](#update-an-ip-address) -- [Load balancer management commands](#load-balancer-management-commands) - - [Create a Load Balancer](#create-a-load-balancer) - - [Delete a Load Balancer](#delete-a-load-balancer) - - [Get a Load Balancer](#get-a-load-balancer) - - [Get usage statistics of a given Load Balancer](#get-usage-statistics-of-a-given-load-balancer) - - [List Load Balancers](#list-load-balancers) - - [Migrate a Load Balancer](#migrate-a-load-balancer) - - [Update a Load Balancer](#update-a-load-balancer) - - [Wait for a load balancer to reach a stable state](#wait-for-a-load-balancer-to-reach-a-stable-state) -- [Load balancer types management commands](#load-balancer-types-management-commands) - - [List all Load Balancer offer types](#list-all-load-balancer-offer-types) -- [Private networks management commands](#private-networks-management-commands) - - [Attach a Load Balancer to a Private Network](#attach-a-load-balancer-to-a-private-network) - - [Detach Load Balancer from Private Network](#detach-load-balancer-from-private-network) - - [List Private Networks attached to a Load Balancer](#list-private-networks-attached-to-a-load-balancer) -- [Route rules management commands](#route-rules-management-commands) - - [Create a route](#create-a-route) - - [Delete a route](#delete-a-route) - - [Get a route](#get-a-route) - - [List all routes](#list-all-routes) - - [Update a route](#update-a-route) -- [Subscriber management commands](#subscriber-management-commands) - - [Create a subscriber](#create-a-subscriber) - - [Delete a subscriber](#delete-a-subscriber) - - [Get a subscriber](#get-a-subscriber) - - [List all subscribers](#list-all-subscribers) - - [Subscribe a subscriber to alerts for a given Load Balancer](#subscribe-a-subscriber-to-alerts-for-a-given-load-balancer) - - [Unsubscribe a subscriber from alerts for a given Load Balancer](#unsubscribe-a-subscriber-from-alerts-for-a-given-load-balancer) - - [Update a subscriber](#update-a-subscriber) - - -## Access Control List (ACL) management commands - -Access Control List (ACL) management commands. - - -### Create an ACL for a given frontend - -Create a new ACL for a given frontend. Each ACL must have a name, an action to perform (allow or deny), and a match rule (the action is carried out when the incoming traffic matches the rule). - -**Usage:** - -``` -scw lb acl create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | Required | Frontend ID to attach the ACL to | -| name | Required
Default: `` | ACL name | -| action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | -| action.redirect.type | One of: `location`, `scheme` | Redirect type | -| action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | -| action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | -| match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | -| match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | -| match.http-filter-value.{index} | | List of values to filter for | -| match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | -| match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | -| index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | -| description | | ACL description | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an ACL - -Delete an ACL, specified by its ACL ID. Deleting an ACL is irreversible and cannot be undone. - -**Usage:** - -``` -scw lb acl delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | ACL ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an ACL - -Get information for a particular ACL, specified by its ACL ID. The response returns full details of the ACL, including its name, action, match rule and frontend. - -**Usage:** - -``` -scw lb acl get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | ACL ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List ACLs for a given frontend - -List the ACLs for a given frontend, specified by its frontend ID. The response is an array of ACL objects, each one representing an ACL that denies or allows traffic based on certain conditions. - -**Usage:** - -``` -scw lb acl list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | Required | Frontend ID (ACLs attached to this frontend will be returned in the response) | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of ACLs in the response | -| name | | ACL name to filter for | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Define all ACLs for a given frontend - -For a given frontend specified by its frontend ID, define and add the complete set of ACLS for that frontend. Any existing ACLs on this frontend will be removed. - -**Usage:** - -``` -scw lb acl set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acls.{index}.name | Required | ACL name | -| acls.{index}.action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | -| acls.{index}.action.redirect.type | One of: `location`, `scheme` | Redirect type | -| acls.{index}.action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | -| acls.{index}.action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | -| acls.{index}.match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | -| acls.{index}.match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | -| acls.{index}.match.http-filter-value.{index} | | List of values to filter for | -| acls.{index}.match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | -| acls.{index}.match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | -| acls.{index}.index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | -| acls.{index}.description | | ACL description | -| frontend-id | Required | Frontend ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an ACL - -Update a particular ACL, specified by its ACL ID. You can update details including its name, action and match rule. - -**Usage:** - -``` -scw lb acl update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | ACL ID | -| name | Required | ACL name | -| action.type | One of: `allow`, `deny`, `redirect` | Action to take when incoming traffic matches an ACL filter | -| action.redirect.type | One of: `location`, `scheme` | Redirect type | -| action.redirect.target | | Redirect target. For a location redirect, you can use a URL e.g. `https://scaleway.com`. Using a scheme name (e.g. `https`, `http`, `ftp`, `git`) will replace the request's original scheme. This can be useful to implement HTTP to HTTPS redirects. Valid placeholders that can be used in a `location` redirect to preserve parts of the original request in the redirection URL are \{\{host\}\}, \{\{query\}\}, \{\{path\}\} and \{\{scheme\}\} | -| action.redirect.code | | HTTP redirect code to use. Valid values are 301, 302, 303, 307 and 308. Default value is 302 | -| match.ip-subnet.{index} | | List of IPs or CIDR v4/v6 addresses to filter for from the client side | -| match.http-filter | One of: `acl_http_filter_none`, `path_begin`, `path_end`, `regex`, `http_header_match` | Type of HTTP filter to match. Extracts the request's URL path, which starts at the first slash and ends before the question mark (without the host part). Defines where to filter for the http_filter_value. Only supported for HTTP backends | -| match.http-filter-value.{index} | | List of values to filter for | -| match.http-filter-option | | Name of the HTTP header to filter on if `http_header_match` was selected in `http_filter` | -| match.invert | | Defines whether to invert the match condition. If set to `true`, the ACL carries out its action when the condition DOES NOT match | -| index | Required | Priority of this ACL (ACLs are applied in ascending order, 0 is the first ACL executed) | -| description | | ACL description | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Backend management commands - -Backend management commands. - - -### Add a set of backend servers to a given backend - -For a given backend specified by its backend ID, add a set of backend servers (identified by their IP addresses) it should forward traffic to. These will be appended to any existing set of backend servers for this backend. - -**Usage:** - -``` -scw lb backend add-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | Backend ID | -| instance-server-id.{index} | | UIID of the instance server. | -| instance-server-tag.{index} | | Tag of the instance server. | -| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | -| baremetal-server-id.{index} | | UIID of the baremetal server. | -| baremetal-server-tag.{index} | | Tag of the baremetal server. | -| server-ip.{index} | Required | List of IP addresses to add to backend servers | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Create a backend for a given Load Balancer - -Create a new backend for a given Load Balancer, specifying its full configuration including protocol, port and forwarding algorithm. - -**Usage:** - -``` -scw lb backend create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name for the backend | -| forward-protocol | Required
One of: `tcp`, `http` | Protocol to be used by the backend when forwarding traffic to backend servers | -| forward-port | Required | Port to be used by the backend when forwarding traffic to backend servers | -| forward-port-algorithm | Required
Default: `roundrobin`
One of: `roundrobin`, `leastconn`, `first` | Load balancing algorithm to be used when determining which backend server to forward new traffic to | -| sticky-sessions | Required
Default: `none`
One of: `none`, `cookie`, `table` | Defines whether to activate sticky sessions (binding a particular session to a particular backend server) and the method to use if so. None disables sticky sessions. Cookie-based uses an HTTP cookie TO stick a session to a backend server. Table-based uses the source (client) IP address to stick a session to a backend server | -| sticky-sessions-cookie-name | | Cookie name for cookie-based sticky sessions | -| lb-id | Required | Load Balancer ID | -| health-check.port | | Port to use for the backend server health check | -| health-check.check-delay | Default: `3s` | Time to wait between two consecutive health checks | -| health-check.check-timeout | Default: `1s` | Maximum time a backend server has to reply to the health check | -| health-check.check-max-retries | | Number of consecutive unsuccessful health checks after which the server will be considered dead | -| health-check.mysql-config.user | | MySQL user to use for the health check | -| health-check.pgsql-config.user | | PostgreSQL user to use for the health check | -| health-check.http-config.uri | | HTTP URI used for the health check | -| health-check.http-config.method | | HTTP method used for the health check | -| health-check.http-config.code | | HTTP response code expected for a successful health check | -| health-check.http-config.host-header | | HTTP host header used for the health check | -| health-check.https-config.uri | | HTTP URI used for the health check | -| health-check.https-config.method | | HTTP method used for the health check | -| health-check.https-config.code | | HTTP response code expected for a successful health check | -| health-check.https-config.host-header | | HTTP host header used for the health check | -| health-check.https-config.sni | | SNI used for SSL health checks | -| health-check.check-send-proxy | | Defines whether proxy protocol should be activated for the health check | -| health-check.transient-check-delay | Default: `0.5s` | Time to wait between two consecutive health checks when a backend server is in a transient state (going UP or DOWN) | -| instance-server-id.{index} | | UIID of the instance server. | -| instance-server-tag.{index} | | Tag of the instance server. | -| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | -| baremetal-server-id.{index} | | UIID of the baremetal server. | -| baremetal-server-tag.{index} | | Tag of the baremetal server. | -| server-ip.{index} | Required | List of backend server IP addresses (IPv4 or IPv6) the backend should forward traffic to | -| ~~send-proxy-v2~~ | Deprecated | Deprecated in favor of proxy_protocol field | -| timeout-server | Default: `5m` | Maximum allowed time for a backend server to process a request | -| timeout-connect | Default: `5s` | Maximum allowed time for establishing a connection to a backend server | -| timeout-tunnel | Default: `15m` | Maximum allowed tunnel inactivity time after Websocket is established (takes precedence over client and server timeout) | -| on-marked-down-action | One of: `on_marked_down_action_none`, `shutdown_sessions` | Action to take when a backend server is marked as down | -| proxy-protocol | One of: `proxy_protocol_unknown`, `proxy_protocol_none`, `proxy_protocol_v1`, `proxy_protocol_v2`, `proxy_protocol_v2_ssl`, `proxy_protocol_v2_ssl_cn` | Protocol to use between the Load Balancer and backend servers. Allows the backend servers to be informed of the client's real IP address. The PROXY protocol must be supported by the backend servers' software | -| failover-host | | Scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud | -| ssl-bridging | | Defines whether to enable SSL bridging between the Load Balancer and backend servers | -| ignore-ssl-server-verify | | Defines whether the server certificate verification should be ignored | -| redispatch-attempt-count | | Whether to use another backend server on each attempt | -| max-retries | | Number of retries when a backend server connection failed | -| max-connections | | Maximum number of connections allowed per backend server | -| timeout-queue | | Maximum time for a request to be left pending in queue when `max_connections` is reached | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a backend of a given Load Balancer - -Delete a backend of a given Load Balancer, specified by its backend ID. This action is irreversible and cannot be undone. - -**Usage:** - -``` -scw lb backend delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | ID of the backend to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a backend of a given Load Balancer - -Get the full details of a given backend, specified by its backend ID. The response contains the backend's full configuration parameters including protocol, port and forwarding algorithm. - -**Usage:** - -``` -scw lb backend get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | Backend ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List the backends of a given Load Balancer - -List all the backends of a Load Balancer, specified by its Load Balancer ID. By default, results are returned in ascending order by the creation date of each backend. The response is an array of backend objects, containing full details of each one including their configuration parameters such as protocol, port and forwarding algorithm. - -**Usage:** - -``` -scw lb backend list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| name | | Name of the backend to filter for | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of backends in the response | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### List backend server statistics - -List information about your backend servers, including their state and the result of their last health check. - -**Usage:** - -``` -scw lb backend list-statistics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| backend-id | | ID of the backend | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Remove a set of servers for a given backend - -For a given backend specified by its backend ID, remove the specified backend servers (identified by their IP addresses) so that it no longer forwards traffic to them. - -**Usage:** - -``` -scw lb backend remove-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | Backend ID | -| instance-server-id.{index} | | UIID of the instance server. | -| instance-server-tag.{index} | | Tag of the instance server. | -| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | -| baremetal-server-id.{index} | | UIID of the baremetal server. | -| baremetal-server-tag.{index} | | Tag of the baremetal server. | -| server-ip.{index} | Required | List of IP addresses to remove from backend servers | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Define all backend servers for a given backend - -For a given backend specified by its backend ID, define the set of backend servers (identified by their IP addresses) that it should forward traffic to. Any existing backend servers configured for this backend will be removed. - -**Usage:** - -``` -scw lb backend set-servers [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | Backend ID | -| instance-server-id.{index} | | UIID of the instance server. | -| instance-server-tag.{index} | | Tag of the instance server. | -| use-instance-server-public-ip | | Use public IP address of the instance instead of the private one | -| baremetal-server-id.{index} | | UIID of the baremetal server. | -| baremetal-server-tag.{index} | | Tag of the baremetal server. | -| server-ip.{index} | Required | List of IP addresses for backend servers. Any other existing backend servers will be removed | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a backend of a given Load Balancer - -Update a backend of a given Load Balancer, specified by its backend ID. Note that the request type is PUT and not PATCH. You must set all parameters. - -**Usage:** - -``` -scw lb backend update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backend-id | Required | Backend ID | -| name | Required | Backend name | -| forward-protocol | Required
One of: `tcp`, `http` | Protocol to be used by the backend when forwarding traffic to backend servers | -| forward-port | Required | Port to be used by the backend when forwarding traffic to backend servers | -| forward-port-algorithm | Required
One of: `roundrobin`, `leastconn`, `first` | Load balancing algorithm to be used when determining which backend server to forward new traffic to | -| sticky-sessions | Required
One of: `none`, `cookie`, `table` | Defines whether to activate sticky sessions (binding a particular session to a particular backend server) and the method to use if so. None disables sticky sessions. Cookie-based uses an HTTP cookie to stick a session to a backend server. Table-based uses the source (client) IP address to stick a session to a backend server | -| sticky-sessions-cookie-name | | Cookie name for cookie-based sticky sessions | -| ~~send-proxy-v2~~ | Deprecated | Deprecated in favor of proxy_protocol field | -| timeout-server | Default: `5m` | Maximum allowed time for a backend server to process a request | -| timeout-connect | Default: `5s` | Maximum allowed time for establishing a connection to a backend server | -| timeout-tunnel | Default: `15m` | Maximum allowed tunnel inactivity time after Websocket is established (takes precedence over client and server timeout) | -| on-marked-down-action | One of: `on_marked_down_action_none`, `shutdown_sessions` | Action to take when a backend server is marked as down | -| proxy-protocol | One of: `proxy_protocol_unknown`, `proxy_protocol_none`, `proxy_protocol_v1`, `proxy_protocol_v2`, `proxy_protocol_v2_ssl`, `proxy_protocol_v2_ssl_cn` | Protocol to use between the Load Balancer and backend servers. Allows the backend servers to be informed of the client's real IP address. The PROXY protocol must be supported by the backend servers' software | -| failover-host | | Scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud | -| ssl-bridging | | Defines whether to enable SSL bridging between the Load Balancer and backend servers | -| ignore-ssl-server-verify | | Defines whether the server certificate verification should be ignored | -| redispatch-attempt-count | | Whether to use another backend server on each attempt | -| max-retries | | Number of retries when a backend server connection failed | -| max-connections | | Maximum number of connections allowed per backend server | -| timeout-queue | | Maximum time for a request to be left pending in queue when `max_connections` is reached | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a health check for a given backend - -Update the configuration of the health check performed by a given backend to verify the health of its backend servers, identified by its backend ID. Note that the request type is PUT and not PATCH. You must set all parameters. - -**Usage:** - -``` -scw lb backend update-healthcheck [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| port | Required | Port to use for the backend server health check | -| check-delay | Required | Time to wait between two consecutive health checks | -| check-timeout | Required | Maximum time a backend server has to reply to the health check | -| check-max-retries | Required | Number of consecutive unsuccessful health checks after which the server will be considered dead | -| backend-id | Required | Backend ID | -| check-send-proxy | | Defines whether proxy protocol should be activated for the health check | -| mysql-config.user | | MySQL user to use for the health check | -| pgsql-config.user | | PostgreSQL user to use for the health check | -| http-config.uri | | HTTP URI used for the health check | -| http-config.method | | HTTP method used for the health check | -| http-config.code | | HTTP response code expected for a successful health check | -| http-config.host-header | | HTTP host header used for the health check | -| https-config.uri | | HTTP URI used for the health check | -| https-config.method | | HTTP method used for the health check | -| https-config.code | | HTTP response code expected for a successful health check | -| https-config.host-header | | HTTP host header used for the health check | -| https-config.sni | | SNI used for SSL health checks | -| transient-check-delay | Default: `0.5s` | Time to wait between two consecutive health checks when a backend server is in a transient state (going UP or DOWN) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## TLS certificate management commands - -TLS certificate management commands. - - -### Create an SSL/TLS certificate - -Generate a new SSL/TLS certificate for a given Load Balancer. You can choose to create a Let's Encrypt certificate, or import a custom certificate. - -**Usage:** - -``` -scw lb certificate create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| name | Required
Default: `` | Name for the certificate | -| letsencrypt-common-name | | Main domain name of certificate (this domain must exist and resolve to your Load Balancer IP address) | -| letsencrypt-alternative-name.{index} | | Alternative domain names (all domain names must exist and resolve to your Load Balancer IP address) | -| custom-certificate-chain | | Full PEM-formatted certificate, consisting of the entire certificate chain including public key, private key, and (optionally) Certificate Authorities | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an SSL/TLS certificate - -Delete an SSL/TLS certificate, specified by its certificate ID. Deleting a certificate is irreversible and cannot be undone. - -**Usage:** - -``` -scw lb certificate delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| certificate-id | Required | Certificate ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an SSL/TLS certificate - -Get information for a particular SSL/TLS certificate, specified by its certificate ID. The response returns full details of the certificate, including its type, main domain name, and alternative domain names. - -**Usage:** - -``` -scw lb certificate get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| certificate-id | Required | Certificate ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all SSL/TLS certificates on a given Load Balancer - -List all the SSL/TLS certificates on a given Load Balancer. The response is an array of certificate objects, which are by default listed in ascending order of creation date. - -**Usage:** - -``` -scw lb certificate list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of certificates in the response | -| name | | Certificate name to filter for, only certificates of this name will be returned | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an SSL/TLS certificate - -Update the name of a particular SSL/TLS certificate, specified by its certificate ID. - -**Usage:** - -``` -scw lb certificate update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| certificate-id | Required | Certificate ID | -| name | Required | Certificate name | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Frontend management commands - -Frontend management commands. - - -### Create a frontend in a given Load Balancer - -Create a new frontend for a given Load Balancer, specifying its configuration including the port it should listen on and the backend to attach it to. - -**Usage:** - -``` -scw lb frontend create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name for the frontend | -| inbound-port | Required | Port the frontend should listen on | -| lb-id | Required | Load Balancer ID (ID of the Load Balancer to attach the frontend to) | -| backend-id | Required | Backend ID (ID of the backend the frontend should pass traffic to) | -| timeout-client | Default: `5m` | Maximum allowed inactivity time on the client side | -| ~~certificate-id~~ | Deprecated | Certificate ID, deprecated in favor of certificate_ids array | -| certificate-ids.{index} | | List of SSL/TLS certificate IDs to bind to the frontend | -| enable-http3 | | Defines whether to enable HTTP/3 protocol on the frontend | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a frontend - -Delete a given frontend, specified by its frontend ID. This action is irreversible and cannot be undone. - -**Usage:** - -``` -scw lb frontend delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | Required | ID of the frontend to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a frontend - -Get the full details of a given frontend, specified by its frontend ID. The response contains the frontend's full configuration parameters including the backend it is attached to, the port it listens on, and any certificates it has. - -**Usage:** - -``` -scw lb frontend get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | Required | Frontend ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List frontends of a given Load Balancer - -List all the frontends of a Load Balancer, specified by its Load Balancer ID. By default, results are returned in ascending order by the creation date of each frontend. The response is an array of frontend objects, containing full details of each one including the port they listen on and the backend they are attached to. - -**Usage:** - -``` -scw lb frontend list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| name | | Name of the frontend to filter for | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of frontends in the response | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a frontend - -Update a given frontend, specified by its frontend ID. You can update configuration parameters including its name and the port it listens on. Note that the request type is PUT and not PATCH. You must set all parameters. - -**Usage:** - -``` -scw lb frontend update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | Required | Frontend ID | -| name | Required | Frontend name | -| inbound-port | Required | Port the frontend should listen on | -| backend-id | Required | Backend ID (ID of the backend the frontend should pass traffic to) | -| timeout-client | Default: `5m` | Maximum allowed inactivity time on the client side | -| ~~certificate-id~~ | Deprecated | Certificate ID, deprecated in favor of certificate_ids array | -| certificate-ids.{index} | | List of SSL/TLS certificate IDs to bind to the frontend | -| enable-http3 | | Defines whether to enable HTTP/3 protocol on the frontend | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## IP management commands - -IP management commands. - - -### Create an IP address - -Create a new Load Balancer flexible IP address, in the specified Scaleway Project. This can be attached to new Load Balancers created in the future. - -**Usage:** - -``` -scw lb ip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| reverse | | Reverse DNS (domain name) for the IP address | -| is-ipv6 | | If true, creates a Flexible IP with an ipv6 address | -| tags.{index} | | List of tags for the IP | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an IP address - -Delete a Load Balancer flexible IP address. This action is irreversible, and cannot be undone. - -**Usage:** - -``` -scw lb ip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP address ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an IP address - -Retrieve the full details of a Load Balancer flexible IP address. - -**Usage:** - -``` -scw lb ip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP address ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List IP addresses - -List the Load Balancer flexible IP addresses held in the account (filtered by Organization ID or Project ID). It is also possible to search for a specific IP address. - -**Usage:** - -``` -scw lb ip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-address | | IP address to filter for | -| project-id | | Project ID to filter for, only Load Balancer IP addresses from this Project will be returned | -| ip-type | One of: `all`, `ipv4`, `ipv6` | IP type to filter for | -| tags.{index} | | Tag to filter for, only IPs with one or more matching tags will be returned | -| organization-id | | Organization ID to filter for, only Load Balancer IP addresses from this Organization will be returned | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an IP address - -Update the reverse DNS of a Load Balancer flexible IP address. - -**Usage:** - -``` -scw lb ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | IP address ID | -| reverse | | Reverse DNS (domain name) for the IP address | -| lb-id | | ID of the server on which to attach the flexible IP | -| tags.{index} | | List of tags for the IP | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Load balancer management commands - -Load balancer management commands. - - -### Create a Load Balancer - -Create a new Load Balancer. Note that the Load Balancer will be created without frontends or backends; these must be created separately via the dedicated endpoints. - -**Usage:** - -``` -scw lb lb create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Required
Default: `` | Name for the Load Balancer | -| description | | Description for the Load Balancer | -| ~~ip-id~~ | Deprecated | ID of an existing flexible IP address to attach to the Load Balancer | -| assign-flexible-ip | Default: `true` | Defines whether to automatically assign a flexible public IP to the Load Balancer. Default value is `true` (assign). | -| assign-flexible-ipv6 | Default: `false` | Defines whether to automatically assign a flexible public IPv6 to the Load Balancer. Default value is `false` (do not assign). | -| ip-ids.{index} | | List of IP IDs to attach to the Load Balancer | -| tags.{index} | | List of tags for the Load Balancer | -| type | Default: `LB-S`
One of: `LB-S`, `LB-GP-M`, `LB-GP-L` | Load Balancer commercial offer type. Use the Load Balancer types endpoint to retrieve a list of available offer types | -| ssl-compatibility-level | One of: `ssl_compatibility_level_unknown`, `ssl_compatibility_level_intermediate`, `ssl_compatibility_level_modern`, `ssl_compatibility_level_old` | Determines the minimal SSL version which needs to be supported on the client side, in an SSL/TLS offloading context. Intermediate is suitable for general-purpose servers with a variety of clients, recommended for almost all systems. Modern is suitable for services with clients that support TLS 1.3 and do not need backward compatibility. Old is compatible with a small number of very old clients and should be used only as a last resort | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a Load Balancer - -Delete an existing Load Balancer, specified by its Load Balancer ID. Deleting a Load Balancer is permanent, and cannot be undone. The Load Balancer's flexible IP address can either be deleted with the Load Balancer, or kept in your account for future use. - -**Usage:** - -``` -scw lb lb delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | ID of the Load Balancer to delete | -| release-ip | | Defines whether the Load Balancer's flexible IP should be deleted. Set to true to release the flexible IP, or false to keep it available in your account for future Load Balancers | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a Load Balancer - -Retrieve information about an existing Load Balancer, specified by its Load Balancer ID. Its full details, including name, status and IP address, are returned in the response object. - -**Usage:** - -``` -scw lb lb get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get usage statistics of a given Load Balancer - -Get usage statistics of a given Load Balancer. - -**Usage:** - -``` -scw lb lb get-stats [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| backend-id | | ID of the backend | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List Load Balancers - -List all Load Balancers in the specified zone, for a Scaleway Organization or Scaleway Project. By default, the Load Balancers returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw lb lb list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Load Balancer name to filter for | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of Load Balancers in the response | -| project-id | | Project ID to filter for, only Load Balancers from this Project will be returned | -| tags.{index} | | Filter by tag, only Load Balancers with one or more matching tags will be returned | -| organization-id | | Organization ID to filter for, only Load Balancers from this Organization will be returned | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Migrate a Load Balancer - -Migrate an existing Load Balancer from one commercial type to another. Allows you to scale your Load Balancer up or down in terms of bandwidth or multi-cloud provision. - -**Usage:** - -``` -scw lb lb migrate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| type | Required
One of: `LB-S`, `LB-GP-M`, `LB-GP-L` | Load Balancer type to migrate to (use the List all Load Balancer offer types endpoint to get a list of available offer types) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a Load Balancer - -Update the parameters of an existing Load Balancer, specified by its Load Balancer ID. Note that the request type is PUT and not PATCH. You must set all parameters. - -**Usage:** - -``` -scw lb lb update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| name | Required | Load Balancer name | -| description | Required | Load Balancer description | -| assign-flexible-ipv6 | | Automatically assign a flexible public IPv6 to the Load Balancer | -| ip-id | | The IP ID to attach to the Load Balancer | -| tags.{index} | | List of tags for the Load Balancer | -| ssl-compatibility-level | One of: `ssl_compatibility_level_unknown`, `ssl_compatibility_level_intermediate`, `ssl_compatibility_level_modern`, `ssl_compatibility_level_old` | Determines the minimal SSL version which needs to be supported on the client side, in an SSL/TLS offloading context. Intermediate is suitable for general-purpose servers with a variety of clients, recommended for almost all systems. Modern is suitable for services with clients that support TLS 1.3 and don't need backward compatibility. Old is compatible with a small number of very old clients and should be used only as a last resort | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for a load balancer to reach a stable state - -Wait for a load balancer to reach a stable state. This is similar to using --wait flag. - -**Usage:** - -``` -scw lb lb wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | ID of the load balancer you want to wait for. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `pl-waw-1`, `nl-ams-1` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `10m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a load balancer to reach a stable state -``` -scw lb lb wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Load balancer types management commands - -Load balancer types management commands. - - -### List all Load Balancer offer types - -List all the different commercial Load Balancer types. The response includes an array of offer types, each with a name, description, and information about its stock availability. - -**Usage:** - -``` -scw lb lb-types list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Private networks management commands - -Private networks management commands. - - -### Attach a Load Balancer to a Private Network - -Attach a specified Load Balancer to a specified Private Network, defining a static or DHCP configuration for the Load Balancer on the network. - -**Usage:** - -``` -scw lb private-network attach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| private-network-id | Required | Private Network ID | -| ipam-ids.{index} | | IPAM ID of a pre-reserved IP address to assign to the Load Balancer on this Private Network. In the future, it will be possible to specify multiple IPs in this field (IPv4 and IPv6), for now only one ID of an IPv4 address is expected. When null, a new private IP address is created for the Load Balancer on this Private Network. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach Load Balancer from Private Network - -Detach a specified Load Balancer from a specified Private Network. - -**Usage:** - -``` -scw lb private-network detach [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load balancer ID | -| private-network-id | Required | Set your instance private network id | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List Private Networks attached to a Load Balancer - -List the Private Networks attached to a given Load Balancer, specified by its Load Balancer ID. The response is an array of Private Network objects, giving information including the status, configuration, name and creation date of each Private Network. - -**Usage:** - -``` -scw lb private-network list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of Private Network objects in the response | -| lb-id | Required | Load Balancer ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Route rules management commands - -Route rules management commands. - - -### Create a route - -Create a new route on a given frontend. To configure a route, specify the backend to direct to if a certain condition is matched (based on the value of the SNI field or HTTP Host header). - -**Usage:** - -``` -scw lb route create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| frontend-id | | ID of the source frontend to create the route on | -| backend-id | | ID of the target backend for the route | -| match.sni | | Server Name Indication (SNI) value to match | -| match.host-header | | HTTP host header to match | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a route - -Delete an existing route, specified by its route ID. Deleting a route is permanent, and cannot be undone. - -**Usage:** - -``` -scw lb route delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a route - -Retrieve information about an existing route, specified by its route ID. Its full details, origin frontend, target backend and match condition, are returned in the response object. - -**Usage:** - -``` -scw lb route get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all routes - -List all routes for a given frontend. The response is an array of routes, each one with a specified backend to direct to if a certain condition is matched (based on the value of the SNI field or HTTP Host header). - -**Usage:** - -``` -scw lb route list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order of routes in the response | -| frontend-id | | Frontend ID to filter for, only Routes from this Frontend will be returned | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a route - -Update the configuration of an existing route, specified by its route ID. - -**Usage:** - -``` -scw lb route update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| backend-id | | ID of the target backend for the route | -| match.sni | | Server Name Indication (SNI) value to match | -| match.host-header | | HTTP host header to match | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Subscriber management commands - -Subscriber management commands. - - -### Create a subscriber - -Create a new subscriber, either with an email configuration or a webhook configuration, for a specified Scaleway Project. - -**Usage:** - -``` -scw lb subscriber create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | Subscriber name | -| email-config.email | | Email address to send alerts to | -| webhook-config.uri | | URI to receive POST requests | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a subscriber - -Delete an existing subscriber, specified by its subscriber ID. Deleting a subscriber is permanent, and cannot be undone. - -**Usage:** - -``` -scw lb subscriber delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| subscriber-id | Required | Subscriber ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a subscriber - -Retrieve information about an existing subscriber, specified by its subscriber ID. Its full details, including name and email/webhook configuration, are returned in the response object. - -**Usage:** - -``` -scw lb subscriber get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| subscriber-id | Required | Subscriber ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List all subscribers - -List all subscribers to Load Balancer alerts. By default, returns all subscribers to Load Balancer alerts for the Organization associated with the authentication token used for the request. - -**Usage:** - -``` -scw lb subscriber list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of subscribers in the response | -| name | Required | Subscriber name to search for | -| project-id | | Filter subscribers by Project ID | -| organization-id | | Filter subscribers by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Subscribe a subscriber to alerts for a given Load Balancer - -Subscribe an existing subscriber to alerts for a given Load Balancer. - -**Usage:** - -``` -scw lb subscriber subscribe [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| subscriber-id | Required | Subscriber ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Unsubscribe a subscriber from alerts for a given Load Balancer - -Unsubscribe a subscriber from alerts for a given Load Balancer. The subscriber is not deleted, and can be resubscribed in the future if necessary. - -**Usage:** - -``` -scw lb subscriber unsubscribe [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| lb-id | Required | Load Balancer ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a subscriber - -Update the parameters of a given subscriber (e.g. name, webhook configuration, email configuration), specified by its subscriber ID. - -**Usage:** - -``` -scw lb subscriber update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| subscriber-id | Required | Subscriber ID | -| name | Required | Subscriber name | -| email-config.email | | Email address to send alerts to | -| webhook-config.uri | | URI to receive POST requests | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/login.md b/docs/docs/login.md deleted file mode 100644 index e966fc1694..0000000000 --- a/docs/docs/login.md +++ /dev/null @@ -1,9 +0,0 @@ - -# Documentation for `scw login` -Start an interactive connection to scaleway to initialize the active profile of the config -A webpage will open while the CLI will wait for a response. -Once you connected to Scaleway, the profile should be configured. - - - - diff --git a/docs/docs/marketplace.md b/docs/docs/marketplace.md deleted file mode 100644 index 42d5f4bf1d..0000000000 --- a/docs/docs/marketplace.md +++ /dev/null @@ -1,192 +0,0 @@ - -# Documentation for `scw marketplace` -This API allows you to find available images for use when launching a Scaleway Instance. - -- [Marketplace category management commands](#marketplace-category-management-commands) - - [Get a specific category](#get-a-specific-category) - - [List existing image categories](#list-existing-image-categories) -- [Marketplace images management commands](#marketplace-images-management-commands) - - [Get a specific marketplace image](#get-a-specific-marketplace-image) - - [List marketplace images](#list-marketplace-images) -- [Marketplace local images management commands](#marketplace-local-images-management-commands) - - [Get a specific local image by ID](#get-a-specific-local-image-by-id) - - [List local images from a specific image or version](#list-local-images-from-a-specific-image-or-version) -- [Marketplace version management commands](#marketplace-version-management-commands) - - [Get a specific image version](#get-a-specific-image-version) - - [List versions of an Image](#list-versions-of-an-image) - - -## Marketplace category management commands - -Marketplace category management commands. - - -### Get a specific category - -Get information about a specific category of the marketplace catalog, specified by its `category_id` (UUID format). - -**Usage:** - -``` -scw marketplace category get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| category-id | Required | | - - - -### List existing image categories - -Get a list of all existing categories. The output can be paginated. - -**Usage:** - -``` -scw marketplace category list -``` - - - -## Marketplace images management commands - -Marketplace images management commands. - - -### Get a specific marketplace image - -Get detailed information about a marketplace image, specified by its `image_id` (UUID format). - -**Usage:** - -``` -scw marketplace image get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| label | Required | | - - - -### List marketplace images - -List all available images on the marketplace, their UUID, CPU architecture and description. - -**Usage:** - -``` -scw marketplace image list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | Ordering to use | -| arch | | Choose for which machine architecture to return images | -| category | | Choose the category of images to get | -| include-eol | | Choose to include end-of-life images | - - - -## Marketplace local images management commands - -Marketplace local images management commands. - - -### Get a specific local image by ID - -Get detailed information about a local image, including compatible commercial types, supported architecture, labels and the Availability Zone of the image, specified by its `local_image_id` (UUID format). - -**Usage:** - -``` -scw marketplace local-image get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| local-image-id | Required | | - - - -### List local images from a specific image or version - -List information about local images in a specific Availability Zone, specified by its `image_id` (UUID format), `version_id` (UUID format) or `image_label`. Only one of these three parameters may be set. - -**Usage:** - -``` -scw marketplace local-image list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `type_asc`, `type_desc`, `created_at_asc`, `created_at_desc` | Ordering to use | -| zone | | Filter local images available on this Availability Zone | -| image-id | | Filter by image id | -| version-id | | Filter by version id | -| image-label | | Filter by image label | -| type | One of: `unknown_type`, `instance_local`, `instance_sbs` | Filter by type | - - - -## Marketplace version management commands - -Marketplace version management commands. - - -### Get a specific image version - -Get information such as the name, creation date, last update and published date for an image version specified by its `version_id` (UUID format). - -**Usage:** - -``` -scw marketplace version get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| version-id | Required | | - - - -### List versions of an Image - -Get a list of all available version of an image, specified by its `image_id` (UUID format). - -**Usage:** - -``` -scw marketplace version list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | | | -| order-by | One of: `created_at_asc`, `created_at_desc` | | - - - diff --git a/docs/docs/mnq.md b/docs/docs/mnq.md deleted file mode 100644 index 681d7346ba..0000000000 --- a/docs/docs/mnq.md +++ /dev/null @@ -1,607 +0,0 @@ - -# Documentation for `scw mnq` -These APIs allow you to manage your Messaging and Queuing NATS, SQS and SNS services. - -- [MnQ NATS commands](#mnq-nats-commands) - - [Create a NATS account](#create-a-nats-account) - - [Create a new context for natscli](#create-a-new-context-for-natscli) - - [Create NATS credentials](#create-nats-credentials) - - [Delete a NATS account](#delete-a-nats-account) - - [Delete NATS credentials](#delete-nats-credentials) - - [Get a NATS account](#get-a-nats-account) - - [Get NATS credentials](#get-nats-credentials) - - [List NATS accounts](#list-nats-accounts) - - [List NATS credentials](#list-nats-credentials) - - [Update the name of a NATS account](#update-the-name-of-a-nats-account) -- [MnQ SNS commands](#mnq-sns-commands) - - [Activate SNS](#activate-sns) - - [Create SNS credentials](#create-sns-credentials) - - [Deactivate SNS](#deactivate-sns) - - [Delete SNS credentials](#delete-sns-credentials) - - [Get SNS credentials](#get-sns-credentials) - - [Get SNS info](#get-sns-info) - - [List SNS credentials](#list-sns-credentials) - - [Update SNS credentials](#update-sns-credentials) -- [MnQ SQS commands](#mnq-sqs-commands) - - [Activate SQS](#activate-sqs) - - [Create SQS credentials](#create-sqs-credentials) - - [Deactivate SQS](#deactivate-sqs) - - [Delete SQS credentials](#delete-sqs-credentials) - - [Get SQS credentials](#get-sqs-credentials) - - [Get SQS info](#get-sqs-info) - - [List SQS credentials](#list-sqs-credentials) - - [Update SQS credentials](#update-sqs-credentials) - - -## MnQ NATS commands - -MnQ NATS commands. - - -### Create a NATS account - -Create a NATS account associated with a Project. - -**Usage:** - -``` -scw mnq nats create-account [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Default: `` | NATS account name | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Create a new context for natscli - -This command help you configure your nats cli -Contexts should are stored in $HOME/.config/nats/context -Credentials and context file are saved in your nats context folder with 0600 permissions - -**Usage:** - -``` -scw mnq nats create-context [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | | ID of the NATS account | -| name | | Name of the saved context, defaults to account name | -| credentials-name | | Name of the created credentials | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Create a context in your nats server -``` -scw mnq nats create-context credentials-name= region=fr-par -``` - - - - -### Create NATS credentials - -Create a set of credentials for a NATS account, specified by its NATS account ID. - -**Usage:** - -``` -scw mnq nats create-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | Required | NATS account containing the credentials | -| name | Default: `` | Name of the credentials | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Delete a NATS account - -Delete a NATS account, specified by its NATS account ID. Note that deleting a NATS account is irreversible, and any credentials, streams, consumer and stored messages belonging to this NATS account will also be deleted. - -**Usage:** - -``` -scw mnq nats delete-account [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | Required | ID of the NATS account to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Delete NATS credentials - -Delete a set of credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can no longer be used to access the NATS account, and active connections using this credentials will be closed. - -**Usage:** - -``` -scw mnq nats delete-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-credentials-id | Required | ID of the credentials to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get a NATS account - -Retrieve information about an existing NATS account identified by its NATS account ID. Its full details, including name and endpoint, are returned in the response. - -**Usage:** - -``` -scw mnq nats get-account [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | Required | ID of the NATS account to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get NATS credentials - -Retrieve an existing set of credentials, identified by the `nats_credentials_id`. The credentials themselves are NOT returned, only their metadata (NATS account ID, credentials name, etc), are returned in the response. - -**Usage:** - -``` -scw mnq nats get-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-credentials-id | Required | ID of the credentials to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### List NATS accounts - -List all NATS accounts in the specified region, for a Scaleway Organization or Project. By default, the NATS accounts returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw mnq nats list-accounts [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Include only NATS accounts in this Project | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - - -### List NATS credentials - -List existing credentials in the specified NATS account. The response contains only the metadata for the credentials, not the credentials themselves, which are only returned after a **Create Credentials** call. - -**Usage:** - -``` -scw mnq nats list-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | Required | Include only credentials for this NATS account | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update the name of a NATS account - -Update the name of a NATS account, specified by its NATS account ID. - -**Usage:** - -``` -scw mnq nats update-account [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| nats-account-id | Required | ID of the NATS account to update | -| name | | NATS account name | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -## MnQ SNS commands - -MnQ SNS commands. - - -### Activate SNS - -Activate SNS for the specified Project ID. SNS must be activated before any usage. Activating SNS does not trigger any billing, and you can deactivate at any time. - -**Usage:** - -``` -scw mnq sns activate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Create SNS credentials - -Create a set of credentials for SNS, specified by a Project ID. Credentials give the bearer access to topics, and the level of permissions can be defined granularly. - -**Usage:** - -``` -scw mnq sns create-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name of the credentials | -| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (publish to SNS topics) | -| permissions.can-receive | | Defines whether the credentials bearer can receive messages from the service (configure subscriptions) | -| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SNS topics or subscriptions | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Deactivate SNS - -Deactivate SNS for the specified Project ID.You must delete all topics and credentials before this call or you need to set the force_delete parameter. - -**Usage:** - -``` -scw mnq sns deactivate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Delete SNS credentials - -Delete a set of SNS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SNS. - -**Usage:** - -``` -scw mnq sns delete-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sns-credentials-id | Required | ID of the credentials to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get SNS credentials - -Retrieve an existing set of credentials, identified by the `credentials_id`. The credentials themselves, as well as their metadata (name, project ID etc), are returned in the response. - -**Usage:** - -``` -scw mnq sns get-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sns-credentials-id | Required | ID of the SNS credentials to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get SNS info - -Retrieve the SNS information of the specified Project ID. Informations include the activation status and the SNS API endpoint URL. - -**Usage:** - -``` -scw mnq sns get-info [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### List SNS credentials - -List existing SNS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. - -**Usage:** - -``` -scw mnq sns list-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Include only SNS credentials in this Project | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update SNS credentials - -Update a set of SNS credentials. You can update the credentials' name, or their permissions. - -**Usage:** - -``` -scw mnq sns update-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sns-credentials-id | Required | ID of the SNS credentials to update | -| name | | Name of the credentials | -| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (publish to SNS topics) | -| permissions.can-receive | | Defines whether the credentials bearer can receive messages from the service (configure subscriptions) | -| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SNS topics or subscriptions | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -## MnQ SQS commands - -MnQ SQS commands. - - -### Activate SQS - -Activate SQS for the specified Project ID. SQS must be activated before any usage such as creating credentials and queues. Activating SQS does not trigger any billing, and you can deactivate at any time. - -**Usage:** - -``` -scw mnq sqs activate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Create SQS credentials - -Create a set of credentials for SQS, specified by a Project ID. Credentials give the bearer access to queues, and the level of permissions can be defined granularly. - -**Usage:** - -``` -scw mnq sqs create-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name of the credentials | -| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (send messages to SQS queues) | -| permissions.can-receive | | Defines whether the credentials bearer can receive messages from SQS queues | -| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SQS queues | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Deactivate SQS - -Deactivate SQS for the specified Project ID. You must delete all queues and credentials before this call or you need to set the force_delete parameter. - -**Usage:** - -``` -scw mnq sqs deactivate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Delete SQS credentials - -Delete a set of SQS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SQS. - -**Usage:** - -``` -scw mnq sqs delete-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sqs-credentials-id | Required | ID of the credentials to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get SQS credentials - -Retrieve an existing set of credentials, identified by the `credentials_id`. The credentials themselves, as well as their metadata (name, project ID etc), are returned in the response. - -**Usage:** - -``` -scw mnq sqs get-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sqs-credentials-id | Required | ID of the SQS credentials to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Get SQS info - -Retrieve the SQS information of the specified Project ID. Informations include the activation status and the SQS API endpoint URL. - -**Usage:** - -``` -scw mnq sqs get-info [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### List SQS credentials - -List existing SQS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. - -**Usage:** - -``` -scw mnq sqs list-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Include only SQS credentials in this Project | -| order-by | One of: `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc`, `name_asc`, `name_desc` | Order in which to return results | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update SQS credentials - -Update a set of SQS credentials. You can update the credentials' name, or their permissions. - -**Usage:** - -``` -scw mnq sqs update-credentials [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| sqs-credentials-id | Required | ID of the SQS credentials to update | -| name | | Name of the credentials | -| permissions.can-publish | | Defines whether the credentials bearer can publish messages to the service (send messages to SQS queues) | -| permissions.can-receive | | Defines whether the credentials bearer can receive messages from SQS queues | -| permissions.can-manage | | Defines whether the credentials bearer can manage the associated SQS queues | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/object.md b/docs/docs/object.md deleted file mode 100644 index 20d9ae96b7..0000000000 --- a/docs/docs/object.md +++ /dev/null @@ -1,213 +0,0 @@ - -# Documentation for `scw object` -Object-storage utils - -- [Manage S3 buckets](#manage-s3-buckets) - - [Create an S3 bucket](#create-an-s3-bucket) - - [Delete an S3 bucket](#delete-an-s3-bucket) - - [Get information about an S3 bucket](#get-information-about-an-s3-bucket) - - [List S3 buckets](#list-s3-buckets) - - [Update an S3 bucket](#update-an-s3-bucket) -- [Manage configuration files for popular S3 tools](#manage-configuration-files-for-popular-s3-tools) - - [Generate a S3 tool configuration file](#generate-a-s3-tool-configuration-file) - - [Install a S3 tool configuration file to its default location](#install-a-s3-tool-configuration-file-to-its-default-location) - - -## Manage S3 buckets - -Manage S3 buckets creation, deletion and updates to properties like tags, ACL and versioning. - - -### Create an S3 bucket - -Create an Object Storage Bucket with the S3 protocol. The namespace is shared between all S3 users, so its name must be unique. - -**Usage:** - -``` -scw object bucket create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | The unique name of the bucket | -| tags.{index} | | List of tags to set on the bucket | -| enable-versioning | Default: `false` | Whether or not objects in the bucket should have multiple versions | -| acl | Default: `private` | The permissions given to users (grantees) to read or write objects | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete an S3 bucket - -Delete an S3 bucket with all its content. - -**Usage:** - -``` -scw object bucket delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | The unique name of the bucket | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get information about an S3 bucket - -Get the properties of an S3 bucket like tags, endpoint, access control, versioning, size, etc. - -**Usage:** - -``` -scw object bucket get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | The unique name of the bucket | -| with-size | Default: `false` | Whether to return the total size of the bucket and the number of objects. This operation can take long for large buckets. | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List S3 buckets - -List all existing S3 buckets in the specified region - -**Usage:** - -``` -scw object bucket list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update an S3 bucket - -Update an S3 bucket's properties like tags, access control and versioning. - -**Usage:** - -``` -scw object bucket update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | The unique name of the bucket | -| tags.{index} | | List of new tags to set on the bucket | -| enable-versioning | Default: `false` | Whether or not objects in the bucket should have multiple versions | -| acl | Default: `private` | The permissions given to users (grantees) to read or write objects | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Manage configuration files for popular S3 tools - -Configuration generation for S3 tools. - - -### Generate a S3 tool configuration file - -Generate a S3 tool configuration file. - -**Usage:** - -``` -scw object config get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for | -| name | Default: `scaleway` | Name of the s3 remote you want to generate | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Generate a s3cmd config file for Paris region -``` -scw object config get region=fr-par type=s3cmd -``` - -Generate a rclone config file for default region -``` -scw object config get type=rclone -``` - -Generate a mc (minio) config file for default region -``` -scw object config get type=mc -``` - - - - -### Install a S3 tool configuration file to its default location - -Install a S3 tool configuration file to its default location. - -**Usage:** - -``` -scw object config install [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for | -| name | Default: `scaleway` | Name of the s3 remote you want to generate | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Install a s3cmd config file for Paris region -``` -scw object config install region=fr-par type=s3cmd -``` - -Install a rclone config file for default region -``` -scw object config install type=rclone -``` - -Install a mc (minio) config file for default region -``` -scw object config install type=mc -``` - - - - diff --git a/docs/docs/rdb.md b/docs/docs/rdb.md deleted file mode 100644 index 58f62b4c6e..0000000000 --- a/docs/docs/rdb.md +++ /dev/null @@ -1,1674 +0,0 @@ - -# Documentation for `scw rdb` -This API allows you to manage your Managed Databases for PostgreSQL and MySQL. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) - - [Add an ACL rule to a Database Instance](#add-an-acl-rule-to-a-database-instance) - - [Delete ACL rules of a Database Instance](#delete-acl-rules-of-a-database-instance) - - [Edit a database instance's ACL](#edit-a-database-instance's-acl) - - [List ACL rules of a Database Instance](#list-acl-rules-of-a-database-instance) - - [Set ACL rules for a Database Instance](#set-acl-rules-for-a-database-instance) -- [Backup management commands](#backup-management-commands) - - [Create a database backup](#create-a-database-backup) - - [Delete a database backup](#delete-a-database-backup) - - [Download a backup locally](#download-a-backup-locally) - - [Export a database backup](#export-a-database-backup) - - [Get a database backup](#get-a-database-backup) - - [List database backups](#list-database-backups) - - [Restore a database backup](#restore-a-database-backup) - - [Update a database backup](#update-a-database-backup) - - [Wait for a backup to reach a stable state](#wait-for-a-backup-to-reach-a-stable-state) -- [Database management commands](#database-management-commands) - - [Create a database in a Database Instance](#create-a-database-in-a-database-instance) - - [Delete a database in a Database Instance](#delete-a-database-in-a-database-instance) - - [Gets the URL to connect to the Database](#gets-the-url-to-connect-to-the-database) - - [List databases in a Database Instance](#list-databases-in-a-database-instance) -- [Endpoint management](#endpoint-management) - - [Create a new Database Instance endpoint](#create-a-new-database-instance-endpoint) - - [Delete a Database Instance endpoint](#delete-a-database-instance-endpoint) - - [Get a Database Instance endpoint](#get-a-database-instance-endpoint) - - [Lists a Database Instance's endpoints](#lists-a-database-instance's-endpoints) - - [Migrate an existing instance endpoint to another instance](#migrate-an-existing-instance-endpoint-to-another-instance) -- [Database engines commands](#database-engines-commands) - - [List available database engines](#list-available-database-engines) - - [List available settings from an engine.](#list-available-settings-from-an-engine.) -- [Instance management commands](#instance-management-commands) - - [Clone a Database Instance](#clone-a-database-instance) - - [Connect to an instance using locally installed CLI](#connect-to-an-instance-using-locally-installed-cli) - - [Create a Database Instance](#create-a-database-instance) - - [Delete a Database Instance](#delete-a-database-instance) - - [Get a Database Instance](#get-a-database-instance) - - [Get the TLS certificate of a Database Instance](#get-the-tls-certificate-of-a-database-instance) - - [Get Database Instance metrics](#get-database-instance-metrics) - - [List Database Instances](#list-database-instances) - - [Renew the TLS certificate of a Database Instance](#renew-the-tls-certificate-of-a-database-instance) - - [Restart Database Instance](#restart-database-instance) - - [Update an instance](#update-an-instance) - - [Upgrade a Database Instance](#upgrade-a-database-instance) - - [Wait for an instance to reach a stable state](#wait-for-an-instance-to-reach-a-stable-state) -- [Instance logs management commands](#instance-logs-management-commands) - - [Get given logs of a Database Instance](#get-given-logs-of-a-database-instance) - - [List available logs of a Database Instance](#list-available-logs-of-a-database-instance) - - [List remote Database Instance logs details](#list-remote-database-instance-logs-details) - - [Prepare logs of a Database Instance](#prepare-logs-of-a-database-instance) - - [Purge remote Database Instance logs](#purge-remote-database-instance-logs) -- [Node types management commands](#node-types-management-commands) - - [List available node types](#list-available-node-types) -- [User privileges management commands](#user-privileges-management-commands) - - [List user privileges for a database](#list-user-privileges-for-a-database) - - [Set user privileges for a database](#set-user-privileges-for-a-database) -- [Read replica management](#read-replica-management) - - [Create a Read Replica](#create-a-read-replica) - - [Create an endpoint for a Read Replica](#create-an-endpoint-for-a-read-replica) - - [Delete a Read Replica](#delete-a-read-replica) - - [Get a Read Replica](#get-a-read-replica) - - [Resync a Read Replica](#resync-a-read-replica) -- [Setting management](#setting-management) - - [Add Database Instance advanced settings](#add-database-instance-advanced-settings) - - [Delete Database Instance advanced settings](#delete-database-instance-advanced-settings) - - [Set Database Instance advanced settings](#set-database-instance-advanced-settings) -- [Block snapshot management](#block-snapshot-management) - - [Create a Database Instance snapshot](#create-a-database-instance-snapshot) - - [Delete a Database Instance snapshot](#delete-a-database-instance-snapshot) - - [Get a Database Instance snapshot](#get-a-database-instance-snapshot) - - [List snapshots](#list-snapshots) - - [Create a new Database Instance from a snapshot](#create-a-new-database-instance-from-a-snapshot) - - [Update a Database Instance snapshot](#update-a-database-instance-snapshot) -- [User management commands](#user-management-commands) - - [Create a user for a Database Instance](#create-a-user-for-a-database-instance) - - [Delete a user on a Database Instance](#delete-a-user-on-a-database-instance) - - [Gets the URL to connect to the Database](#gets-the-url-to-connect-to-the-database) - - [List users of a Database Instance](#list-users-of-a-database-instance) - - [Update a user on a Database Instance](#update-a-user-on-a-database-instance) - - -## Access Control List (ACL) management commands - -Network Access Control Lists allow you to control incoming network traffic by setting up ACL rules. - - -### Add an ACL rule to a Database Instance - -Add an additional ACL rule to a Database Instance. - -**Usage:** - -``` -scw rdb acl add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-rule-ips | Required | IP addresses defined in the ACL rules of the Database Instance | -| instance-id | Required | ID of the Database Instance | -| description | | Description of the ACL rule. Indexes are not yet supported so the description will be applied to all the rules of the command. | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete ACL rules of a Database Instance - -Delete one or more ACL rules of a Database Instance. - -**Usage:** - -``` -scw rdb acl delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-rule-ips | Required | IP addresses defined in the ACL rules of the Database Instance | -| instance-id | Required | ID of the Database Instance | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Edit a database instance's ACL - -This command starts your default editor to edit a marshaled version of your resource -Default editor will be taken from $VISUAL, then $EDITOR or an editor based on your system - -**Usage:** - -``` -scw rdb acl edit [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | ID of the Database Instance | -| mode | Default: `yaml`
One of: `yaml`, `json` | marshaling used when editing data | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List ACL rules of a Database Instance - -List the ACL rules for a given Database Instance. The response is an array of ACL objects, each one representing an ACL that denies, allows or redirects traffic based on certain conditions. - -**Usage:** - -``` -scw rdb acl list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set ACL rules for a Database Instance - -Replace all the ACL rules of a Database Instance. - -**Usage:** - -``` -scw rdb acl set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-rule-ips | | IP addresses defined in the ACL rules of the Database Instance | -| instance-id | Required | ID of the Database Instance | -| descriptions | | Descriptions of the ACL rules | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Backup management commands - -A database backup is a dated export of a Database Instance stored on an offsite backend located in a different region than your database, by default. Once a backup is created, it can be used to restore the database. Each logical database in a Database Instance is backed up and can be restored separately. - - -### Create a database backup - -Create a new backup. You must set the `instance_id`, `database_name`, `name` and `expires_at` parameters. - -**Usage:** - -``` -scw rdb backup create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | | UUID of the Database Instance | -| database-name | | Name of the database you want to back up | -| name | Default: `` | Name of the backup | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a database backup - -Delete a backup, specified by its database backup ID and region. Deleting a backup is permanent, and cannot be undone. - -**Usage:** - -``` -scw rdb backup delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-backup-id | Required | UUID of the database backup to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Download a backup locally - -Download a backup locally. - -**Usage:** - -``` -scw rdb backup download [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-id | Required | ID of the backup you want to download. | -| output | | Filename to write to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Download a backup -``` -scw rdb backup download 11111111-1111-1111-1111-111111111111 -``` - - - - -### Export a database backup - -Export a backup, specified by the `database_backup_id` and the `region` parameters. The download URL is returned in the response. - -**Usage:** - -``` -scw rdb backup export [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-backup-id | Required | UUID of the database backup you want to export | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a database backup - -Retrieve information about a given backup, specified by its database backup ID and region. Full details about the backup, like size, URL and expiration date, are returned in the response. - -**Usage:** - -``` -scw rdb backup get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-backup-id | Required | UUID of the database backup | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List database backups - -List all backups in a specified region, for a given Scaleway Organization or Scaleway Project. By default, the backups listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. - -**Usage:** - -``` -scw rdb backup list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the database backups | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `status_asc`, `status_desc` | Criteria to use when ordering database backups listing | -| instance-id | | UUID of the Database Instance | -| project-id | | Project ID of the Project the database backups belong to | -| organization-id | | Organization ID of the Organization the database backups belong to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Restore a database backup - -Launch the process of restoring database backup. You must specify the `instance_id` of the Database Instance of destination, where the backup will be restored. Note that large database backups can take up to several hours to restore. - -**Usage:** - -``` -scw rdb backup restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-name | | Defines the destination database to restore into a specified database (the default destination is set to the origin database of the backup) | -| database-backup-id | Required | Backup of a logical database | -| instance-id | Required | Defines the Database Instance where the backup has to be restored | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update a database backup - -Update the parameters of a backup, including name and expiration date. - -**Usage:** - -``` -scw rdb backup update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-backup-id | Required | UUID of the database backup to update | -| name | | Name of the Database Backup | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Wait for a backup to reach a stable state - -Wait for a backup to reach a stable state. This is similar to using --wait flag. - -**Usage:** - -``` -scw rdb backup wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-id | Required | ID of the backup you want to wait for. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | -| timeout | Default: `20m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a backup to reach a stable state -``` -scw rdb backup wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Database management commands - -Databases can be used to store and manage sets of structured information, or data. The interaction between the user and a database is done using a Database Engine, which provides a structured query language to add, modify or delete information from the database. - - -### Create a database in a Database Instance - -Create a new database. You must define the `name` parameter in the request. - -**Usage:** - -``` -scw rdb database create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where to create the database | -| name | | Name of the database | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a database in a Database Instance - -Delete a given database on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the database you want to delete. - -**Usage:** - -``` -scw rdb database delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where to delete the database | -| name | Required | Name of the database to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Gets the URL to connect to the Database - -Provides the URL to connect to a Database on an Instance as the given user - -**Usage:** - -``` -scw rdb database get-url [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | ID of the Database Instance | -| user | | User of the Database | -| db | | Name of the Database to connect to | - - - -### List databases in a Database Instance - -List all databases of a given Database Instance. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `name`, `managed` and `owner`. - -**Usage:** - -``` -scw rdb database list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the database | -| managed | | Defines whether or not the database is managed | -| owner | | User that owns this database | -| order-by | One of: `name_asc`, `name_desc`, `size_asc`, `size_desc` | Criteria to use when ordering database listing | -| instance-id | Required | UUID of the Database Instance to list the databases of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Endpoint management - -A point of connection to a Database Instance. The endpoint is associated with an IPv4 address and a port. It contains the information about whether the endpoint is read-write or not. The endpoints always point to the main node of a Database Instance. - -All endpoints have TLS enabled. You can use TLS to make your data and your passwords unreadable in transit to anyone but you. - -For added security, you can set up ACL rules to restrict access to your endpoint to a set of trusted hosts or networks of your choice. - -Load Balancers are used to forward traffic to the right node based on the node state (active/hot standby). The Load Balancers' configuration is set to cut off inactive connections if no TCP traffic is sent within a 6-hour timeframe. We recommend using connection pooling on the application side to renew database connections regularly. - - -### Create a new Database Instance endpoint - -Create a new endpoint for a Database Instance. You can add `load_balancer` and `private_network` specifications to the body of the request. - -**Usage:** - -``` -scw rdb endpoint create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to which you want to add an endpoint | -| private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | -| private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| private-network.enable-ipam | Default: `true` | Will configure your Private Network endpoint with Scaleway IPAM service if true | -| load-balancer | Default: `true` | Will configure a public Load-Balancer endpoint | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance endpoint - -Delete the endpoint of a Database Instance. You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. - -**Usage:** - -``` -scw rdb endpoint delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance from which you want to delete an endpoint | -| endpoint-id | Required | UUID of the endpoint you want to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance endpoint - -Retrieve information about a Database Instance endpoint. Full details about the endpoint, like `ip`, `port`, `private_network` and `load_balancer` specifications are returned in the response. - -**Usage:** - -``` -scw rdb endpoint get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to get | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Lists a Database Instance's endpoints - -Lists all public and private endpoints of a Database Instance - -**Usage:** - -``` -scw rdb endpoint list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | ID of the Database Instance | - - - -### Migrate an existing instance endpoint to another instance - -Migrate an existing instance endpoint to another instance. - -**Usage:** - -``` -scw rdb endpoint migrate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to migrate | -| instance-id | Required | UUID of the instance you want to attach the endpoint to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Database engines commands - -A database engine is the software component that stores and retrieves your data from a database. Currently PostgreSQL 11, 12, 13 and 14 are available. MySQL is available in version 8. - - -### List available database engines - -List the PostgreSQL and MySQL database engines available at Scaleway. - -**Usage:** - -``` -scw rdb engine list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the database engine | -| version | | Version of the database engine | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### List available settings from an engine. - -List available settings from an engine. - -**Usage:** - -``` -scw rdb engine settings [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required | The name of your engine where you want list the available settings. | -| version | Required | The version of the engine. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List Engine Settings -``` -scw rdb engine settings name=MySQL version=8 -``` - - - - -## Instance management commands - -A Database Instance is made up of one or multiple dedicated compute nodes running a single database engine. Two node settings are available: **High-Availability (HA)**, with a main node and one replica, and **standalone** with a main node. The HA standby node is linked to the main node, using synchronous replication. Synchronous replication offers the ability to confirm that all changes intended by a transaction have been transferred and applied to the synchronous replica node, providing durability to the data. - -**Note**: HA standby nodes are not accessible to users unless the main node becomes unavailable and the standby takes over. If you wish to run queries on a read-only node, you can use [Read Replicas](#path-read-replicas-create-a-read-replica) - -Read Replicas can be used for certain read-only workflows such as Business Intelligence, or for a read-only scaling of your application. Read Replicas use asynchronous replication to replicate data from the main node. - - -### Clone a Database Instance - -Clone a given Database Instance, specified by the `region` and `instance_id` parameters. The clone feature allows you to create a new Database Instance from an existing one. The clone includes all existing databases, users and permissions. You can create a clone on a Database Instance bigger than your current one. - -**Usage:** - -``` -scw rdb instance clone [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to clone | -| name | | Name of the Database Instance clone | -| node-type | | Node type of the clone | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Connect to an instance using locally installed CLI - -Connect to an instance using locally installed CLI such as psql or mysql. - -**Usage:** - -``` -scw rdb instance connect [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| private-network | Default: `false` | Connect by the private network endpoint attached. | -| instance-id | Required | UUID of the instance | -| username | Required | Name of the user to connect with to the database | -| database | Default: `rdb` | Name of the database | -| cli-db | | Command line tool to use, default to psql/mysql | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Create a Database Instance - -Create a new Database Instance. You must set the `engine`, `user_name`, `password` and `node_type` parameters. Optionally, you can specify the volume type and size. - -**Usage:** - -``` -scw rdb instance create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name of the Database Instance | -| engine | Required | Database engine of the Database Instance (PostgreSQL, MySQL, ...) | -| user-name | Required | Username created when the Database Instance is created | -| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | -| password | | Password of the user | -| node-type | Required
Default: `DB-DEV-S` | Type of node to use for the Database Instance | -| is-ha-cluster | | Defines whether or not High-Availability is enabled | -| disable-backup | | Defines whether or not backups are disabled | -| tags.{index} | | Tags to apply to the Database Instance | -| init-settings.{index}.name | | | -| init-settings.{index}.value | | | -| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Type of volume where data is stored (lssd, bssd, ...) | -| volume-size | | Volume size when volume_type is not lssd | -| init-endpoints.{index}.load-balancer | Default: `false` | Will configure a load-balancer endpoint along with your private network endpoint if true | -| init-endpoints.{index}.private-network.enable-ipam | | Will configure your Private Network endpoint with Scaleway IPAM service if true | -| init-endpoints.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Database Instance | -| init-endpoints.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| backup-same-region | | Defines whether to or not to store logical backups in the same region as the Database Instance | -| encryption.enabled | | | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance - -Delete a given Database Instance, specified by the `region` and `instance_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. - -**Usage:** - -``` -scw rdb instance delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance - -Retrieve information about a given Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. - -**Usage:** - -``` -scw rdb instance get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get the TLS certificate of a Database Instance - -Retrieve information about the TLS certificate of a given Database Instance. Details like name and content are returned in the response. - -**Usage:** - -``` -scw rdb instance get-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get Database Instance metrics - -Retrieve the time series metrics of a given Database Instance. You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. - -**Usage:** - -``` -scw rdb instance get-metrics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| start-date | | Start date to gather metrics from | -| end-date | | End date to gather metrics from | -| metric-name | | Name of the metric to gather | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List Database Instances - -List all Database Instances in the specified region, for a given Scaleway Organization or Scaleway Project. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. - -**Usage:** - -``` -scw rdb instance list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tags.{index} | | List Database Instances that have a given tag | -| name | | Lists Database Instances that match a name pattern | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc`, `status_desc` | Criteria to use when ordering Database Instance listings | -| project-id | | Project ID to list the Database Instance of | -| organization-id | | Please use project_id instead | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Renew the TLS certificate of a Database Instance - -Renew a TLS for a Database Instance. Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. - -**Usage:** - -``` -scw rdb instance renew-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Restart Database Instance - -Restart a given Database Instance, specified by the `region` and `instance_id` parameters. The status of the Database Instance returned in the response. - -**Usage:** - -``` -scw rdb instance restart [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to restart | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update an instance - -Update an instance. - -**Usage:** - -``` -scw rdb instance update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-schedule-frequency | | In hours | -| backup-schedule-retention | | In days | -| is-backup-schedule-disabled | | Whether or not the backup schedule is disabled | -| name | | Name of the instance | -| instance-id | Required | UUID of the instance to update | -| tags.{index} | | Tags of a given instance | -| logs-policy.max-age-retention | | Max age (in day) of remote logs to keep on the database instance | -| logs-policy.total-disk-retention | | Max disk size of remote logs to keep on the database instance | -| backup-same-region | | Store logical backups in the same region as the database instance | -| settings.{index}.name | | Setting name of a given instance | -| settings.{index}.value | | Setting value of a given instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Update instance name -``` -scw rdb instance update 11111111-1111-1111-1111-111111111111 name=foo --wait -``` - -Update instance tags -``` -scw rdb instance update 11111111-1111-1111-1111-111111111111 tags.0=a --wait -``` - -Set a timezone -``` -scw rdb instance update 11111111-1111-1111-1111-111111111111 settings.0.name=timezone settings.0.value=UTC --wait -``` - - - - -### Upgrade a Database Instance - -Upgrade your current Database Instance specifications like node type, high availability, volume, or the database engine version. Note that upon upgrade the `enable_ha` parameter can only be set to `true`. - -**Usage:** - -``` -scw rdb instance upgrade [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to upgrade | -| node-type | | Node type of the Database Instance you want to upgrade to | -| enable-ha | | Defines whether or not high availability should be enabled on the Database Instance | -| volume-size | | Increase your block storage volume size | -| volume-type | One of: `lssd`, `bssd`, `sbs_5k`, `sbs_15k` | Change your Database Instance storage type | -| upgradable-version-id | | Update your database engine to a newer version | -| major-upgrade-workflow.upgradable-version-id | | Update your database engine to a newer version | -| major-upgrade-workflow.with-endpoints | | Include endpoint during the migration | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Wait for an instance to reach a stable state - -Wait for an instance to reach a stable state. This is similar to using --wait flag. - -**Usage:** - -``` -scw rdb instance wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | ID of the instance you want to wait for. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | -| timeout | Default: `20m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for an instance to reach a stable state -``` -scw rdb instance wait 11111111-1111-1111-1111-111111111111 -``` - - - - -## Instance logs management commands - -Instance logs management commands. - - -### Get given logs of a Database Instance - -Retrieve information about the logs of a Database Instance. Specify the `instance_log_id` and `region` in your request to get information such as `download_url`, `status`, `expires_at` and `created_at` about your logs in the response. - -**Usage:** - -``` -scw rdb log get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-log-id | Required | UUID of the instance_log you want | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List available logs of a Database Instance - -List the available logs of a Database Instance. By default, the logs returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw rdb log list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| order-by | One of: `created_at_asc`, `created_at_desc` | Criteria to use when ordering Database Instance logs listing | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List remote Database Instance logs details - -List remote log details. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw rdb log list-details [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Prepare logs of a Database Instance - -Prepare your Database Instance logs. You can define the `start_date` and `end_date` parameters for your query. The download URL is returned in the response. Logs are recorded from 00h00 to 23h59 and then aggregated in a `.log` file once a day. Therefore, even if you specify a timeframe from which you want to get the logs, you will receive logs from the full 24 hours. - -**Usage:** - -``` -scw rdb log prepare [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| start-date | | Start datetime of your log. (RFC 3339 format) | -| end-date | | End datetime of your log. (RFC 3339 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Purge remote Database Instance logs - -Purge a given remote log from a Database Instance. You can specify the `log_name` of the log you wish to clean from your Database Instance. - -**Usage:** - -``` -scw rdb log purge [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want logs of | -| log-name | | Given log name to purge | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Node types management commands - -Two node type ranges are available: - -* **General Purpose:** production-grade nodes designed for scalable database infrastructures. -* **Development:** sandbox environments and reliable performance for development and testing purposes. - - -### List available node types - -List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw rdb node-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| include-disabled-types | | Defines whether or not to include disabled types | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -## User privileges management commands - -Privileges are permissions that can be granted to database users. You can manage user permissions either via the console, the Scaleway APIs or SQL. Managed Database for PostgreSQL and MySQL provides a simplified and unified permission model through the API and the console to make things easier to manage and understand. - -Each user has associated permissions that give them access to zero or more logical databases. These include: - -* **None:** No access to the database -* **Read:** Allow users to read tables and fields in a database -* **Write:** Allow users to write content in databases. -* **Admin:** Read and write access to the data, and extended privileges depending on the database engine. - - -### List user privileges for a database - -List privileges of a user on a database. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `database_name` and `user_name`. - -**Usage:** - -``` -scw rdb privilege list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `user_name_asc`, `user_name_desc`, `database_name_asc`, `database_name_desc` | Criteria to use when ordering privileges listing | -| database-name | | Name of the database | -| instance-id | Required | UUID of the Database Instance | -| user-name | | Name of the user | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Set user privileges for a database - -Set the privileges of a user on a database. You must define `database_name`, `user_name` and `permission` in the request body. - -**Usage:** - -``` -scw rdb privilege set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| database-name | | Name of the database | -| user-name | | Name of the user | -| permission | One of: `readonly`, `readwrite`, `all`, `custom`, `none` | Permission to set (Read, Read/Write, All, Custom) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Read replica management - -A Read Replica is a live copy of a Database Instance that behaves like an Instance, but that only allows read-only connections. -The replica mirrors the data of the primary Database node and any changes made are replicated to the replica asynchronously. Read Replicas allow you to scale your Database Instance for read-heavy database workloads. They can also be used for business intelligence workloads. - -A Read Replica can have at most one direct access and one Private Network endpoint. `Loadbalancer` endpoints are not available on Read Replicas even if this resource is displayed in the Read Replica response example. - -If you want to remove a Read Replica endpoint, you can use [delete a Database Instance endpoint](#path-endpoints-delete-a-database-instance-endpoint) API call. - -Instance Access Control Lists (ACL) also apply to Read Replica direct access endpoints. - -**Limitations:** -There might be replication lags between the primary node and its Read Replica nodes. You can try to reduce this lag with some good practices: -* All your tables should have a primary key -* Don't run large transactions that modify, delete or insert lots of rows. Try to split it into several small transactions. - - -### Create a Read Replica - -Create a new Read Replica of a Database Instance. You must specify the `region` and the `instance_id`. You can only create a maximum of 3 Read Replicas per Database Instance. - -**Usage:** - -``` -scw rdb read-replica create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to create a Read Replica from | -| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | -| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| same-zone | | Defines whether to create the replica in the same availability zone as the main instance nodes or not. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create an endpoint for a Read Replica - -Create a new endpoint for a Read Replica. Read Replicas can have at most one direct access and one Private Network endpoint. - -**Usage:** - -``` -scw rdb read-replica create-endpoint [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| endpoint-spec.{index}.private-network.private-network-id | | UUID of the Private Network to be connected to the Read Replica | -| endpoint-spec.{index}.private-network.service-ip | | Endpoint IPv4 address with a CIDR notation. Refer to the official Scaleway documentation to learn more about IP and subnet limitations. | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Read Replica - -Delete a Read Replica of a Database Instance. You must specify the `region` and `read_replica_id` parameters of the Read Replica you want to delete. - -**Usage:** - -``` -scw rdb read-replica delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Read Replica - -Retrieve information about a Database Instance Read Replica. Full details about the Read Replica, like `endpoints`, `status` and `region` are returned in the response. - -**Usage:** - -``` -scw rdb read-replica get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Resync a Read Replica - -When you resync a Read Replica, first it is reset, then its data is resynchronized from the primary node. Your Read Replica remains unavailable during the resync process. The duration of this process is proportional to the size of your Database Instance. -The configured endpoints do not change. - -**Usage:** - -``` -scw rdb read-replica reset [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| read-replica-id | Required | UUID of the Read Replica | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Setting management - -Advanced Database Instance settings allow you to tune the behavior of your database engines to better fit your needs. - -Available settings depend on the database engine and its version. Note that some settings can only be defined upon database engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available database engines](#path-databases-list-databases-in-a-database-instance) endpoint. - -Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. - - -### Add Database Instance advanced settings - -Add an advanced setting to a Database Instance. You must set the `name` and the `value` of each setting. - -**Usage:** - -``` -scw rdb setting add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance you want to add settings to | -| settings.{index}.name | | | -| settings.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete Database Instance advanced settings - -Delete an advanced setting in a Database Instance. You must specify the names of the settings you want to delete in the request. - -**Usage:** - -``` -scw rdb setting delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete settings from | -| setting-names.{index} | Required | Settings names to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Set Database Instance advanced settings - -Update an advanced setting for a Database Instance. Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. - -**Usage:** - -``` -scw rdb setting set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance where the settings must be set | -| settings.{index}.name | | | -| settings.{index}.value | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Block snapshot management - -A snapshot is a consistent, instantaneous copy of the Block Storage volume of your Database Instance at a certain point in time. They are designed to recover your data in case of failure or accidental alterations of the data by a user. They allow you to quickly create a new Instance from a previous state of your database, regardless of the size of the volume. Their limitation is that, unlike backups, snapshots can only be stored in the same location as the original data. - - -### Create a Database Instance snapshot - -Create a new snapshot of a Database Instance. You must define the `name` parameter in the request. - -**Usage:** - -``` -scw rdb snapshot create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance | -| name | Required
Default: `` | Name of the snapshot | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Database Instance snapshot - -Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `region` and `snapshot_id` parameters of the snapshot you want to delete. - -**Usage:** - -``` -scw rdb snapshot delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot to delete | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Database Instance snapshot - -Retrieve information about a given snapshot, specified by its `snapshot_id` and `region`. Full details about the snapshot, like size and expiration date, are returned in the response. - -**Usage:** - -``` -scw rdb snapshot get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List snapshots - -List snapshots. You can include the `instance_id` or `project_id` in your query to get the list of snapshots for specific Database Instances and/or Projects. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw rdb snapshot list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the snapshot | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `expires_at_asc`, `expires_at_desc` | Criteria to use when ordering snapshot listing | -| instance-id | | UUID of the Database Instance | -| project-id | | Project ID the snapshots belongs to | -| organization-id | | Organization ID the snapshots belongs to | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Create a new Database Instance from a snapshot - -Restore a snapshot. When you restore a snapshot, a new Instance is created and billed to your account. Note that is possible to select a larger node type for your new Database Instance. However, the Block volume size will be the same as the size of the restored snapshot. All Instance settings will be restored if you chose a node type with the same or more memory size than the initial Instance. Settings will be reset to the default if your node type has less memory. - -**Usage:** - -``` -scw rdb snapshot restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | Block snapshot of the Database Instance | -| instance-name | | Name of the Database Instance created with the snapshot | -| is-ha-cluster | | Defines whether or not High-Availability is enabled on the new Database Instance | -| node-type | | The node type used to restore the snapshot | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update a Database Instance snapshot - -Update the parameters of a snapshot of a Database Instance. You can update the `name` and `expires_at` parameters. - -**Usage:** - -``` -scw rdb snapshot update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| snapshot-id | Required | UUID of the snapshot to update | -| name | | Name of the snapshot | -| expires-at | | Expiration date (must follow the ISO 8601 format) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## User management commands - -Users are profiles to which you can attribute database-level permissions. They allow you to define permissions specific to each type of database usage. For example, users with an `admin` role can create new databases and users. - - -### Create a user for a Database Instance - -Create a new user for a Database Instance. You must define the `name`, `password` and `is_admin` parameters. - -**Usage:** - -``` -scw rdb user create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance in which you want to create a user | -| name | | Name of the user you want to create | -| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | -| password | | Password of the user you want to create | -| is-admin | | Defines whether the user will have administrative privileges | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a user on a Database Instance - -Delete a given user on a Database Instance. You must specify, in the endpoint, the `region`, `instance_id` and `name` parameters of the user you want to delete. - -**Usage:** - -``` -scw rdb user delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance to delete the user from | -| name | Required | Name of the user | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Gets the URL to connect to the Database - -Provides the URL to connect to a Database on an Instance as the given user - -**Usage:** - -``` -scw rdb user get-url [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | ID of the Database Instance | -| user | | User of the Database | -| db | | Name of the Database to connect to | - - - -### List users of a Database Instance - -List all users of a given Database Instance. By default, the users returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw rdb user list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the user | -| order-by | One of: `name_asc`, `name_desc`, `is_admin_asc`, `is_admin_desc` | Criteria to use when requesting user listing | -| instance-id | Required | UUID of the Database Instance | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a user on a Database Instance - -Update the parameters of a user on a Database Instance. You can update the `password` and `is_admin` parameters, but you cannot change the name of the user. - -**Usage:** - -``` -scw rdb user update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| instance-id | Required | UUID of the Database Instance the user belongs to | -| name | Required | Name of the database user | -| generate-password | Default: `true` | Will generate a 21 character-length password that contains a mix of upper/lower case letters, numbers and special symbols | -| password | | Password of the database user | -| is-admin | | Defines whether or not this user got administrative privileges | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/redis.md b/docs/docs/redis.md deleted file mode 100644 index 87195630c3..0000000000 --- a/docs/docs/redis.md +++ /dev/null @@ -1,607 +0,0 @@ - -# Documentation for `scw redis` -This API allows you to manage your Managed Databases for Redis™. - -- [Access Control List (ACL) management commands](#access-control-list-(acl)-management-commands) - - [Add ACL rules for a cluster](#add-acl-rules-for-a-cluster) - - [Delete an ACL rule for a cluster](#delete-an-acl-rule-for-a-cluster) - - [Get an ACL rule](#get-an-acl-rule) - - [Set ACL rules for a cluster](#set-acl-rules-for-a-cluster) -- [Cluster management commands](#cluster-management-commands) - - [Create a Redis™ Database Instance](#create-a-redis™-database-instance) - - [Delete a Redis™ Database Instance](#delete-a-redis™-database-instance) - - [Get a Redis™ Database Instance](#get-a-redis™-database-instance) - - [Get the TLS certificate of a cluster](#get-the-tls-certificate-of-a-cluster) - - [List Redis™ Database Instances](#list-redis™-database-instances) - - [Get metrics of a Redis™ Database Instance](#get-metrics-of-a-redis™-database-instance) - - [Scale up a Redis™ Database Instance](#scale-up-a-redis™-database-instance) - - [Renew the TLS certificate of a cluster](#renew-the-tls-certificate-of-a-cluster) - - [Update a Redis™ Database Instance](#update-a-redis™-database-instance) - - [Wait for a Redis cluster to reach a stable state](#wait-for-a-redis-cluster-to-reach-a-stable-state) -- [Endpoints management commands](#endpoints-management-commands) - - [Add endpoints for a cluster](#add-endpoints-for-a-cluster) - - [Delete an endpoint for a cluster](#delete-an-endpoint-for-a-cluster) - - [Get an endpoint](#get-an-endpoint) - - [Set endpoints for a cluster](#set-endpoints-for-a-cluster) - - [Update an endpoint](#update-an-endpoint) -- [Node Types management commands](#node-types-management-commands) - - [List available node types](#list-available-node-types) -- [Settings management commands](#settings-management-commands) - - [Add advanced settings](#add-advanced-settings) - - [Delete advanced setting](#delete-advanced-setting) - - [Set advanced settings](#set-advanced-settings) -- [Redis™ version management commands](#redis™-version-management-commands) - - [List available Redis™ versions](#list-available-redis™-versions) - - -## Access Control List (ACL) management commands - -Network Access Control Lists (ACLs) allow you to manage network inbound traffic by setting up ACL rules. - - -### Add ACL rules for a cluster - -Add an additional ACL rule to a Redis™ Database Instance (Redis™ cluster). - -**Usage:** - -``` -scw redis acl add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance you want to add ACL rules to | -| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | -| acl-rules.{index}.description | | Description of the rule | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an ACL rule for a cluster - -Delete an ACL rule of a Redis™ Database Instance (Redis™ cluster). You must specify the `acl_id` of the rule you want to delete in your request. - -**Usage:** - -``` -scw redis acl delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | UUID of the ACL rule you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an ACL rule - -Retrieve information about an ACL rule of a Redis™ Database Instance (Redis™ cluster). You must specify the `acl_id` of the rule in your request. - -**Usage:** - -``` -scw redis acl get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| acl-id | Required | UUID of the ACL rule you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Set ACL rules for a cluster - -Replace all the ACL rules of a Redis™ Database Instance (Redis™ cluster). - -**Usage:** - -``` -scw redis acl set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance where the ACL rules have to be set | -| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | -| acl-rules.{index}.description | | Description of the rule | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -## Cluster management commands - -A Redis™ Database Instance, also known as a Redis™ cluster, consists of either one standalone node or a cluster composed of three to six nodes. The cluster uses partitioning to split the keyspace. Each partition is replicated and can be reassigned or elected as the primary when necessary. Standalone mode creates a standalone database provisioned on a single node. - - -### Create a Redis™ Database Instance - -Create a new Redis™ Database Instance (Redis™ cluster). You must set the `zone`, `project_id`, `version`, `node_type`, `user_name` and `password` parameters. Optionally you can define `acl_rules`, `endpoints`, `tls_enabled` and `cluster_settings`. - -**Usage:** - -``` -scw redis cluster create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name of the Database Instance | -| version | Required | Redis™ engine version of the Database Instance | -| tags.{index} | | Tags to apply to the Database Instance | -| node-type | Required | Type of node to use for the Database Instance | -| user-name | Required | Name of the user created upon Database Instance creation | -| password | Required | Password of the user | -| cluster-size | | Number of nodes in the Redis™ cluster | -| acl-rules.{index}.ip-cidr | | IPv4 network address of the rule | -| acl-rules.{index}.description | | Description of the rule | -| endpoints.{index}.private-network.enable-ipam | Default: `false` | Will configure your Private Network endpoint with Scaleway IPAM service if true | -| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | -| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | -| tls-enabled | | Defines whether or not TLS is enabled | -| cluster-settings.{index}.value | | Value of the setting | -| cluster-settings.{index}.name | | Name of the setting | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a Redis™ Database Instance - -Delete a Redis™ Database Instance (Redis™ cluster), specified by the `region` and `cluster_id` parameters. Deleting a Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. - -**Usage:** - -``` -scw redis cluster delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a Redis™ Database Instance - -Retrieve information about a Redis™ Database Instance (Redis™ cluster). Specify the `cluster_id` and `region` in your request to get information such as `id`, `status`, `version`, `tls_enabled`, `cluster_settings`, `upgradable_versions` and `endpoints` about your cluster in the response. - -**Usage:** - -``` -scw redis cluster get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the cluster | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Get the TLS certificate of a cluster - -Retrieve information about the TLS certificate of a Redis™ Database Instance (Redis™ cluster). Details like name and content are returned in the response. - -**Usage:** - -``` -scw redis cluster get-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the cluster | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### List Redis™ Database Instances - -List all Redis™ Database Instances (Redis™ cluster) in the specified zone. By default, the Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags`, `name`, `organization_id` and `version`. - -**Usage:** - -``` -scw redis cluster list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tags.{index} | | Filter by Database Instance tags | -| name | | Filter by Database Instance names | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering the list | -| project-id | | Filter by Project ID | -| version | | Filter by Redis™ engine version | -| organization-id | | Filter by Organization ID | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Get metrics of a Redis™ Database Instance - -Retrieve the metrics of a Redis™ Database Instance (Redis™ cluster). You can define the period from which to retrieve metrics by specifying the `start_date` and `end_date`. - -**Usage:** - -``` -scw redis cluster metrics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the cluster | -| start-at | | Start date | -| end-at | | End date | -| metric-name | | Name of the metric to gather | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Scale up a Redis™ Database Instance - -Upgrade your Redis™ Database Instance, either by upgrading to a bigger node type (vertical scaling) or by adding more nodes to your Database Instance to increase your number of endpoints and distribute cache (horizontal scaling, available for clusters only). Note that scaling horizontally your Redis™ Database Instance will not renew its TLS certificate. In order to refresh the TLS certificate, you must use the Renew TLS certificate endpoint. - -**Usage:** - -``` -scw redis cluster migrate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| version | | Redis™ engine version of the Database Instance | -| node-type | | Type of node to use for the Database Instance | -| cluster-size | | Number of nodes for the Database Instance | -| cluster-id | Required | UUID of the Database Instance to update | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Renew the TLS certificate of a cluster - -Renew a TLS certificate for a Redis™ Database Instance (Redis™ cluster). Renewing a certificate means that you will not be able to connect to your Database Instance using the previous certificate. You will also need to download and update the new certificate for all database clients. - -**Usage:** - -``` -scw redis cluster renew-certificate [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the cluster | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a Redis™ Database Instance - -Update the parameters of a Redis™ Database Instance (Redis™ cluster), including `name`, `tags`, `user_name` and `password`. - -**Usage:** - -``` -scw redis cluster update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | | Name of the Database Instance | -| tags.{index} | | Database Instance tags | -| user-name | | Name of the Database Instance user | -| password | | Password of the Database Instance user | -| cluster-id | Required | UUID of the Database Instance to update | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Wait for a Redis cluster to reach a stable state - -Wait for a Redis cluster to reach a stable state. This is similar to using --wait flag. - -**Usage:** - -``` -scw redis cluster wait [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | ID of the cluster you want to wait for | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | -| timeout | Default: `15m0s` | Timeout of the wait | - - -**Examples:** - - -Wait for a Redis cluster to reach a stable state -``` -scw redis cluster wait -``` - - - - -## Endpoints management commands - -Manage endpoint access to your Redis™ Database Instance through Public or Private Networks. - - -### Add endpoints for a cluster - -Add a new endpoint for a Redis™ Database Instance (Redis™ cluster). You can add `private_network` or `public_network` specifications to the body of the request. - -**Usage:** - -``` -scw redis endpoint add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance you want to add endpoints to | -| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | -| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an endpoint for a cluster - -Delete the endpoint of a Redis™ Database Instance (Redis™ cluster). You must specify the `region` and `endpoint_id` parameters of the endpoint you want to delete. Note that might need to update any environment configurations that point to the deleted endpoint. - -**Usage:** - -``` -scw redis endpoint delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an endpoint - -Retrieve information about a Redis™ Database Instance (Redis™ cluster) endpoint. Full details about the endpoint, like `ips`, `port`, `private_network` and `public_network` specifications are returned in the response. - -**Usage:** - -``` -scw redis endpoint get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Set endpoints for a cluster - -Update an endpoint for a Redis™ Database Instance (Redis™ cluster). You must specify the `cluster_id` and the `endpoints` parameters in your request. - -**Usage:** - -``` -scw redis endpoint set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance where the endpoints have to be set | -| endpoints.{index}.private-network.id | | UUID of the Private Network to connect to the Database Instance | -| endpoints.{index}.private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an endpoint - -Update information about a Redis™ Database Instance (Redis™ cluster) endpoint. Full details about the endpoint, like `ips`, `port`, `private_network` and `public_network` specifications are returned in the response. - -**Usage:** - -``` -scw redis endpoint update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| endpoint-id | Required | UUID of the endpoint you want to get | -| private-network.id | | UUID of the Private Network to connect to the Database Instance | -| private-network.service-ips.{index} | | Endpoint IPv4 address with a CIDR notation. You must provide at least one IPv4 per node. | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -## Node Types management commands - -Nodes are the compute units that make up your Redis™ Database Instance. Different node types are available with varying amounts of RAM and vCPU. - - -### List available node types - -List all available node types. By default, the node types returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. - -**Usage:** - -``` -scw redis node-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| include-disabled-types | | Defines whether or not to include disabled types | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -## Settings management commands - -Advanced settings allow you to tune the behavior of your Redis™ database engine to better fit your needs. Available settings depend on the version of the Redis™ engine. Note that some settings can only be defined upon the Redis™ engine initialization. These are called init settings. You can find a full list of the settings available in the response body of the [list available Redis™ versions](#path-redistm-engine-versions-list-available-redistm-versions) endpoint. - -Each advanced setting entry has a default value that users can override. The deletion of a setting entry will restore the setting to default value. Some of the defaults values can be different from the engine's defaults, as we optimize them to the Scaleway platform. - - -### Add advanced settings - -Add an advanced setting to a Redis™ Database Instance (Redis™ cluster). You must set the `name` and the `value` of each setting. - -**Usage:** - -``` -scw redis setting add [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance you want to add settings to | -| settings.{index}.value | | Value of the setting | -| settings.{index}.name | | Name of the setting | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete advanced setting - -Delete an advanced setting in a Redis™ Database Instance (Redis™ cluster). You must specify the names of the settings you want to delete in the request body. - -**Usage:** - -``` -scw redis setting delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance where the settings must be set | -| setting-name | Required | Setting name to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -### Set advanced settings - -Update an advanced setting for a Redis™ Database Instance (Redis™ cluster). Settings added upon database engine initalization can only be defined once, and cannot, therefore, be updated. - -**Usage:** - -``` -scw redis setting set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| cluster-id | Required | UUID of the Database Instance where the settings must be set | -| settings.{index}.value | | Value of the setting | -| settings.{index}.name | | Name of the setting | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2` | Zone to target. If none is passed will use default zone from the config | - - - -## Redis™ version management commands - -The Redis™ database engine versions available at Scaleway for your clusters. - - -### List available Redis™ versions - -List the Redis™ database engine versions available. You can define additional parameters for your query, such as `include_disabled`, `include_beta`, `include_deprecated` and `version`. - -**Usage:** - -``` -scw redis version list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| include-disabled | | Defines whether or not to include disabled Redis™ engine versions | -| include-beta | | Defines whether or not to include beta Redis™ engine versions | -| include-deprecated | | Defines whether or not to include deprecated Redis™ engine versions | -| version | | List Redis™ engine versions that match a given name pattern | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `pl-waw-1`, `pl-waw-2`, `all` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/registry.md b/docs/docs/registry.md deleted file mode 100644 index b6c0a57f2d..0000000000 --- a/docs/docs/registry.md +++ /dev/null @@ -1,381 +0,0 @@ - -# Documentation for `scw registry` -This API allows you to manage your Container Registry resources. - -- [Image management commands](#image-management-commands) - - [Delete an image](#delete-an-image) - - [Get an image](#get-an-image) - - [List images](#list-images) - - [Update an image](#update-an-image) -- [Install a local Docker credential helper](#install-a-local-docker-credential-helper) -- [Login to a registry](#login-to-a-registry) -- [Logout of a registry](#logout-of-a-registry) -- [Namespace management commands](#namespace-management-commands) - - [Create a namespace](#create-a-namespace) - - [Delete a namespace](#delete-a-namespace) - - [Get a namespace](#get-a-namespace) - - [List namespaces](#list-namespaces) - - [Update a namespace](#update-a-namespace) -- [Tag management commands](#tag-management-commands) - - [Delete a tag](#delete-a-tag) - - [Get a tag](#get-a-tag) - - [List tags](#list-tags) - - -## Image management commands - -An image represents a container image. A container image is a file that includes all the requirements and instructions of a complete and executable version of an application. When running, it becomes one or multiple instances of that application. - -The visibility of an image can be public - when anyone can pull it, private - when only users within your organization can pull it, or inherited from the namespace visibility - which is the default. The visibility of your image can be changed using the [update image endpoit](#path-images-update-an-image). - - -### Delete an image - -Delete a given image. You must specify, in the endpoint, the `region` and `image_id` parameters of the image you want to delete. - -**Usage:** - -``` -scw registry image delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | UUID of the image | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get an image - -Retrieve information about a given container image, specified by its `image_id` and region. Full details about the image, such as `name`, `namespace_id`, `status`, `visibility`, and `size` are returned in the response. - -**Usage:** - -``` -scw registry image get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | UUID of the image | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List images - -List all images in a specified region. By default, the images listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `namespace_id` and `project_id` parameters. - -**Usage:** - -``` -scw registry image list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering image listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | -| namespace-id | | Filter by the namespace ID | -| name | | Filter by the image name (exact match) | -| project-id | | Filter by Project ID | -| organization-id | | Filter by Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update an image - -Update the parameters of a given image, specified by its `image_id` and `region`. You can update the `visibility` parameter. - -**Usage:** - -``` -scw registry image update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| image-id | Required | ID of the image to update | -| visibility | One of: `visibility_unknown`, `inherit`, `public`, `private` | Set to `public` to allow the image to be pulled without authentication. Else, set to `private`. Set to `inherit` to keep the same visibility configuration as the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Install a local Docker credential helper - -This command will install the Docker credential helper for your account. - -It will create a new script named docker-credential-scw. -This script will be called each time Docker needs the credentials and will return the correct credentials. -It avoid running docker login commands. - - -This command will install the Docker credential helper for your account. - -It will create a new script named docker-credential-scw. -This script will be called each time Docker needs the credentials and will return the correct credentials. -It avoid running docker login commands. - - -**Usage:** - -``` -scw registry install-docker-helper [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| path | Default: `/usr/local/bin` | Directory in which the Docker helper will be installed. This directory should be in your $PATH | - - - -## Login to a registry - -This command will run the correct command in order to log you in on the registry with the chosen program. -You will need to have the chosen binary installed on your system and in your PATH. - -This command will run the correct command in order to log you in on the registry with the chosen program. -You will need to have the chosen binary installed on your system and in your PATH. - -**Usage:** - -``` -scw registry login [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| program | Default: `docker`
One of: `docker`, `podman` | Program used to log in to the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Logout of a registry - -This command will run the correct command in order to log you out of the registry with the chosen program. -You will need to have the chosen binary installed on your system and in your PATH. - -This command will run the correct command in order to log you out of the registry with the chosen program. -You will need to have the chosen binary installed on your system and in your PATH. - -**Usage:** - -``` -scw registry logout [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| program | Default: `docker`
One of: `docker`, `podman` | Program used to log in to the namespace | -| region | Default: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Namespace management commands - -A namespace is a collection of container images, each bearing the unique identifier of that namespace. A namespace can be either public or private, by default. - -Each namespace must have a globally unique name within its region. This means no namespaces in the same region can bear the same name. - -You can use namespace privacy policies to specify whether everyone has the right to pull an image from a namespace or not. When an image is in a public namespace, anyone is able to pull it. You can set your namespace to private if you want to restrict access. - - -### Create a namespace - -Create a new Container Registry namespace. You must specify the namespace name and region in which you want it to be created. Optionally, you can specify the `project_id` and `is_public` in the request payload. - -**Usage:** - -``` -scw registry namespace create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name of the namespace | -| description | | Description of the namespace | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| is-public | | Defines whether or not namespace is public | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a namespace - -Delete a given namespace. You must specify, in the endpoint, the `region` and `namespace_id` parameters of the namespace you want to delete. - -**Usage:** - -``` -scw registry namespace delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a namespace - -Retrieve information about a given namespace, specified by its `namespace_id` and region. Full details about the namespace, such as `description`, `project_id`, `status`, `endpoint`, `is_public`, `size`, and `image_count` are returned in the response. - -**Usage:** - -``` -scw registry namespace get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | UUID of the namespace | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List namespaces - -List all namespaces in a specified region. By default, the namespaces listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `instance_id` and `project_id` parameters. - -**Usage:** - -``` -scw registry namespace list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `description_asc`, `description_desc`, `name_asc`, `name_desc` | Criteria to use when ordering namespace listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | -| project-id | | Filter by Project ID | -| name | | Filter by the namespace name (exact match) | -| organization-id | | Filter by Organization ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a namespace - -Update the parameters of a given namespace, specified by its `namespace_id` and `region`. You can update the `description` and `is_public` parameters. - -**Usage:** - -``` -scw registry namespace update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| namespace-id | Required | ID of the namespace to update | -| description | | Namespace description | -| is-public | | Defines whether or not the namespace is public | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Tag management commands - -Tags allow you to organize your container images. This gives you the possibility of sorting and filtering your images in any organizational pattern of your choice, which in turn helps you arrange, control and monitor your cloud resources. You can assign as many tags as you want to each image. - - -### Delete a tag - -Delete a given image tag. You must specify, in the endpoint, the `region` and `tag_id` parameters of the tag you want to delete. - -**Usage:** - -``` -scw registry tag delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tag-id | Required | UUID of the tag | -| ~~force~~ | Deprecated | If two tags share the same digest the deletion will fail unless this parameter is set to true (deprecated) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a tag - -Retrieve information about a given image tag, specified by its `tag_id` and region. Full details about the tag, such as `name`, `image_id`, `status`, and `digest` are returned in the response. - -**Usage:** - -``` -scw registry tag get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| tag-id | Required | UUID of the tag | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List tags - -List all tags for a given image, specified by region. By default, the tags listed are ordered by creation date in ascending order. This can be modified via the order_by field. You can also define additional parameters for your query, such as the `name`. - -**Usage:** - -``` -scw registry tag list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Criteria to use when ordering tag listings. Possible values are `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `region`, `status_asc` and `status_desc`. The default value is `created_at_asc`. | -| image-id | Required | UUID of the image | -| name | | Filter by the tag name (exact match) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/sdb-sql.md b/docs/docs/sdb-sql.md deleted file mode 100644 index 795122cc8e..0000000000 --- a/docs/docs/sdb-sql.md +++ /dev/null @@ -1,220 +0,0 @@ - -# Documentation for `scw sdb-sql` -This API allows you to manage your Serverless SQL Databases. - -- [](#) - - [Export a database backup](#export-a-database-backup) - - [Get a database backup information](#get-a-database-backup-information) - - [List your Serverless SQL Database backups](#list-your-serverless-sql-database-backups) -- [](#) - - [Create a new Serverless SQL Database](#create-a-new-serverless-sql-database) - - [Delete a database](#delete-a-database) - - [Get a database information](#get-a-database-information) - - [List your Serverless SQL Databases](#list-your-serverless-sql-databases) - - [Restore a database from a backup](#restore-a-database-from-a-backup) - - [Update database information](#update-database-information) - - -## - - - - -### Export a database backup - -Export a database backup providing a download link once the export process is completed. You must provide the `backup_id` parameter. - -**Usage:** - -``` -scw sdb-sql backup export [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-id | Required | UUID of the Serverless SQL Database backup. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a database backup information - -Retrieve information about your Serverless SQL Database backup. You must provide the `backup_id` parameter. - -**Usage:** - -``` -scw sdb-sql backup get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| backup-id | Required | UUID of the Serverless SQL Database backup. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List your Serverless SQL Database backups - -List all Serverless SQL Database backups for a given Scaleway Project or Database. By default, the backups returned in the list are ordered by creation date in descending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw sdb-sql backup list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Filter by the UUID of the Scaleway project. | -| database-id | Required | Filter by the UUID of the Serverless SQL Database. | -| order-by | One of: `created_at_desc`, `created_at_asc` | Sorting criteria. One of `created_at_asc`, `created_at_desc`. | -| organization-id | | Filter by the UUID of the Scaleway organization. | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -## - - - - -### Create a new Serverless SQL Database - -You must provide the following parameters: `organization_id`, `project_id`, `name`, `cpu_min`, `cpu_max`. You can also provide `from_backup_id` to create a database from a backup. - -**Usage:** - -``` -scw sdb-sql database create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Required | The name of the Serverless SQL Database to be created. | -| cpu-min | Required | The minimum number of CPU units for your Serverless SQL Database. | -| cpu-max | Required | The maximum number of CPU units for your Serverless SQL Database. | -| from-backup-id | | The ID of the backup to create the database from. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a database - -Deletes a database. You must provide the `database_id` parameter. All data stored in the database will be permanently deleted. - -**Usage:** - -``` -scw sdb-sql database delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-id | Required | UUID of the Serverless SQL Database. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get a database information - -Retrieve information about your Serverless SQL Database. You must provide the `database_id` parameter. - -**Usage:** - -``` -scw sdb-sql database get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-id | Required | UUID of the Serverless SQL DB database. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List your Serverless SQL Databases - -List all Serverless SQL Databases for a given Scaleway Organization or Scaleway Project. By default, the databases returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. - -**Usage:** - -``` -scw sdb-sql database list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Filter by the name of the database | -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sorting criteria. One of `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | -| organization-id | | Filter by the UUID of the Scaleway organization | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Restore a database from a backup - -Restore a database from a backup. You must provide the `backup_id` parameter. - -**Usage:** - -``` -scw sdb-sql database restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-id | Required | UUID of the Serverless SQL Database. | -| backup-id | Required | UUID of the Serverless SQL Database backup to restore. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update database information - -Update CPU limits of your Serverless SQL Database. You must provide the `database_id` parameter. - -**Usage:** - -``` -scw sdb-sql database update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| database-id | Required | UUID of the Serverless SQL Database. | -| cpu-min | | The minimum number of CPU units for your Serverless SQL Database. | -| cpu-max | | The maximum number of CPU units for your Serverless SQL Database. | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/secret.md b/docs/docs/secret.md deleted file mode 100644 index 1ff854044b..0000000000 --- a/docs/docs/secret.md +++ /dev/null @@ -1,489 +0,0 @@ - -# Documentation for `scw secret` -This API allows you to manage your Secret Manager services, for storing, accessing and sharing sensitive data such as passwords, API keys and certificates. - -- [Secret management commands](#secret-management-commands) - - [Allow a product to use the secret](#allow-a-product-to-use-the-secret) - - [Create a secret](#create-a-secret) - - [Delete a secret](#delete-a-secret) - - [Get metadata using the secret's ID](#get-metadata-using-the-secret's-id) - - [List secrets](#list-secrets) - - [Enable secret protection](#enable-secret-protection) - - [Disable secret protection](#disable-secret-protection) - - [Update metadata of a secret](#update-metadata-of-a-secret) -- [Secret Version management commands](#secret-version-management-commands) - - [Access a secret's version using the secret's ID](#access-a-secret's-version-using-the-secret's-id) - - [Access a secret's version using the secret's name and path](#access-a-secret's-version-using-the-secret's-name-and-path) - - [Create a version](#create-a-version) - - [Delete a version](#delete-a-version) - - [Disable a version](#disable-a-version) - - [Enable a version](#enable-a-version) - - [Get metadata of a secret's version using the secret's ID](#get-metadata-of-a-secret's-version-using-the-secret's-id) - - [List versions of a secret using the secret's ID](#list-versions-of-a-secret-using-the-secret's-id) - - [Update metadata of a version](#update-metadata-of-a-version) - - -## Secret management commands - -Secrets are logical containers made up of zero or more immutable versions, that contain sensitive data. - - -### Allow a product to use the secret - -Allow a product to use the secret. - -**Usage:** - -``` -scw secret secret add-owner [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| product | One of: `unknown_product`, `edge_services` | ID of the product to add | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create a secret - -Create a secret in a given region specified by the `region` parameter. - -**Usage:** - -``` -scw secret secret create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name of the secret | -| tags.{index} | | List of the secret's tags | -| description | | Description of the secret | -| type | One of: `unknown_type`, `opaque`, `certificate`, `key_value`, `basic_credentials`, `database_credentials`, `ssh_key` | Type of the secret | -| path | | Path of the secret | -| ephemeral-policy.time-to-live | | Time frame, from one second and up to one year, during which the secret's versions are valid. | -| ephemeral-policy.expires-once-accessed | | Returns `true` if the version expires after a single user access. | -| ephemeral-policy.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | -| protected | | Returns `true` if secret protection is enabled on a given secret | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Create a given secret -``` -scw secret secret create name=foobar description="$(cat )" -``` - - - - -### Delete a secret - -Delete a given secret specified by the `region` and `secret_id` parameters. - -**Usage:** - -``` -scw secret secret delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a given secret -``` -scw secret secret delete 11111111-1111-1111-1111-111111111111 -``` - - - - -### Get metadata using the secret's ID - -Retrieve the metadata of a secret specified by the `region` and `secret_id` parameters. - -**Usage:** - -``` -scw secret secret get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List secrets - -Retrieve the list of secrets created within an Organization and/or Project. You must specify either the `organization_id` or the `project_id` and the `region`. - -**Usage:** - -``` -scw secret secret list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Filter by Project ID (optional) | -| order-by | One of: `name_asc`, `name_desc`, `created_at_asc`, `created_at_desc`, `updated_at_asc`, `updated_at_desc` | | -| tags.{index} | | List of tags to filter on (optional) | -| name | | Filter by secret name (optional) | -| path | | Filter by exact path (optional) | -| ephemeral | | Filter by ephemeral / not ephemeral (optional) | -| type | One of: `unknown_type`, `opaque`, `certificate`, `key_value`, `basic_credentials`, `database_credentials`, `ssh_key` | Filter by secret type (optional) | -| organization-id | | Filter by Organization ID (optional) | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Enable secret protection - -Enable secret protection for a given secret specified by the `secret_id` parameter. Enabling secret protection means that your secret can be read and modified, but it cannot be deleted. - -**Usage:** - -``` -scw secret secret protect [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret to enable secret protection for | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Enable secret protection -``` -scw secret secret protect 11111111-1111-1111-1111-111111111111 -``` - - - - -### Disable secret protection - -Disable secret protection for a given secret specified by the `secret_id` parameter. Disabling secret protection means that your secret can be read, modified and deleted. - -**Usage:** - -``` -scw secret secret unprotect [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret to disable secret protection for | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Disable secret protection -``` -scw secret secret unprotect 11111111-1111-1111-1111-111111111111 -``` - - - - -### Update metadata of a secret - -Edit a secret's metadata such as name, tag(s), description and ephemeral policy. The secret to update is specified by the `secret_id` and `region` parameters. - -**Usage:** - -``` -scw secret secret update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| name | | Secret's updated name (optional) | -| tags.{index} | | Secret's updated list of tags (optional) | -| description | | Description of the secret | -| path | | Path of the folder | -| ephemeral-policy.time-to-live | | Time frame, from one second and up to one year, during which the secret's versions are valid. | -| ephemeral-policy.expires-once-accessed | | Returns `true` if the version expires after a single user access. | -| ephemeral-policy.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Secret Version management commands - -Versions store the sensitive data contained in your secrets (API keys, passwords, or certificates). - - -### Access a secret's version using the secret's ID - -Access sensitive data in a secret's version specified by the `region`, `secret_id` and `revision` parameters. - -**Usage:** - -``` -scw secret version access [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| field | | Return only the JSON field of the given name | -| raw | | Return only the raw payload | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get a raw json value from a secret version -``` -scw secret version access 11111111-1111-1111-111111111111 revision=1 field=key raw=true -``` - - - - -### Access a secret's version using the secret's name and path - -Access sensitive data in a secret's version specified by the `region`, `secret_name`, `secret_path` and `revision` parameters. - -**Usage:** - -``` -scw secret version access-by-path [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-path | | Secret's path | -| secret-name | | Secret's name | -| revision | Required | Version number | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Create a version - -Create a version of a given secret specified by the `region` and `secret_id` parameters. - -**Usage:** - -``` -scw secret version create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| data | Required | Content of the secret version. | -| description | | Description of the version | -| disable-previous | | Disable the previous secret version | -| data-crc32 | | (Optional.) The CRC32 checksum of the data as a base-10 integer | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Create a json secret version -``` -scw secret version create 11111111-1111-1111-111111111111 data={"key":"value"} -``` - - - - -### Delete a version - -Delete a secret's version and the sensitive data contained in it. Deleting a version is permanent and cannot be undone. - -**Usage:** - -``` -scw secret version delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a given Secret Version -``` -scw secret version delete 11111111-1111-1111-1111-111111111111 revision=1 -``` - - - - -### Disable a version - -Make a specific version inaccessible. You must specify the `region`, `secret_id` and `revision` parameters. - -**Usage:** - -``` -scw secret version disable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable a version - -Make a specific version accessible. You must specify the `region`, `secret_id` and `revision` parameters. - -**Usage:** - -``` -scw secret version enable [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get metadata of a secret's version using the secret's ID - -Retrieve the metadata of a secret's given version specified by the `region`, `secret_id` and `revision` parameters. - -**Usage:** - -``` -scw secret version get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List versions of a secret using the secret's ID - -Retrieve the list of a given secret's versions specified by the `secret_id` and `region` parameters. - -**Usage:** - -``` -scw secret version list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| status.{index} | One of: `unknown_status`, `enabled`, `disabled`, `deleted` | Filter results by status | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update metadata of a version - -Edit the metadata of a secret's given version, specified by the `region`, `secret_id` and `revision` parameters. - -**Usage:** - -``` -scw secret version update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| secret-id | Required | ID of the secret | -| revision | Required | Version number | -| description | | Description of the version | -| ephemeral-properties.expires-at | | The version's expiration date | -| ephemeral-properties.expires-once-accessed | | Returns `true` if the version expires after a single user access. | -| ephemeral-properties.action | One of: `unknown_action`, `delete`, `disable` | Action to perform when the version of a secret expires | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/shell.md b/docs/docs/shell.md deleted file mode 100644 index ad5bf62a98..0000000000 --- a/docs/docs/shell.md +++ /dev/null @@ -1,6 +0,0 @@ - -# Documentation for `scw shell` -Start shell mode - - - diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css deleted file mode 100644 index 17e99161ed..0000000000 --- a/docs/docs/stylesheets/extra.css +++ /dev/null @@ -1,16 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&display=swap'); - -@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap'); - -body { - font-family: "Inter", sans-serif; -} - -li.md-nav__item{ - margin-left: .5rem; -} - -.md-typeset h1, h2, h3, h4, h5, h6{ - font-family: "Space Grotesk", sans-serif; -} - diff --git a/docs/docs/tem.md b/docs/docs/tem.md deleted file mode 100644 index 4270493d6e..0000000000 --- a/docs/docs/tem.md +++ /dev/null @@ -1,474 +0,0 @@ - -# Documentation for `scw tem` -This API allows you to manage your Transactional Email services. - -- [Domain management commands](#domain-management-commands) - - [Domain DNS check](#domain-dns-check) - - [Register a domain in a project](#register-a-domain-in-a-project) - - [Get information about a domain](#get-information-about-a-domain) - - [Display SPF and DKIM records status and potential errors](#display-spf-and-dkim-records-status-and-potential-errors) - - [List domains](#list-domains) - - [Delete a domain](#delete-a-domain) - - [Update a domain](#update-a-domain) -- [Email management commands](#email-management-commands) - - [Cancel an email](#cancel-an-email) - - [Send an email](#send-an-email) - - [Get an email](#get-an-email) - - [Email statuses](#email-statuses) - - [List emails](#list-emails) -- [Project settings management commands](#project-settings-management-commands) -- [Webhook management commands](#webhook-management-commands) - - [Create a Webhook](#create-a-webhook) - - [Delete a Webhook](#delete-a-webhook) - - [Get information about a Webhook](#get-information-about-a-webhook) - - [List Webhooks](#list-webhooks) - - [List Webhook triggered events](#list-webhook-triggered-events) - - [Update a Webhook](#update-a-webhook) - - -## Domain management commands - -This section lists your domains, shows you to manage them, and gives you information about them. - - -### Domain DNS check - -Perform an immediate DNS check of a domain using the `region` and `domain_id` parameters. - -**Usage:** - -``` -scw tem domain check [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | ID of the domain to check | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Register a domain in a project - -You must specify the `region`, `project_id` and `domain_name` to register a domain in a specific Project. - -**Usage:** - -``` -scw tem domain create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| domain-name | | Fully qualified domain dame | -| accept-tos | | Accept Scaleway's Terms of Service | -| autoconfig | | Activate auto-configuration of the domain's DNS zone | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get information about a domain - -Retrieve information about a specific domain using the `region` and `domain_id` parameters. Monitor your domain's reputation and improve **average** and **bad** reputation statuses, using your domain's **Email activity** tab on the [Scaleway console](https://console.scaleway.com/transactional-email/domains) to get a more detailed report. Check out our [dedicated documentation](https://www.scaleway.com/en/docs/managed-services/transactional-email/reference-content/understanding-tem-reputation-score/) to improve your domain's reputation. - -**Usage:** - -``` -scw tem domain get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | ID of the domain | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Display SPF and DKIM records status and potential errors - -Display SPF and DKIM records status and potential errors, including the found records to make debugging easier. - -**Usage:** - -``` -scw tem domain get-last-status [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | ID of the domain to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List domains - -Retrieve domains in a specific Project or in a specific Organization using the `region` parameter. - -**Usage:** - -``` -scw tem domain list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | (Optional) ID of the Project in which to list the domains | -| status.{index} | One of: `unknown`, `checked`, `unchecked`, `invalid`, `locked`, `revoked`, `pending`, `autoconfiguring` | (Optional) List domains under specific statuses | -| name | | (Optional) Names of the domains to list | -| organization-id | | (Optional) ID of the Organization in which to list the domains | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Delete a domain - -You must specify the domain you want to delete by the `region` and `domain_id`. Deleting a domain is permanent and cannot be undone. - -**Usage:** - -``` -scw tem domain revoke [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | ID of the domain to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Update a domain - -Update a domain auto-configuration. - -**Usage:** - -``` -scw tem domain update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | Required | ID of the domain to update | -| autoconfig | | (Optional) If set to true, activate auto-configuration of the domain's DNS zone | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -## Email management commands - -This section lists your emails and shows you how to manage them. - - -### Cancel an email - -You can cancel the sending of an email if it has not been sent yet. You must specify the `region` and the `email_id` of the email you want to cancel. - -**Usage:** - -``` -scw tem email cancel [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| email-id | Required | ID of the email to cancel | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Send an email - -You must specify the `region`, the sender and the recipient's information and the `project_id` to send an email from a checked domain. The subject of the email must contain at least 6 characters. - -**Usage:** - -``` -scw tem email create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| from.email | | Email address | -| from.name | | (Optional) Name displayed | -| to.{index}.email | | Email address | -| to.{index}.name | | (Optional) Name displayed | -| cc.{index}.email | | Email address | -| cc.{index}.name | | (Optional) Name displayed | -| bcc.{index}.email | | Email address | -| bcc.{index}.name | | (Optional) Name displayed | -| subject | | Subject of the email | -| text | | Text content | -| html | | HTML content | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| attachments.{index}.name | | Filename of the attachment | -| attachments.{index}.type | | MIME type of the attachment | -| attachments.{index}.content | | Content of the attachment encoded in base64 | -| send-before | | Maximum date to deliver the email | -| additional-headers.{index}.key | | Email header key | -| additional-headers.{index}.value | | Email header value | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get an email - -Retrieve information about a specific email using the `email_id` and `region` parameters. - -**Usage:** - -``` -scw tem email get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| email-id | Required | ID of the email to retrieve | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Email statuses - -Get information on your emails' statuses. - -**Usage:** - -``` -scw tem email get-statistics [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | (Optional) Number of emails for this Project | -| domain-id | | (Optional) Number of emails sent from this domain (must be coherent with the `project_id` and the `organization_id`) | -| since | | (Optional) Number of emails created after this date | -| until | | (Optional) Number of emails created before this date | -| mail-from | | (Optional) Number of emails sent with this sender's email address | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List emails - -Retrieve the list of emails sent from a specific domain or for a specific Project or Organization. You must specify the `region`. - -**Usage:** - -``` -scw tem email list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | (Optional) ID of the Project in which to list the emails | -| domain-id | | (Optional) ID of the domain for which to list the emails | -| message-id | | (Optional) ID of the message for which to list the emails | -| since | | (Optional) List emails created after this date | -| until | | (Optional) List emails created before this date | -| mail-from | | (Optional) List emails sent with this sender's email address | -| ~~mail-to~~ | Deprecated | List emails sent to this recipient's email address | -| mail-rcpt | | (Optional) List emails sent to this recipient's email address | -| statuses.{index} | One of: `unknown`, `new`, `sending`, `sent`, `failed`, `canceled` | (Optional) List emails with any of these statuses | -| subject | | (Optional) List emails with this subject | -| search | | (Optional) List emails by searching to all fields | -| order-by | One of: `created_at_desc`, `created_at_asc`, `updated_at_desc`, `updated_at_asc`, `status_desc`, `status_asc`, `mail_from_desc`, `mail_from_asc`, `mail_rcpt_desc`, `mail_rcpt_asc`, `subject_desc`, `subject_asc` | (Optional) List emails corresponding to specific criteria | -| flags.{index} | One of: `unknown_flag`, `soft_bounce`, `hard_bounce`, `spam`, `mailbox_full`, `mailbox_not_found`, `greylisted`, `send_before_expiration` | (Optional) List emails containing only specific flags | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Project settings management commands - -Project settings allow you to manage the configuration of your settings. - -Project settings allow you to manage the configuration of your settings. - -**Usage:** - -``` -scw tem project-settings -``` - - - -## Webhook management commands - -Webhooks enable real-time communication and automation between systems by sending messages through all protocols supported by SNS, such as HTTP, HTTPS, and Serverless Functions, allowing for immediate updates and actions based on specific events. This feature is in beta. You can request quotas from the [Scaleway betas page](https://www.scaleway.com/fr/betas/#email-webhooks). - - -### Create a Webhook - -Create a new Webhook triggered by a list of event types and pushed to a Scaleway SNS ARN. - -**Usage:** - -``` -scw tem webhook create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain-id | | ID of the Domain to watch for triggering events | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | | Name of the Webhook | -| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types that will trigger an event | -| sns-arn | | Scaleway SNS ARN topic to push the events to | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Webhook - -You must specify the Webhook you want to delete by the `region` and `webhook_id`. Deleting a Webhook is permanent and cannot be undone. - -**Usage:** - -``` -scw tem webhook delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| webhook-id | Required | ID of the Webhook to delete | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### Get information about a Webhook - -Retrieve information about a specific Webhook using the `webhook_id` and `region` parameters. - -**Usage:** - -``` -scw tem webhook get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| webhook-id | Required | ID of the Webhook to check | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - -### List Webhooks - -Retrieve Webhooks in a specific Project or in a specific Organization using the `region` parameter. - -**Usage:** - -``` -scw tem webhook list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_desc`, `created_at_asc` | (Optional) List Webhooks corresponding to specific criteria | -| project-id | | (Optional) ID of the Project for which to list the Webhooks | -| domain-id | | (Optional) ID of the Domain for which to list the Webhooks | -| organization-id | | (Optional) ID of the Organization for which to list the Webhooks | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### List Webhook triggered events - -Retrieve the list of Webhook events triggered from a specific Webhook or for a specific Project or Organization. You must specify the `region`. - -**Usage:** - -``` -scw tem webhook list-events [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_desc`, `created_at_asc` | (Optional) List Webhook events corresponding to specific criteria | -| webhook-id | Required | ID of the Webhook linked to the events | -| email-id | | ID of the email linked to the events | -| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types linked to the events | -| statuses.{index} | One of: `unknown_status`, `sending`, `sent`, `failed` | List of event statuses | -| project-id | | ID of the webhook Project | -| domain-id | | ID of the domain to watch for triggering events | -| organization-id | | ID of the webhook Organization | -| region | Default: `fr-par`
One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update a Webhook - -Update a Webhook events type, SNS ARN or name. - -**Usage:** - -``` -scw tem webhook update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| webhook-id | Required | ID of the Webhook to update | -| name | | Name of the Webhook to update | -| event-types.{index} | One of: `unknown_type`, `email_queued`, `email_dropped`, `email_deferred`, `email_delivered`, `email_spam`, `email_mailbox_not_found` | List of event types to update | -| sns-arn | | Scaleway SNS ARN topic to update | -| region | Default: `fr-par`
One of: `fr-par` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/version.md b/docs/docs/version.md deleted file mode 100644 index d4bfc94a81..0000000000 --- a/docs/docs/version.md +++ /dev/null @@ -1,6 +0,0 @@ - -# Documentation for `scw version` -Display cli version - - - diff --git a/docs/docs/vpc-gw.md b/docs/docs/vpc-gw.md deleted file mode 100644 index d672734595..0000000000 --- a/docs/docs/vpc-gw.md +++ /dev/null @@ -1,909 +0,0 @@ - -# Documentation for `scw vpc-gw` -This API allows you to manage your Public Gateways. - -- [DHCP configuration management](#dhcp-configuration-management) - - [Create a DHCP configuration](#create-a-dhcp-configuration) - - [Delete a DHCP configuration](#delete-a-dhcp-configuration) - - [Get a DHCP configuration](#get-a-dhcp-configuration) - - [List DHCP configurations](#list-dhcp-configurations) - - [Update a DHCP configuration](#update-a-dhcp-configuration) -- [DHCP entries management](#dhcp-entries-management) - - [Create a DHCP entry](#create-a-dhcp-entry) - - [Delete a DHCP entry](#delete-a-dhcp-entry) - - [Get a DHCP entry](#get-a-dhcp-entry) - - [List DHCP entries](#list-dhcp-entries) - - [Set all DHCP reservations on a Gateway Network](#set-all-dhcp-reservations-on-a-gateway-network) - - [Update a DHCP entry](#update-a-dhcp-entry) -- [Public Gateway management](#public-gateway-management) - - [Create a Public Gateway](#create-a-public-gateway) - - [Delete a Public Gateway](#delete-a-public-gateway) - - [Upgrade a Public Gateway to IP mobility](#upgrade-a-public-gateway-to-ip-mobility) - - [Get a Public Gateway](#get-a-public-gateway) - - [List Public Gateways](#list-public-gateways) - - [Refresh a Public Gateway's SSH keys](#refresh-a-public-gateway's-ssh-keys) - - [Update a Public Gateway](#update-a-public-gateway) - - [Upgrade a Public Gateway to the latest version and/or to a different commercial offer type](#upgrade-a-public-gateway-to-the-latest-version-andor-to-a-different-commercial-offer-type) -- [Gateway Networks management](#gateway-networks-management) - - [Attach a Public Gateway to a Private Network](#attach-a-public-gateway-to-a-private-network) - - [Detach a Public Gateway from a Private Network](#detach-a-public-gateway-from-a-private-network) - - [Get a Public Gateway connection to a Private Network](#get-a-public-gateway-connection-to-a-private-network) - - [List Public Gateway connections to Private Networks](#list-public-gateway-connections-to-private-networks) - - [Update a Public Gateway's connection to a Private Network](#update-a-public-gateway's-connection-to-a-private-network) -- [Gateway types information](#gateway-types-information) - - [List Public Gateway types](#list-public-gateway-types) -- [IP address management](#ip-address-management) - - [Reserve an IP](#reserve-an-ip) - - [Delete an IP](#delete-an-ip) - - [Get an IP](#get-an-ip) - - [List IPs](#list-ips) - - [Update an IP](#update-an-ip) -- [PAT rules management](#pat-rules-management) - - [Create a PAT rule](#create-a-pat-rule) - - [Delete a PAT rule](#delete-a-pat-rule) - - [Get a PAT rule](#get-a-pat-rule) - - [List PAT rules](#list-pat-rules) - - [Set all PAT rules](#set-all-pat-rules) - - [Update a PAT rule](#update-a-pat-rule) - - -## DHCP configuration management - -These objects define a DHCP configuration, i.e. how IP addresses should be assigned to devices on a Private Network attached to a Public Gateway. Definable parameters include the subnet for the DHCP server, the validity period for DHCP entries, whether to use dynamic pooling, and more. A DHCP configuration object has a DHCP ID, which can then be used as part of a call to create or update a Gateway Network. This lets you attach an existing DHCP configuration to a Public Gateway attached to a Private Network. Similarly, you can use a DHCP ID as a query parameter to list Gateway Networks which use this DHCP configuration object. - - -### Create a DHCP configuration - -Create a new DHCP configuration object, containing settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. The response object includes the ID of the DHCP configuration object. You can use this ID as part of a call to `Create a Public Gateway connection to a Private Network` or `Update a Public Gateway connection to a Private Network` to directly apply this DHCP configuration. - -**Usage:** - -``` -scw vpc-gw dhcp create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| subnet | Required | Subnet for the DHCP server | -| address | | IP address of the DHCP server. This will be the gateway's address in the Private Network. Defaults to the first address of the subnet | -| pool-low | | Low IP (inclusive) of the dynamic address pool. Must be in the config's subnet. Defaults to the second address of the subnet | -| pool-high | | High IP (inclusive) of the dynamic address pool. Must be in the config's subnet. Defaults to the last address of the subnet | -| enable-dynamic | | Defines whether to enable dynamic pooling of IPs. When false, only pre-existing DHCP reservations will be handed out. Defaults to true | -| valid-lifetime | | How long DHCP entries will be valid for. Defaults to 1h (3600s) | -| renew-timer | | After how long a renew will be attempted. Must be 30s lower than `rebind_timer`. Defaults to 50m (3000s) | -| rebind-timer | | After how long a DHCP client will query for a new lease if previous renews fail. Must be 30s lower than `valid_lifetime`. Defaults to 51m (3060s) | -| push-default-route | | Defines whether the gateway should push a default route to DHCP clients or only hand out IPs. Defaults to true | -| push-dns-server | | Defines whether the gateway should push custom DNS servers to clients. This allows for Instance hostname -> IP resolution. Defaults to true | -| dns-servers-override.{index} | | Array of DNS server IP addresses used to override the DNS server list pushed to DHCP clients, instead of the gateway itself | -| dns-search.{index} | | Array of search paths in addition to the pushed DNS configuration | -| dns-local-name | | TLD given to hostnames in the Private Network. Allowed characters are `a-z0-9-.`. Defaults to the slugified Private Network name if created along a GatewayNetwork, or else to `priv` | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a DHCP configuration - -Delete a DHCP configuration object, identified by its DHCP ID. Note that you cannot delete a DHCP configuration object that is currently being used by a Gateway Network. - -**Usage:** - -``` -scw vpc-gw dhcp delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-id | Required | DHCP configuration ID to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a DHCP configuration - -Get a DHCP configuration object, identified by its DHCP ID. The response object contains configuration settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. Note that the response does not contain the IDs of any Private Network / Public Gateway the configuration is attached to. Use the `List Public Gateway connections to Private Networks` method for that purpose, filtering on DHCP ID. - -**Usage:** - -``` -scw vpc-gw dhcp get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-id | Required | ID of the DHCP configuration to fetch | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List DHCP configurations - -List DHCP configurations, optionally filtering by Organization, Project, Public Gateway IP address or more. The response is an array of DHCP configuration objects, each identified by a DHCP ID and containing configuration settings for the assignment of IP addresses to devices on a Private Network attached to a Public Gateway. Note that the response does not contain the IDs of any Private Network / Public Gateway the configuration is attached to. Use the `List Public Gateway connections to Private Networks` method for that purpose, filtering on DHCP ID. - -**Usage:** - -``` -scw vpc-gw dhcp list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `subnet_asc`, `subnet_desc` | Order in which to return results | -| project-id | | Include only DHCP configuration objects in this Project | -| address | | Filter for DHCP configuration objects with this DHCP server IP address (the gateway's address in the Private Network) | -| has-address | | Filter for DHCP configuration objects with subnets containing this IP address | -| organization-id | | Include only DHCP configuration objects in this Organization | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a DHCP configuration - -Update a DHCP configuration object, identified by its DHCP ID. - -**Usage:** - -``` -scw vpc-gw dhcp update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-id | Required | DHCP configuration to update | -| subnet | | Subnet for the DHCP server | -| address | | IP address of the DHCP server. This will be the Public Gateway's address in the Private Network. It must be part of config's subnet | -| pool-low | | Low IP (inclusive) of the dynamic address pool. Must be in the config's subnet | -| pool-high | | High IP (inclusive) of the dynamic address pool. Must be in the config's subnet | -| enable-dynamic | | Defines whether to enable dynamic pooling of IPs. When false, only pre-existing DHCP reservations will be handed out. Defaults to true | -| valid-lifetime | | How long DHCP entries will be valid for | -| renew-timer | | After how long a renew will be attempted. Must be 30s lower than `rebind_timer` | -| rebind-timer | | After how long a DHCP client will query for a new lease if previous renews fail. Must be 30s lower than `valid_lifetime` | -| push-default-route | | Defines whether the gateway should push a default route to DHCP clients, or only hand out IPs | -| push-dns-server | | Defines whether the gateway should push custom DNS servers to clients. This allows for instance hostname -> IP resolution | -| dns-servers-override.{index} | | Array of DNS server IP addresses used to override the DNS server list pushed to DHCP clients, instead of the gateway itself | -| dns-search.{index} | | Array of search paths in addition to the pushed DNS configuration | -| dns-local-name | | TLD given to hostnames in the Private Networks. If an instance with hostname `foo` gets a lease, and this is set to `bar`, `foo.bar` will resolve. Allowed characters are `a-z0-9-.` | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## DHCP entries management - -DHCP entries belong to a specified Gateway Network (Public Gateway / Private Network connection). A DHCP entry can hold either a dynamic DHCP lease (an IP address dynamically assigned by the Public Gateway to a device) or a static, user-created DHCP reservation. - - -### Create a DHCP entry - -Create a static DHCP reservation, specifying the Gateway Network for the reservation, the MAC address of the target device and the IP address to assign this device. The response is a DHCP entry object, confirming the ID and configuration details of the static DHCP reservation. - -**Usage:** - -``` -scw vpc-gw dhcp-entry create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-network-id | | GatewayNetwork on which to create a DHCP reservation | -| mac-address | | MAC address to give a static entry to | -| ip-address | | IP address to give to the device | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a DHCP entry - -Delete a static DHCP reservation, identified by its DHCP entry ID. Note that you cannot delete DHCP entries of type `lease`, these are deleted automatically when their time-to-live expires. - -**Usage:** - -``` -scw vpc-gw dhcp-entry delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-entry-id | Required | ID of the DHCP entry to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a DHCP entry - -Get a DHCP entry, specified by its DHCP entry ID. - -**Usage:** - -``` -scw vpc-gw dhcp-entry get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-entry-id | Required | ID of the DHCP entry to fetch | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List DHCP entries - -List DHCP entries, whether dynamically assigned and/or statically reserved. DHCP entries can be filtered by the Gateway Network they are on, their MAC address, IP address, type or hostname. - -**Usage:** - -``` -scw vpc-gw dhcp-entry list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `ip_address_asc`, `ip_address_desc`, `hostname_asc`, `hostname_desc` | Order in which to return results | -| gateway-network-id | | Filter for entries on this GatewayNetwork | -| mac-address | | Filter for entries with this MAC address | -| ip-address | | Filter for entries with this IP address | -| hostname | | Filter for entries with this hostname substring | -| type | One of: `unknown`, `reservation`, `lease` | Filter for entries of this type | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Set all DHCP reservations on a Gateway Network - -Set the list of DHCP reservations attached to a Gateway Network. Reservations are identified by their MAC address, and will sync the current DHCP entry list to the given list, creating, updating or deleting DHCP entries accordingly. - -**Usage:** - -``` -scw vpc-gw dhcp-entry set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-network-id | | ID of the Gateway Network on which to set DHCP reservation list | -| dhcp-entries.{index}.mac-address | | MAC address to give a static entry to | -| dhcp-entries.{index}.ip-address | | IP address to give to the device | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a DHCP entry - -Update the IP address for a DHCP entry, specified by its DHCP entry ID. You can update an existing DHCP entry of any type (`reservation` (static), `lease` (dynamic) or `unknown`), but in manually updating the IP address the entry will necessarily be of type `reservation` after the update. - -**Usage:** - -``` -scw vpc-gw dhcp-entry update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| dhcp-entry-id | Required | ID of the DHCP entry to update | -| ip-address | | New IP address to give to the device | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Public Gateway management - -Public Gateways are building blocks for your infrastructure on Scaleway's shared public cloud. They provide a set of managed network services and features for Scaleway's Private Networks such as DHCP, NAT and routing. - - -### Create a Public Gateway - -Create a new Public Gateway in the specified Scaleway Project, defining its **name**, **type** and other configuration details such as whether to enable SSH bastion. - -**Usage:** - -``` -scw vpc-gw gateway create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| name | Default: `` | Name for the gateway | -| tags.{index} | | Tags for the gateway | -| type | Default: `VPC-GW-S` | Gateway type (commercial offer type) | -| upstream-dns-servers.{index} | | Array of DNS server IP addresses to override the gateway's default recursive DNS servers | -| ip-id | | Existing IP address to attach to the gateway | -| enable-smtp | | Defines whether SMTP traffic should be allowed pass through the gateway | -| enable-bastion | | Defines whether SSH bastion should be enabled the gateway | -| bastion-port | | Port of the SSH bastion | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a Public Gateway - -Delete an existing Public Gateway, specified by its gateway ID. This action is irreversible. - -**Usage:** - -``` -scw vpc-gw gateway delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to delete | -| cleanup-dhcp | | Defines whether to clean up attached DHCP configurations (if any, and if not attached to another Gateway Network) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Upgrade a Public Gateway to IP mobility - -Upgrade a Public Gateway to IP mobility (move from NAT IP to routed IP). This is idempotent: repeated calls after the first will return no error but have no effect. - -**Usage:** - -``` -scw vpc-gw gateway enable-ip-mobility [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to upgrade to IP mobility | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a Public Gateway - -Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. - -**Usage:** - -``` -scw vpc-gw gateway get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to fetch | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List Public Gateways - -List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. - -**Usage:** - -``` -scw vpc-gw gateway list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc`, `type_asc`, `type_desc`, `status_asc`, `status_desc` | Order in which to return results | -| project-id | | Include only gateways in this Project | -| name | | Filter for gateways which have this search term in their name | -| tags.{index} | | Filter for gateways with these tags | -| type | | Filter for gateways of this type | -| status | One of: `unknown`, `stopped`, `allocating`, `configuring`, `running`, `stopping`, `failed`, `deleting`, `deleted`, `locked` | Filter for gateways with this current status. Use `unknown` to include all statuses | -| private-network-id | | Filter for gateways attached to this Private nNetwork | -| organization-id | | Include only gateways in this Organization | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Refresh a Public Gateway's SSH keys - -Refresh the SSH keys of a given Public Gateway, specified by its gateway ID. This adds any new SSH keys in the gateway's Scaleway Project to the gateway itself. - -**Usage:** - -``` -scw vpc-gw gateway refresh-ssh-keys [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to refresh SSH keys on | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a Public Gateway - -Update the parameters of an existing Public Gateway, for example, its **name**, **tags**, **SSH bastion configuration**, and **DNS servers**. - -**Usage:** - -``` -scw vpc-gw gateway update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to update | -| name | | Name for the gateway | -| tags.{index} | | Tags for the gateway | -| upstream-dns-servers.{index} | | Array of DNS server IP addresses to override the gateway's default recursive DNS servers | -| enable-bastion | | Defines whether SSH bastion should be enabled the gateway | -| bastion-port | | Port of the SSH bastion | -| enable-smtp | | Defines whether SMTP traffic should be allowed to pass through the gateway | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Upgrade a Public Gateway to the latest version and/or to a different commercial offer type - -Upgrade a given Public Gateway to the newest software version or to a different commercial offer type. This applies the latest bugfixes and features to your Public Gateway. Note that gateway service will be interrupted during the update. - -**Usage:** - -``` -scw vpc-gw gateway upgrade [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | Required | ID of the gateway to upgrade | -| type | | Gateway type (commercial offer) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Gateway Networks management - -A Gateway Network represents the connection of a Private Network to a Public Gateway. It holds configuration options relative to this specific connection, such as the DHCP configuration. - - -### Attach a Public Gateway to a Private Network - -Attach a specific Public Gateway to a specific Private Network (create a GatewayNetwork). You can configure parameters for the connection including DHCP settings, whether to enable masquerade (dynamic NAT), and more. - -**Usage:** - -``` -scw vpc-gw gateway-network create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | | Public Gateway to connect | -| private-network-id | | Private Network to connect | -| enable-masquerade | | Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. | -| enable-dhcp | | Defines whether to enable DHCP on this Private Network. | -| dhcp-id | | ID of an existing DHCP configuration object to use for this GatewayNetwork | -| address | | Static IP address in CIDR format to to use without DHCP | -| ipam-config.push-default-route | | Enabling the default route also enables masquerading | -| ipam-config.ipam-ip-id | | Use this IPAM-booked IP ID as the Gateway's IP in this Private Network | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Detach a Public Gateway from a Private Network - -Detach a given Public Gateway from a given Private Network, i.e. delete a GatewayNetwork specified by a gateway_network_id. - -**Usage:** - -``` -scw vpc-gw gateway-network delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-network-id | Required | ID of the GatewayNetwork to delete | -| cleanup-dhcp | | Defines whether to clean up attached DHCP configurations (if any, and if not attached to another Gateway Network) | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a Public Gateway connection to a Private Network - -Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. - -**Usage:** - -``` -scw vpc-gw gateway-network get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-network-id | Required | ID of the GatewayNetwork to fetch | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List Public Gateway connections to Private Networks - -List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. - -**Usage:** - -``` -scw vpc-gw gateway-network list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `status_asc`, `status_desc` | Order in which to return results | -| gateway-id | | Filter for GatewayNetworks connected to this gateway | -| private-network-id | | Filter for GatewayNetworks connected to this Private Network | -| enable-masquerade | | Filter for GatewayNetworks with this `enable_masquerade` setting | -| dhcp-id | | Filter for GatewayNetworks using this DHCP configuration | -| status | One of: `unknown`, `created`, `attaching`, `configuring`, `ready`, `detaching`, `deleted` | Filter for GatewayNetworks with this current status this status. Use `unknown` to include all statuses | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a Public Gateway's connection to a Private Network - -Update the configuration parameters of a connection between a given Public Gateway and Private Network (the connection = a GatewayNetwork). Updatable parameters include DHCP settings and whether to enable traffic masquerade (dynamic NAT). - -**Usage:** - -``` -scw vpc-gw gateway-network update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-network-id | Required | ID of the GatewayNetwork to update | -| enable-masquerade | | Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. | -| enable-dhcp | | Defines whether to enable DHCP on this Private Network. | -| dhcp-id | | ID of the new DHCP configuration object to use with this GatewayNetwork | -| address | | New static IP address | -| ipam-config.push-default-route | | Enabling the default route also enables masquerading | -| ipam-config.ipam-ip-id | | Use this IPAM-booked IP ID as the Gateway's IP in this Private Network | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## Gateway types information - -Public Gateways come in various shapes, sizes and prices, which are described by gateway types. They represent the different commercial offer types for Public Gateways available at Scaleway. - - -### List Public Gateway types - -List the different Public Gateway commercial offer types available at Scaleway. The response is an array of objects describing the name and technical details of each available gateway type. - -**Usage:** - -``` -scw vpc-gw gateway-type list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## IP address management - -Public, flexible IP addresses for Public Gateways, allowing the gateway to reach the public internet, as well as forward (masquerade) traffic from member devices of attached Private Networks. - - -### Reserve an IP - -Create (reserve) a new flexible IP address that can be used for a Public Gateway in a specified Scaleway Project. - -**Usage:** - -``` -scw vpc-gw ip create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags to give to the IP address | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete an IP - -Delete a flexible IP address from your account. This action is irreversible. - -**Usage:** - -``` -scw vpc-gw ip delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the IP address to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get an IP - -Get details of a Public Gateway flexible IP address, identified by its IP ID. The response object contains information including which (if any) Public Gateway using this IP address, the reverse and various other metadata. - -**Usage:** - -``` -scw vpc-gw ip get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the IP address to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List IPs - -List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. - -**Usage:** - -``` -scw vpc-gw ip list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `ip_asc`, `ip_desc`, `reverse_asc`, `reverse_desc` | Order in which to return results | -| project-id | | Filter for IP addresses in this Project | -| tags.{index} | | Filter for IP addresses with these tags | -| reverse | | Filter for IP addresses that have a reverse containing this string | -| is-free | | Filter based on whether the IP is attached to a gateway or not | -| organization-id | | Filter for IP addresses in this Organization | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Update an IP - -Update details of an existing flexible IP address, including its tags, reverse and the Public Gateway it is assigned to. - -**Usage:** - -``` -scw vpc-gw ip update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| ip-id | Required | ID of the IP address to update | -| tags.{index} | | Tags to give to the IP address | -| reverse | | Reverse to set on the address. Empty string to unset | -| gateway-id | | Gateway to attach the IP address to. Empty string to detach | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -## PAT rules management - -PAT (Port Address Translation) rules, aka static NAT rules, belong to a specified Public Gateway. They define the forwarding of a public port to a specific device on a Private Network, enabling enables ingress traffic from the public Internet to reach the correct device in the Private Network. - - -### Create a PAT rule - -Create a new PAT rule on a specified Public Gateway, defining the protocol to use, public port to listen on, and private port / IP address to map to. - -**Usage:** - -``` -scw vpc-gw pat-rule create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | | ID of the Gateway on which to create the rule | -| public-port | | Public port to listen on | -| private-ip | | Private IP to forward data to | -| private-port | | Private port to translate to | -| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Delete a PAT rule - -Delete a PAT rule, identified by its PAT rule ID. This action is irreversible. - -**Usage:** - -``` -scw vpc-gw pat-rule delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pat-rule-id | Required | ID of the PAT rule to delete | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Get a PAT rule - -Get a PAT rule, specified by its PAT rule ID. The response object gives full details of the PAT rule, including the Public Gateway it belongs to and the configuration settings in terms of public / private ports, private IP and protocol. - -**Usage:** - -``` -scw vpc-gw pat-rule get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pat-rule-id | Required | ID of the PAT rule to get | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### List PAT rules - -List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. - -**Usage:** - -``` -scw vpc-gw pat-rule list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `public_port_asc`, `public_port_desc` | Order in which to return results | -| gateway-id | | Filter for PAT rules on this Gateway | -| private-ip | | Filter for PAT rules targeting this private ip | -| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Filter for PAT rules with this protocol | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3`, `all` | Zone to target. If none is passed will use default zone from the config | - - - -### Set all PAT rules - -Set a definitive list of PAT rules attached to a Public Gateway. Each rule is identified by its public port and protocol. This will sync the current PAT rule list on the gateway with the new list, creating, updating or deleting PAT rules accordingly. - -**Usage:** - -``` -scw vpc-gw pat-rule set [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| gateway-id | | ID of the gateway on which to set the PAT rules | -| pat-rules.{index}.public-port | | Public port to listen on | -| pat-rules.{index}.private-ip | | Private IP to forward data to | -| pat-rules.{index}.private-port | | Private port to translate to | -| pat-rules.{index}.protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - -### Update a PAT rule - -Update a PAT rule, specified by its PAT rule ID. Configuration settings including private/public port, private IP address and protocol can all be updated. - -**Usage:** - -``` -scw vpc-gw pat-rule update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| pat-rule-id | Required | ID of the PAT rule to update | -| public-port | | Public port to listen on | -| private-ip | | Private IP to forward data to | -| private-port | | Private port to translate to | -| protocol | One of: `unknown`, `both`, `tcp`, `udp` | Protocol the rule should apply to | -| zone | Default: `fr-par-1`
One of: `fr-par-1`, `fr-par-2`, `nl-ams-1`, `nl-ams-2`, `nl-ams-3`, `pl-waw-1`, `pl-waw-2`, `pl-waw-3` | Zone to target. If none is passed will use default zone from the config | - - - diff --git a/docs/docs/vpc.md b/docs/docs/vpc.md deleted file mode 100644 index 5141adc9f4..0000000000 --- a/docs/docs/vpc.md +++ /dev/null @@ -1,465 +0,0 @@ - -# Documentation for `scw vpc` -This API allows you to manage your Virtual Private Clouds (VPCs) and Private Networks. - -- [Private network management command](#private-network-management-command) - - [Create a Private Network](#create-a-private-network) - - [Delete a Private Network](#delete-a-private-network) - - [Enable DHCP on a Private Network](#enable-dhcp-on-a-private-network) - - [Get a Private Network](#get-a-private-network) - - [List Private Networks](#list-private-networks) - - [Migrate Private Networks from zoned to regional](#migrate-private-networks-from-zoned-to-regional) - - [Update Private Network](#update-private-network) -- [Route management command](#route-management-command) - - [Create a Route](#create-a-route) - - [Delete a Route](#delete-a-route) - - [Enable routing on a VPC](#enable-routing-on-a-vpc) - - [Get a Route](#get-a-route) - - [Return routes with associated next hop data](#return-routes-with-associated-next-hop-data) - - [Update Route](#update-route) -- [Subnet management command](#subnet-management-command) -- [VPC management command](#vpc-management-command) - - [Create a VPC](#create-a-vpc) - - [Delete a VPC](#delete-a-vpc) - - [Get a VPC](#get-a-vpc) - - [List VPCs](#list-vpcs) - - [Update VPC](#update-vpc) - - -## Private network management command - -A Private Network allows you to interconnect your Scaleway resources -in an isolated and private network. Network reachability is limited -to resources that are on the same Private Network. Note that a -resource can be a part of multiple private networks. - - -### Create a Private Network - -Create a new Private Network. Once created, you can attach Scaleway resources which are in the same region. - -**Usage:** - -``` -scw vpc private-network create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name for the Private Network | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags for the Private Network | -| subnets.{index} | | Private Network subnets CIDR | -| vpc-id | | VPC in which to create the Private Network | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Private Network - -Delete an existing Private Network. Note that you must first detach all resources from the network, in order to delete it. - -**Usage:** - -``` -scw vpc private-network delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| private-network-id | Required | Private Network ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable DHCP on a Private Network - -Enable DHCP managed on an existing Private Network. Note that you will not be able to deactivate it afterwards. - -**Usage:** - -``` -scw vpc private-network enable-dhcp [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| private-network-id | Required | Private Network ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Private Network - -Retrieve information about an existing Private Network, specified by its Private Network ID. Its full details are returned in the response object. - -**Usage:** - -``` -scw vpc private-network get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| private-network-id | Required | Private Network ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List Private Networks - -List existing Private Networks in the specified region. By default, the Private Networks returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. - -**Usage:** - -``` -scw vpc private-network list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned Private Networks | -| name | | Name to filter for. Only Private Networks with names containing this string will be returned | -| tags.{index} | | Tags to filter for. Only Private Networks with one or more matching tags will be returned | -| project-id | | Project ID to filter for. Only Private Networks belonging to this Project will be returned | -| private-network-ids.{index} | | Private Network IDs to filter for. Only Private Networks with one of these IDs will be returned | -| vpc-id | | VPC ID to filter for. Only Private Networks belonging to this VPC will be returned | -| dhcp-enabled | | DHCP status to filter for. When true, only Private Networks with managed DHCP enabled will be returned | -| organization-id | | Organization ID to filter for. Only Private Networks belonging to this Organization will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Migrate Private Networks from zoned to regional - -Transform multiple existing zoned Private Networks (scoped to a single Availability Zone) into regional Private Networks, scoped to an entire region. You can transform one or many Private Networks (specified by their Private Network IDs) within a single Scaleway Organization or Project, with the same call. - -**Usage:** - -``` -scw vpc private-network migrate-to-regional [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| private-network-ids.{index} | Required | IDs of the Private Networks to migrate | -| organization-id | | Organization ID to use. If none is passed the default organization ID will be used | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Update Private Network - -Update parameters (such as name or tags) of an existing Private Network, specified by its Private Network ID. - -**Usage:** - -``` -scw vpc private-network update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| private-network-id | Required | Private Network ID | -| name | | Name for the Private Network | -| tags.{index} | | Tags for the Private Network | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Route management command - -Custom routes. - - -### Create a Route - -Create a new custom Route. - -**Usage:** - -``` -scw vpc route create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| description | | Route description | -| tags.{index} | | Tags of the Route | -| vpc-id | | VPC the Route belongs to | -| destination | | Destination of the Route | -| nexthop-resource-id | | ID of the nexthop resource | -| nexthop-private-network-id | | ID of the nexthop private network | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Route - -Delete a Route specified by its Route ID. - -**Usage:** - -``` -scw vpc route delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Enable routing on a VPC - -Enable routing on an existing VPC. Note that you will not be able to deactivate it afterwards. - -**Usage:** - -``` -scw vpc route enable-routing [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| vpc-id | Required | VPC ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a Route - -Retrieve details of an existing Route, specified by its Route ID. - -**Usage:** - -``` -scw vpc route get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Return routes with associated next hop data - -Return routes with associated next hop data. - -**Usage:** - -``` -scw vpc route list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `destination_asc`, `destination_desc`, `prefix_len_asc`, `prefix_len_desc` | Sort order of the returned routes | -| vpc-id | | VPC to filter for. Only routes within this VPC will be returned | -| nexthop-resource-id | | Next hop resource ID to filter for. Only routes with a matching next hop resource ID will be returned | -| nexthop-private-network-id | | Next hop private network ID to filter for. Only routes with a matching next hop private network ID will be returned | -| nexthop-resource-type | One of: `unknown_type`, `vpc_gateway_network`, `instance_private_nic`, `baremetal_private_nic` | Next hop resource type to filter for. Only Routes with a matching next hop resource type will be returned | -| contains | | Only routes whose destination is contained in this subnet will be returned | -| tags.{index} | | Tags to filter for, only routes with one or more matching tags will be returned | -| is-ipv6 | | Only routes with an IPv6 destination will be returned | -| region | Default: `fr-par`
One of: `all` | Region to target. If none is passed will use default region from the config | - - - -### Update Route - -Update parameters of the specified Route. - -**Usage:** - -``` -scw vpc route update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| route-id | Required | Route ID | -| description | | Route description | -| tags.{index} | | Tags of the Route | -| destination | | Destination of the Route | -| nexthop-resource-id | | ID of the nexthop resource | -| nexthop-private-network-id | | ID of the nexthop private network | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -## Subnet management command - -CIDR Subnet. - -CIDR Subnet. - -**Usage:** - -``` -scw vpc subnet -``` - - - -## VPC management command - -A Virtual Private Cloud (VPC) allows you to group your regional -Private Networks together. Note that a Private Network can be a -part of only one VPC. - - -### Create a VPC - -Create a new VPC in the specified region. - -**Usage:** - -``` -scw vpc vpc create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| name | Required
Default: `` | Name for the VPC | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| tags.{index} | | Tags for the VPC | -| enable-routing | | Enable routing between Private Networks in the VPC | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Delete a VPC - -Delete a VPC specified by its VPC ID. - -**Usage:** - -``` -scw vpc vpc delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| vpc-id | Required | VPC ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### Get a VPC - -Retrieve details of an existing VPC, specified by its VPC ID. - -**Usage:** - -``` -scw vpc vpc get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| vpc-id | Required | VPC ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - -### List VPCs - -List existing VPCs in the specified region. - -**Usage:** - -``` -scw vpc vpc list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | Sort order of the returned VPCs | -| name | | Name to filter for. Only VPCs with names containing this string will be returned | -| tags.{index} | | Tags to filter for. Only VPCs with one more more matching tags will be returned | -| project-id | | Project ID to filter for. Only VPCs belonging to this Project will be returned | -| is-default | | Defines whether to filter only for VPCs which are the default one for their Project | -| routing-enabled | | Defines whether to filter only for VPCs which route traffic between their Private Networks | -| organization-id | | Organization ID to filter for. Only VPCs belonging to this Organization will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw`, `all` | Region to target. If none is passed will use default region from the config | - - - -### Update VPC - -Update parameters including name and tags of the specified VPC. - -**Usage:** - -``` -scw vpc vpc update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| vpc-id | Required | VPC ID | -| name | | Name for the VPC | -| tags.{index} | | Tags for the VPC | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config | - - - diff --git a/docs/docs/webhosting.md b/docs/docs/webhosting.md deleted file mode 100644 index 1d6a76da08..0000000000 --- a/docs/docs/webhosting.md +++ /dev/null @@ -1,348 +0,0 @@ - -# Documentation for `scw webhosting` -This API allows you to manage your Web Hosting services. - -- [Control Panels](#control-panels) - - ["List the control panels type: cpanel or plesk."](#"list-the-control-panels-type:-cpanel-or-plesk.") -- [Hosting management commands](#hosting-management-commands) - - [Order a Web Hosting plan](#order-a-web-hosting-plan) - - [Create a user session](#create-a-user-session) - - [Delete a Web Hosting plan](#delete-a-web-hosting-plan) - - [Get a Web Hosting plan](#get-a-web-hosting-plan) - - [Get DNS records](#get-dns-records) - - [List all Web Hosting plans](#list-all-web-hosting-plans) - - [Restore a Web Hosting plan](#restore-a-web-hosting-plan) - - [Update a Web Hosting plan](#update-a-web-hosting-plan) -- [Offer management commands](#offer-management-commands) - - [List all offers](#list-all-offers) - - -## Control Panels - -Control panels represent the kind of administration panel to manage your Web Hosting plan, cPanel or plesk. - - -### "List the control panels type: cpanel or plesk." - -"List the control panels type: cpanel or plesk.". - -**Usage:** - -``` -scw webhosting control-panel list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - - -## Hosting management commands - -With a Scaleway Web Hosting plan, you can manage your domain, configure your web hosting services, manage your emails and more. Create, list, update and delete your Web Hosting plans with these calls. - - -### Order a Web Hosting plan - -Order a Web Hosting plan, specifying the offer type required via the `offer_id` parameter. - -**Usage:** - -``` -scw webhosting hosting create [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| offer-id | | ID of the selected offer for the Web Hosting plan | -| project-id | | Project ID to use. If none is passed the default project ID will be used | -| email | | Contact email for the Web Hosting client | -| tags.{index} | | List of tags for the Web Hosting plan | -| domain | | Domain name to link to the Web Hosting plan. You must already own this domain name, and have completed the DNS validation process beforehand | -| option-ids.{index} | | IDs of any selected additional options for the Web Hosting plan | -| language | One of: `unknown_language_code`, `en_US`, `fr_FR`, `de_DE` | Default language for the control panel interface | -| domain-configuration.update-nameservers | | | -| domain-configuration.update-web-record | | | -| domain-configuration.update-mail-record | | | -| domain-configuration.update-all-records | | | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Create a user session - -Create a user session. - -**Usage:** - -``` -scw webhosting hosting create-session [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hosting-id | Required | Hosting ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - - -### Delete a Web Hosting plan - -Delete a Web Hosting plan, specified by its `hosting_id`. Note that deletion is not immediate: it will take place at the end of the calendar month, after which time your Web Hosting plan and all its data (files and emails) will be irreversibly lost. - -**Usage:** - -``` -scw webhosting hosting delete [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hosting-id | Required | Hosting ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Delete a Hosting with the given ID -``` -scw webhosting hosting delete hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - - - - -### Get a Web Hosting plan - -Get the details of one of your existing Web Hosting plans, specified by its `hosting_id`. - -**Usage:** - -``` -scw webhosting hosting get [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hosting-id | Required | Hosting ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get a Hosting with the given ID -``` -scw webhosting hosting get hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - - - - -### Get DNS records - -Get the set of DNS records of a specified domain associated with a Web Hosting plan. - -**Usage:** - -``` -scw webhosting hosting get-dns-records [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| domain | Required | Domain associated with the DNS records | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Get DNS records associated to the given domain -``` -scw webhosting hosting get-dns-records domain=foo.com -``` - - - - -### List all Web Hosting plans - -List all of your existing Web Hosting plans. Various filters are available to limit the results, including filtering by domain, status, tag and Project ID. - -**Usage:** - -``` -scw webhosting hosting list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `created_at_asc`, `created_at_desc` | Sort order for Web Hosting plans in the response | -| tags.{index} | | Tags to filter for, only Web Hosting plans with matching tags will be returned | -| statuses.{index} | One of: `unknown_status`, `delivering`, `ready`, `deleting`, `error`, `locked`, `migrating` | Statuses to filter for, only Web Hosting plans with matching statuses will be returned | -| domain | | Domain to filter for, only Web Hosting plans associated with this domain will be returned | -| project-id | | Project ID to filter for, only Web Hosting plans from this Project will be returned | -| control-panels.{index} | | Name of the control panel to filter for, only Web Hosting plans from this control panel will be returned | -| organization-id | | Organization ID to filter for, only Web Hosting plans from this Organization will be returned | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams`, `all` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all hostings of a given project ID -``` -scw webhosting hosting list project-id=a3244331-5d32-4e36-9bf9-b60233e201c7 organization-id=a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - - - - -### Restore a Web Hosting plan - -When you [delete a Web Hosting plan](#path-hostings-delete-a-hosting), definitive deletion does not take place until the end of the calendar month. In the time between initiating the deletion, and definitive deletion at the end of the month, you can choose to **restore** the Web Hosting plan, using this endpoint and specifying its `hosting_id`. - -**Usage:** - -``` -scw webhosting hosting restore [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hosting-id | Required | Hosting ID | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Restore a Hosting with the given ID -``` -scw webhosting hosting restore hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - - - - -### Update a Web Hosting plan - -Update the details of one of your existing Web Hosting plans, specified by its `hosting_id`. You can update parameters including the contact email address, tags, options and offer. - -**Usage:** - -``` -scw webhosting hosting update [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| hosting-id | Required | Hosting ID | -| email | | New contact email for the Web Hosting plan | -| tags.{index} | | New tags for the Web Hosting plan | -| option-ids.{index} | | IDs of the new options for the Web Hosting plan | -| offer-id | | ID of the new offer for the Web Hosting plan | -| protected | | Whether the hosting is protected or not | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -Update the contact email of a given hosting -``` -scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 email=foobar@example.com -``` - -Overwrite tags of a given hosting -``` -scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 tags.0=foo tags.1=bar -``` - -Overwrite options of a given hosting -``` -scw webhosting hosting update hosting-id=11111111-1111-1111-1111-111111111111 option-ids.0=22222222-2222-2222-2222-222222222222 option-ids.1=33333333-3333-3333-3333-333333333333 -``` - - - - -## Offer management commands - -Web Hosting offers represent the different types of Web Hosting plan available to order at Scaleway. - - -### List all offers - -List the different Web Hosting offers, and their options, available to order from Scaleway. - -**Usage:** - -``` -scw webhosting offer list [arg=value ...] -``` - - -**Args:** - -| Name | | Description | -|------|---|-------------| -| order-by | One of: `price_asc` | Sort order of offers in the response | -| without-options | | Defines whether the response should consist of offers only, without options | -| only-options | | Defines whether the response should consist of options only, without offers | -| hosting-id | | ID of a Web Hosting plan, to check compatibility with returned offers (in case of wanting to update the plan) | -| control-panels.{index} | | Name of the control panel to filter for | -| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config | - - -**Examples:** - - -List all offers available for purchase -``` -scw webhosting offer list hosting-id=a3244331-5d32-4e36-9bf9-b60233e201c7 -``` - -List only offers, no options -``` -scw webhosting offer list without-options=true -``` - -List only options -``` -scw webhosting offer list only-options=true -``` - - - - From f6104062065b1b02b4c76b46bb6f94d6b4790bb8 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Mon, 25 Nov 2024 16:08:13 +0100 Subject: [PATCH 06/19] feat(docs): update warning on landing page --- docs/commands/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/commands/index.md b/docs/commands/index.md index add128979b..1cb72e0cdb 100644 --- a/docs/commands/index.md +++ b/docs/commands/index.md @@ -11,7 +11,7 @@ Scaleway CLI is a tool to help you pilot your Scaleway infrastructure directly from your terminal. -!!! note +!!! warning This website is under construction and may contain out-of-date information. Refer to the [Scaleway CLI repository](https://github.com/scaleway/scaleway-cli) for the latest release. From 9b30d256f88e7b9351837d4d73141140fa2772d3 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Mon, 25 Nov 2024 16:48:05 +0100 Subject: [PATCH 07/19] feat(docs): update actions with on release trigger --- .github/workflows/deploy-docs.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 49355df6aa..4ce5ac4bec 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,8 +1,11 @@ name: Build and push CLI doc to S3 -on: +on: pull_request: push: # "pull_request" and "push" events are only for testing purposes, final trigger event should be "release" # release: # Must define which of [published, unpublished, created, edited, deleted, prereleased, released] apply + release: + types: + - published # Triggered only when a new release is published branches: - master permissions: @@ -12,9 +15,12 @@ jobs: runs-on: ubuntu-latest environment: actions # Is this necessary if we use the "env:" context below ? steps: - - uses: actions/checkout@v4 + - name: Check out the release tag + uses: actions/checkout@v4 + with: + ref: ${{ github.event.release.tag_name }} - name: prepare temporary folder for build - run: | # Creates a temporary "docs" folder with the existing "docs" folder because the markdown files to build must be in a "docs" folder for MKdocs to work + run: | # Creates a temporary "docs" folder within the existing "docs" folder because the mkdocs.yml must be in the parent folder of the markdown pages cd docs mkdir docs cp commands/* docs/ @@ -32,8 +38,8 @@ jobs: env: CLI_DOC_ACCESS_KEY: ${{ secrets.CLI_DOC_ACCESS_KEY }} CLI_DOC_SECRET_KEY: ${{ secrets.CLI_DOC_SECRET_KEY }} - run: | # AWS region "fr-par" is a placeholder as the CLI_DOC_S3_ENDPOINT variable overrides it - aws configure set aws_access_key_id $CLI_DOC_ACCESS_KEY + run: | # AWS region "fr-par" is a placeholder as the CLI_DOC_S3_ENDPOINT variable overrides it + aws configure set aws_access_key_id $CLI_DOC_ACCESS_KEY aws configure set aws_secret_access_key $CLI_DOC_SECRET_KEY aws configure set region fr-par @@ -44,4 +50,4 @@ jobs: run: | aws s3 cp --recursive ./docs/site/ s3://$CLI_DOC_BUCKET_NAME --endpoint-url $CLI_DOC_S3_ENDPOINT - name: Delete temporary folder - run: rm -rf docs/docs/ \ No newline at end of file + run: rm -rf docs/docs/ From aaf8b57ddea7cea41f776cdc249eea0db7f14012 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 27 Nov 2024 17:40:02 +0100 Subject: [PATCH 08/19] feat(docs): test if new build overwrites --- docs/commands/account.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index ee0402c7ad..527c4022d5 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -1,7 +1,8 @@ -# Documentation for `scw account` +# Documentation for the `scw account` command + This API allows you to manage your Scaleway Projects. - + - [Project management commands](#project-management-commands) - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) - [Delete an existing Project](#delete-an-existing-project) @@ -9,7 +10,7 @@ This API allows you to manage your Scaleway Projects. - [List all Projects of an Organization](#list-all-projects-of-an-organization) - [Update Project](#update-project) - + ## Project management commands Project management commands. From 9493647df8da95943165678eb2a590f93a477143 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 27 Nov 2024 17:42:40 +0100 Subject: [PATCH 09/19] feat(docs): reverting changes for test (it worked) --- docs/commands/account.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index 527c4022d5..8f91ddcdbd 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -1,5 +1,5 @@ -# Documentation for the `scw account` command +# Documentation for `scw account` This API allows you to manage your Scaleway Projects. From ceca3871218563986921cd32624f7871d112870c Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 27 Nov 2024 17:48:30 +0100 Subject: [PATCH 10/19] feat(docs): test printing release tag --- .github/workflows/deploy-docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 4ce5ac4bec..9e8c58ae60 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -19,6 +19,8 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.release.tag_name }} + - name: Print latest release tag + run: echo"${{ github.event.release.tag_name }}" - name: prepare temporary folder for build run: | # Creates a temporary "docs" folder within the existing "docs" folder because the mkdocs.yml must be in the parent folder of the markdown pages cd docs From 583247085d01d2e89b9320d4a2aa81577030b125 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Wed, 27 Nov 2024 17:52:43 +0100 Subject: [PATCH 11/19] feat(docs): test checking release commit --- .github/workflows/deploy-docs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 9e8c58ae60..6685199403 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -19,8 +19,10 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.release.tag_name }} - - name: Print latest release tag - run: echo"${{ github.event.release.tag_name }}" + - name: Verify release commit + run: | + echo "Checked out commit: $(git rev-parse HEAD)" + echo "Expected tag: ${{ github.event.release.tag_name }}" - name: prepare temporary folder for build run: | # Creates a temporary "docs" folder within the existing "docs" folder because the mkdocs.yml must be in the parent folder of the markdown pages cd docs From 48592367c562af12f28d00eadd66874fca896038 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:36:36 +0100 Subject: [PATCH 12/19] feat(docs): remove on push trigger --- .github/workflows/deploy-docs.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 6685199403..a2a1cafaed 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,8 +1,5 @@ name: Build and push CLI doc to S3 on: - pull_request: - push: # "pull_request" and "push" events are only for testing purposes, final trigger event should be "release" - # release: # Must define which of [published, unpublished, created, edited, deleted, prereleased, released] apply release: types: - published # Triggered only when a new release is published From 3426dc79f92914570bb7f28c72789fc364f56842 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:40:54 +0100 Subject: [PATCH 13/19] feat(docs): add comment on commit/tag comparison --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index a2a1cafaed..ab2d875baf 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -17,7 +17,7 @@ jobs: with: ref: ${{ github.event.release.tag_name }} - name: Verify release commit - run: | + run: | # Commit hash to compare with the commit returned by actions/checkout@v4 - Tag to compare with the latest release echo "Checked out commit: $(git rev-parse HEAD)" echo "Expected tag: ${{ github.event.release.tag_name }}" - name: prepare temporary folder for build From 515ba4fca711826c1e0a1216bc8ca294b265f660 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:45:32 +0100 Subject: [PATCH 14/19] feat(docs): update --- .github/workflows/deploy-docs.yml | 2 +- docs/commands/account.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index ab2d875baf..92bfc758f8 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -17,7 +17,7 @@ jobs: with: ref: ${{ github.event.release.tag_name }} - name: Verify release commit - run: | # Commit hash to compare with the commit returned by actions/checkout@v4 - Tag to compare with the latest release + run: | # Commit hash to compare with the commit returned by actions/checkout@v4 - Tag to compare with the latest releas echo "Checked out commit: $(git rev-parse HEAD)" echo "Expected tag: ${{ github.event.release.tag_name }}" - name: prepare temporary folder for build diff --git a/docs/commands/account.md b/docs/commands/account.md index 8f91ddcdbd..08f3d5d9c2 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -3,6 +3,7 @@ This API allows you to manage your Scaleway Projects. + - [Project management commands](#project-management-commands) - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) - [Delete an existing Project](#delete-an-existing-project) @@ -11,6 +12,7 @@ This API allows you to manage your Scaleway Projects. - [Update Project](#update-project) + ## Project management commands Project management commands. From ed2e3b913a6736babb170b525cfeb8c53e06afaf Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:47:46 +0100 Subject: [PATCH 15/19] feat(docs): update --- docs/commands/account.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index 08f3d5d9c2..cc764723de 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -3,7 +3,6 @@ This API allows you to manage your Scaleway Projects. - - [Project management commands](#project-management-commands) - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) - [Delete an existing Project](#delete-an-existing-project) @@ -11,8 +10,6 @@ This API allows you to manage your Scaleway Projects. - [List all Projects of an Organization](#list-all-projects-of-an-organization) - [Update Project](#update-project) - - ## Project management commands Project management commands. From 58ac7899d45419cdad2f1599ade96e38e3c3886c Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:50:12 +0100 Subject: [PATCH 16/19] feat(docs): update --- docs/commands/account.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/commands/account.md b/docs/commands/account.md index cc764723de..8f91ddcdbd 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -10,6 +10,7 @@ This API allows you to manage your Scaleway Projects. - [List all Projects of an Organization](#list-all-projects-of-an-organization) - [Update Project](#update-project) + ## Project management commands Project management commands. From 1061cd70d97696eff02bcf3a057ade93a4b94c0a Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:51:24 +0100 Subject: [PATCH 17/19] feat(docs): update --- docs/commands/account.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index 8f91ddcdbd..14f22c00d9 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -2,14 +2,14 @@ # Documentation for `scw account` This API allows you to manage your Scaleway Projects. - + - [Project management commands](#project-management-commands) - [Create a new Project for an Organization](#create-a-new-project-for-an-organization) - [Delete an existing Project](#delete-an-existing-project) - [Get an existing Project](#get-an-existing-project) - [List all Projects of an Organization](#list-all-projects-of-an-organization) - [Update Project](#update-project) - + ## Project management commands From 8f8bb822a698b8aeff13bf6aa76f9a02f2d357e4 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:51:55 +0100 Subject: [PATCH 18/19] feat(docs): update --- docs/commands/account.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index 14f22c00d9..cfb6f2d960 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -1,6 +1,5 @@ # Documentation for `scw account` - This API allows you to manage your Scaleway Projects. - [Project management commands](#project-management-commands) From 3b65e8b2492d060f2b1f25a326b344ec46f4fd15 Mon Sep 17 00:00:00 2001 From: SamyOubouaziz Date: Thu, 28 Nov 2024 16:52:49 +0100 Subject: [PATCH 19/19] feat(docs): update --- docs/commands/account.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/commands/account.md b/docs/commands/account.md index cfb6f2d960..ee0402c7ad 100644 --- a/docs/commands/account.md +++ b/docs/commands/account.md @@ -8,8 +8,8 @@ This API allows you to manage your Scaleway Projects. - [Get an existing Project](#get-an-existing-project) - [List all Projects of an Organization](#list-all-projects-of-an-organization) - [Update Project](#update-project) - + ## Project management commands Project management commands.

)piKZY<_h|cN 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%0AmX1-z`$-5L)>o#g!U>4 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