Verwenden und Verstehen von Aktionsobjekten und der DigitalOcean-API

Einführung

In Version zwei der DigitalOcean-API wird bei jedem Ereignis an "Action" -Objekt erstellt. Diese dienen sowohl zur Aufzeichnung von Ereignissen, die in der Vergangenheit stattgefunden haben, als auch zur Überprüfung des Fortschritts eines laufenden Ereignisses. Von der Erstellung eines neuen Droplets bis zur Übertragung eines Bildes in eine neue Region liefert Ihnen ein Aktionsobjekt nützliche Informationen über das Ereignis.

In diesem Artikel werden Aktionsobjekte erläutert und gezeigt, wie sie in der Praxis über DropletKit (https://rubygems.org/gems/droplet_kit[das offizielle Ruby-Juwel für die DigitalOcean-API) verwendet werden können.

Voraussetzungen

Dieser Artikel setzt ein grundlegendes Verständnis der DigitalOcean-API voraus. Weitere Informationen zur API und zum Beziehen eines Zugriffstokens, der zum Ausführen dieses Lernprogramms erforderlich ist, finden Sie in den folgenden Ressourcen:

Grundlegendes zu Aktionsobjekten

Beim Initiieren eines Ereignisses mit der API wird ein Aktionsobjekt in der Antwort zurückgegeben. Dieses Objekt enthält Informationen zum Ereignis, einschließlich seines Status, der Zeitstempel für den Start und den Abschluss des Ereignisses sowie des zugeordneten Ressourcentyps und der ID. Zum Beispiel, wenn wir einen Schnappschuss des Tropfens mit der ID 3164450 machen wollen:

curl -X POST -H 'Content-Type: application/json' \
   -H 'Authorization: Bearer ''' \
   -d '{"type":"snapshot","name":"Nifty New Snapshot"}' \
   "https://api.digitalocean.com/v2/droplets//actions"

Wir würden dies als Antwort erhalten:

{
 "action": {
   "id": 36805022,
   "status": "in-progress",
   "type": "snapshot",
   "started_at": "2014-11-14T16:34:39Z",
   "completed_at": null,
   "resource_id": 3164450,
   "resource_type": "droplet",
   "region": "nyc3"
 }
}

Beachten Sie, dass "+ resource_type " " droplet " und " resource_id " die ID des Droplets ist. Der " Status" ist "+ in Bearbeitung". Dies ändert sich zu "+ erledigt +", sobald die Veranstaltung beendet ist. Um den Status einer Aktion zu überprüfen, können Sie die API für diese Aktion direkt abfragen.

curl -X GET -H 'Content-Type: application/json' \
   -H 'Authorization: Bearer ''' \
   "https://api.digitalocean.com/v2/actions/"

Dies gibt das angeforderte Aktionsobjekt zurück:

{
 "action": {
   "id": 36805022,
   "status": "completed",
   "type": "snapshot",
   "started_at": "2014-11-14T16:34:39Z",
   "completed_at": "2014-11-14T16:38:52Z",
   "resource_id": 3164450,
   "resource_type": "droplet",
   "region": "nyc3"
 }
}

Beachten Sie, dass jetzt, da der Status "" " erledigt " ist, ein Zeitstempel für " erledigt_zu " und " gestartet_zu +" vorhanden ist.

Sie können auch auf https://developers.digitalocean.com/v2/#list-all-actions zugreifen, um den vollständigen Verlauf aller auf Ihrem Konto vorgenommenen Aktionen auf dem Endpunkt "+ / actions +" anzuzeigen.

curl -X GET -H 'Content-Type: application/json' \
   -H 'Authorization: Bearer ''' \
   "https://api.digitalocean.com/v2/actions"

Verwenden von Aktionsobjekten in der Praxis

Während die Auflistung aller Aktionsobjekte für die Überwachung Ihres Verlaufs interessant sein kann, verwenden Sie diesen Endpunkt in der Praxis meistens, um den Status eines Prozesses zu überprüfen. Für diese Beispiele verwenden wir "+ droplet_kit +" (https://rubygems.org/gems/droplet_kit), das offizielle Ruby-Juwel für die DigitalOcean-API. Es kann installiert werden mit:

gem install droplet_kit

Um zu beginnen, rufen Sie die Ruby-Shell auf, indem Sie den Befehl "+ irb " ausführen. Importieren Sie dann den Edelstein " droplet_kit +" und richten Sie Ihren Client mit Ihrem API-Token ein:

irb(main):> require 'droplet_kit'
=> true
irb(main):> client = DropletKit::Client.new(access_token: )

Einige Aktionen hängen davon ab, dass andere zuerst ausgeführt werden. Der Versuch, einen Schnappschuss eines noch eingeschalteten Droplets zu machen, führt beispielsweise zu einem Fehler. Ein Droplet muss ausgeschaltet sein, um einen Schnappschuss zu machen.

irb(main):> client.droplet_actions.snapshot(droplet_id: 4143310, name: 'Snapshot Name')
=> "{\"id\":\"unprocessable_entity\",\"message\":\"Droplet is currently on. Please power it off to run this event.\"}"

Der Versuch, unmittelbar nach dem Starten einer Aktion zum Herunterfahren einen Snapshot zu erstellen, führt ebenfalls zu dem gleichen Fehler, da Sie sicherstellen müssen, dass die Aktion zum Herunterfahren abgeschlossen ist, bevor der Snapshot erstellt werden kann. Aktionen können nicht in eine Warteschlange gestellt werden.

irb(main):> client.droplet_actions.shutdown(droplet_id: 4143310)
=> <DropletKit::Action {:@id=>43918785, :@status=>"in-progress", :@type=>"shutdown", :@started_at=>"2015-02-16T21:22:35Z", :@completed_at=>nil, :@resource_id=>4143310, :@resource_type=>"droplet", :@region=>"nyc3"}>
irb(main):> client.droplet_actions.snapshot(droplet_id: 4143310, name: 'Snapshot Name')
=> "{\"id\":\"unprocessable_entity\",\"message\":\"Droplet is currently on. Please power it off to run this event.\"}"

Wie die obigen Beispiele für "+ curl " gibt auch " droplet_kit +" das Action-Objekt als Antwort auf ein erfolgreich initiiertes Ereignis zurück. Es kann als normales Ruby-Objekt zugegriffen werden. Wenn Sie die Antwort in einer Variablen speichern, können Sie direkt auf die Attribute zugreifen:

irb(main):> snapshot = client.droplet_actions.snapshot(droplet_id: 4143310, name: 'Snapshot Name')
=> "{\"id\":\"unprocessable_entity\",\"message\":\"Droplet is currently on. Please power it off to run this event.\"}"
irb(main):> shutdown = client.droplet_actions.shutdown(droplet_id: 4143310)
=> <DropletKit::Action {:@id=>43919195, :@status=>"in-progress", :@type=>"shutdown", :@started_at=>"2015-02-16T21:32:03Z", :@completed_at=>nil, :@resource_id=>4143310, :@resource_type=>"droplet", :@region=>"nyc3"}>
irb(main):> shutdown.status
=> "in-progress"
irb(main):> shutdown.id
=> 43919195

Sie können dann den Status der Aktionen überprüfen:

irb(main):> action = client.actions.find(id: shutdown.id)
=> <DropletKit::Action {:@id=>43919195, :@status=>"completed", :@type=>"shutdown", :@started_at=>"2015-02-16T21:32:03Z", :@completed_at=>"2015-02-16T21:32:07Z", :@resource_id=>4143310, :@resource_type=>"droplet", :@region=>"nyc3"}>
irb(main):> action.status
=> "completed"

Wir können in Ruby eine + till + - Schleife verwenden, um den Fortschritt einer Aktion zu überprüfen, bis sie abgeschlossen ist:

res = client.droplet_actions.shutdown(droplet_id: id)
until res.status == "completed"
   res = client.actions.find(id: res.id)
   sleep(2)
end

Alles zusammenfügen

Das folgende Ruby-Skript ist ein Beispiel für die Überprüfung des Status einer Aktion in der Praxis. Es schaltet ein Droplet aus und verwendet die "+ while +" - Schleife von oben, um sicherzustellen, dass die Aktion abgeschlossen ist, bevor Sie fortfahren. Sobald der Vorgang zum Herunterfahren abgeschlossen ist, wird ein Schnappschuss des Tröpfchens erstellt.

#!/usr/bin/env ruby

require 'droplet_kit'
require 'json'

token = ENV['DO_TOKEN']
client = DropletKit::Client.new(access_token: token)

droplet_id = ARGV[0]
snapshot_name = ARGV[1] || Time.now.strftime("%b. %d, %Y - %H:%M:%S %Z")

def power_off(client, id)
   res = client.droplet_actions.shutdown(droplet_id: id)
   until res.status == "completed"
       res = client.actions.find(id: res.id)
       sleep(2)
   end
   puts " *   Action status: #{res.status}"
rescue NoMethodError
   puts JSON.parse(res)['message']
end

def take_snapshot(client, id, name)
   res = client.droplet_actions.snapshot(droplet_id: id, name: name)
   puts " *   Action status: #{res.status}"
rescue NameError
   puts JSON.parse(res)['message']
end

unless droplet_id.nil?
   puts "Powering off droplet..."
   power_off(client, droplet_id)
   sleep(2)
   puts "Taking snapshot..."
   take_snapshot(client, droplet_id, snapshot_name)
else
   puts "Power off and snapshot a droplet. Requires a droplet ID and optionally a snapshot name."
   puts "Usage: #{$0} droplet_id ['snapshot name']"
end

Wenn Sie dieses Skript als Datei mit dem Namen "+ snapshot.rb +" speichern (oder von this GitHub Gist herunterladen), können Sie es wie folgt über die Befehlszeile ausführen :

DO_TOKEN= ruby snapshot.rb  ""

Beachten Sie, dass Sie Ihr API-Token als Umgebungsvariable mit dem Namen "+ DO_TOKEN +" exportieren müssen, um das Skript verwenden zu können. Das Skript akzeptiert zwei Argumente, die ID des Droplets und optional einen Namen des Snapshots. Wenn Sie keinen Namen angeben, werden Datum und Uhrzeit angezeigt.

Fazit

Aktionselemente sind ein wichtiger Bestandteil der DigtialOcean-API. Ihre Verwendung zum Überprüfen des Status von Aktionen ist eine wichtige bewährte Methode zur Implementierung bei Verwendung der API. Nachdem Sie sich mit deren Verwendung vertraut gemacht haben, können Sie mit komplexeren Anwendungsfällen der API fortfahren, z.

Weitere Themen finden Sie unter DigitalOcean developer’s portal.