:: digital ocean fleet management :: :::: :: /? 310 :: :: :::: sivtyv-barnel :: !: |% ++ droplet $: id=@ name=@t memory=@ud vcpus=@ud disk=@ud locked=? created=@t status=@t backup-ids=(list ,@t) snapshot-ids=(list ,@t) features=(list ,@t) region=[name=@t slug=@t sizes=(list ,@t)] image=img size=json size-slug=@t networks=ntwrks kernel=kern next-backup-window=json == ++ kern ,[id=@ud name=@t version=@t] ++ img $: id=@ud name=@t distribution=@t slug=@t public=? regions=(list ,@t) created-at=@t type=@t min-disk-size=@ud == ++ ntwrks ,[v4=(list v) v6=(list v)] ++ v ,[ip-address=@t netmask=@t gateway=@t type=@t] ++ size $: memory=@ud price-monthly=@ud price-hourly=@ud disk=@ud vcpus=@ud slug=@t transfer=@ud available=? regions=(list ,@t) == ++ axle ,[ke=keys toke=tokens drops=droplet] ++ keys ,[authc=(unit ,@t) client-secret=(unit ,@t)] ++ tokens ,[access=@t refresh=@t] ++ move ,[bone (mold note gift)] ++ note $: %e %them (unit hiss) == ++ gift $% [%nice ~] [%rush %json json] == ++ sign $: %e $% [%thou p=httr] == == -- |% ++ parse-img => jo %- ot :~ id/ni name/so distribution/so slug/so public/bo regions/(ar so) 'created_at'^so type/so 'min_disk_size'^ni == ++ parse-ntwrks => jo %- ot :+ v4/(ar (ot 'ip_address'^so netmask/so gateway/so type/so ~)) v6/(ar (ot 'ip_address'^so netmask/so gateway/so type/so ~)) ~ ++ parse-size => jo %- ot :~ memory/ni 'price_monthly'^ni 'price_hourly'^ni disk/ni slug/so transfer/ni available/bo regions/(ar so) == ++ create-body |= $: name=@t region=@t size=@t image=@t :: ssh-keys=(list json) ::backups=? ipv6=? user-data=@t private-networking=? == %- jobe :~ name/s/name region/s/region size/s/size image/s/image :: 'ssh_keys'^a/ssh-keys backups/b/backups ipv6/b/ipv6 :: 'user_data'^s/user-data 'private_networking'^b/private-networking == -- !: |_ [hid=hide vat=axle] :: ++ auth-queries :~ 'grant_type'^'authorization_code' 'code'^(need authc.ke.vat) :- 'client_id' 'd8f46b95af38c1ab3d78ad34c2157a6959c23eb0eb5d8e393f650f08e6a75c6f' 'redirect_uri'^'http://localhost:8443/main/pub/do/fab' == ++ httpreq |= $: ost=bone pour-path=wire domain=(list cord) end-point=path req-type=$?(%get [%post json]) headers=math queries=quay == ^- move =+ ^- parsed-url=purl :+ ^= host-port :: ++hart :+ security=%.y port=~ host=[%.y [path=[%com domain]]] endpoint=[extensions=~ point=end-point] :: ++pork, q-strings=queries :: ++quay =+ ^- request=hiss :: cast to hiss :- parsed-url ?@ req-type [%get headers ~] [%post headers ~ (tact (pojo +.req-type))] :^ ost %pass pour-path :+ %e %them `(unit hiss)`[~ request] ++ prep ,_`. :: wipe state when app code is changed :: ++ peer |= [ost=bone you=ship pax=path] ^- [(list move) _+>.$] :_ +>.$ [ost %give %rush %json ~]~ :: ++ poke-oauth2-code |= [ost=bone you=ship code=cord] ^- [(list move) _+>.$] =. authc.ke.vat [~ code] =+ ath=(need authc.ke.vat) :_ +>.$ [ost %give %nice ~]~ :: ++ poke-client-secret |= [ost=bone you=ship secret=cord] ^- [(list move) _+>.$] =. client-secret.ke.vat [~ secret] ~& client-secret.ke.vat :_ +>.$ :_ [ost %give %nice ~]~ %^ httpreq ost /auth :^ ~[%digitalocean %cloud] `path`/v1/oauth/token [%post ~] :- ~ `quay`['client_secret'^(need client-secret.ke.vat) auth-queries] :: ++ receive-auth |= [ost=bone pour-path=path resp=sign] =+ body=(rash q:(need r.p.+.resp) apex:poja) ~& body =+ [ac re]=(need ((ot 'access_token'^so 'refresh_token'^so ~):jo body)) =: access.toke.vat ac refresh.toke.vat re == ~& toke.vat :_ +>.$ [ost %give %nice ~]~ :: ++ poke-json |= [ost=bone you=ship act=json] =+ do=(need ((ot action/so ~):jo act)) ?+ do !! %list :_ +>.$ :+ [(list-droplets ost)] [ost %give %nice ~] ~ %create :_ +>.$ =+ ^= deets %- need %. act => jo %- ot :~ name/so region/so size/so image/so ssh/(ar so) backups/(mu bo) 'ipv6'^(mu bo) 'priv_networking'^(mu bo) 'user_data'^(mu so) == ~& deets :::+ [(create-droplet ost)] [ost %give %nice ~]~ ::~ == :: ++ list-droplets |= os=bone =+ ^= lis :* os /list ~[%digitalocean %api] /v2/droplets %get (mo ['Content-Type' 'application/json' ~] ['Authorization' (cat 3 'Bearer ' access.toke.vat) ~] ~) ~ == (httpreq lis) :: ++ receive-list |= [ost=bone pour-path=path resp=sign] ~& resp =+ parsed=(rash q:(need r.p.+.resp) apex:poja) =+ dar=(need ((ot droplets/(ar some) ~):jo parsed)) =+ ^- drop=droplet ~| bad-json/-.dar %- need %. `json`-.dar =+ jo %- ot :~ id/ni name/so memory/ni vcpus/ni disk/ni locked/bo 'created_at'^so status/so 'backup_ids'^(ar so) 'snapshot_ids'^(ar so) features/(ar so) region/(ot name/so slug/so sizes/(ar so) ~) image/parse-img size/some 'size_slug'^so networks/parse-ntwrks kernel/(ot id/ni name/so version/so ~) 'next_backup_window'^some == ~& drop :_ +>.$ [ost %give %nice ~]~ :: ++ create-droplet |= os=bone ~& 'reached' =+ ^= create :* os /create ~[%digitalocean %api] /v2/droplets :- %post (create-body 'test2' 'nyc3' '512mb' 'ubuntu-14-04-x64') %^ mo ['Content-Type' 'application/json' ~] ['Authorization' (cat 3 'Bearer ' access.toke.vat) ~] ~ ~ == (httpreq create) :: ++ pour |= [ost=bone pour-path=path resp=sign] ^- [(list move) _+>.$] ?+ -.pour-path !! %auth (receive-auth ost pour-path resp) :: %list (receive-list ost pour-path resp) %create ~& created/resp :_ +>.$ [ost %give %nice ~]~ == --