- Beispiele
- Indexabfragen
- Abfragen des Systemdatenverzeichnisses (Objekttypdaten)
- Abfragen des Systemdatenverzeichnisses (Funktionsdaten)
- Objektabfragen
- Einzelbefehls-Transaktion: FQDN-Ausgabe
- Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, ohne explizite Statement-Indizierung
- Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, mit expliziter Statement-Indizierung
- Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, explizite Statement-Indizierung und Constraint-Angabe; Filterung unbenötigter Objektattribute
- Komplexe Transaktion: Verbund-Ausgabe mit verschiedenen JOIN-Anweisungen (1)
- Komplexe Transaktion: Verbund-Ausgabe mit verschiedenen JOIN-Anweisungen (2)
- Komplexe Transaktion: Ausgabe globaler Objektattribute
- Komplexe Transaktion: Objektsuche über globale Objektattribute
- Objektmodifikationen
- Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (dns.record.create)
- Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (dns.record.imp)
- Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (nd.device.imp)
- Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit leerer Antwort (dns.record.delete)
- Komplexe Transaktion mit mehreren Dateneingaben und -Ausgaben und expliziter Statement-Indizierung
- Bedingte Statements mit der WHEN-Anweisung
- Wiederholte Statements mit der RefParams-Anweisung
Beispiele
Die nachfolgenden Beispiele dienen ausschließlich der prinzipiellen Veranschaulichung und haben keinen Anspruch auf Korrektheit. Sie sind daher inhaltlich als ungültig zu betrachten. Verbindliche Daten müssen über den Objekttyp- bzw. Funktionsindex der WebAPI abgefragt werden.
Hinweise:
- Je nach Betriebssystem bzw. Kommandozeileninterpreter (Shell) wird der Backslash ‘\‘ als Shell-Escape-Character verwendet. Eine einfache Formatierung der JSON-Ausgabe mit Zeilenumbrüchen und Einrückungen erreicht man z.B. mit ‘curl … | python -m json.tool’.
- Aus Sicherheitsgründen empfiehlt es sich, den Token-Text in einer curl-Konfigurationsdatei zu hinterlegen bzw. diese vorher entsprechend zu generieren. Der Token-Text sollte nicht direkt über die Kommandozeile übergeben werden.
- Bei GET-Requests müssen Sonderzeichen
[]
,{}
in der Parameterzeichenkette (query string) entweder einen vorangestellten Backslash bekommen, oder man verwendet die curl-Option-g
bzw.--globoff
.
Indexabfragen
Die Indexabfragen erlauben es, die gültigen Wertebelegungen der jeweils nächsten Unterebene des URI-Schemas festzustellen.
Versionsindex
- Ziel: Ausgabe der implementierten Versionen
- Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--url "https://api.netdb.scc.kit.edu"
--header "Content-Type: application/json"
- Aufruf:
curl --config curl.cfg
Systemindex
- Ziel: Ausgabe aller unter Version
4.0
implementierten Systeme - Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--url "https://api.netdb.scc.kit.edu/4.0"
--header "Content-Type: application/json"
- Aufruf:
curl --config curl.cfg
Objekttypindex
- Ziel: Ausgabe der in Version
4.0
im Systemorg
implementierten Objekttypen - Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--url "https://api.netdb.scc.kit.edu/4.0/org"
--header "Content-Type: application/json"
- Aufruf:
curl --config curl.cfg
Funktionsindex
- Ziel: Ausgabe der in Version
4.0
im Systemorg
und dem Objekttypou
verfügbaren Funktionen - Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--url "https://api.netdb.scc.kit.edu/4.0/org/unit"
--header "Content-Type: application/json"
- Aufruf:
curl --config curl.cfg
Abfragen des Systemdatenverzeichnisses (Objekttypdaten)
- Ziel: Ausgabe der Objektdaten für System
wapi
, Objekttypobject_type
, Eingrenzung der Suche auf den Systemnamen “dns” und den Objekttypnamen “fqdn” - entspricht: Ausgabe der Objekttypdaten für System
dns
, Objekttypfqdn
- Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--header "Content-Type: application/json"
- Aufruf als GET-Request:
curl --globoff --config curl.cfg 'https://api.netdb.scc.kit.edu/4.0/wapi/object_type/list?system_list=["dns"]&name_list=["fqdn"]'
- Gleichwertiger Aufruf als POST-Request:
curl --config curl.cfg -d '{"old": {"system_list": ["dns"], "name_list": ["fqdn"]}}' 'https://api.netdb.scc.kit.edu/4.0/wapi/object_type/list'
Abfragen des Systemdatenverzeichnisses (Funktionsdaten)
- Ziel: Ausgabe der Objektdaten für System
wapi
, Objekttypfunction
, Eingrenzung der Suche auf den Systemnamen “dns”, den Objekttypnamen “fqdn” und den Funktionsnamen “create” - entspricht: Ausgabe der Parameterdaten für System
dns
, Objekttypfqdn
, Funktioncreate
- Inhalt der curl-Konfigurationsdatei
curl.cfg
(Authentifizierung nicht erforderlich):
--header "Content-Type: application/json"
- Aufruf als GET-Request:
curl --globoff --config curl.cfg 'https://api.netdb.scc.kit.edu/4.0/wapi/function/list?system_list=["dns"]&object_type_list=["fqdn"]&name_list=["create"]'
- Gleichwertiger Aufruf als POST-Request:
curl --config curl.cfg -d '{"old": {"system_list": ["dns"], "object_type_list": ["fqdn"], "name_list": ["create"]}}' 'https://api.netdb.scc.kit.edu/4.0/wapi/function/list'
Objektabfragen
Einzelbefehls-Transaktion: FQDN-Ausgabe
- Ziel: Ausgabe der Objektdaten für System
dns
, Objekttypfqdn
, Eingrenzung der Suche auf das Label-Muster ‘^host’ (als regulärer Ausdruck) - Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf als GET-Request:
curl --globoff --config curl.cfg 'https://api.netdb.scc.kit.edu/4.0/dns/fqdn/list?label_regexp=^host.?$'
- URI als POST-Request:
curl --config curl.cfg -d '{"old": {"label_regexp": "^host.?$"}}' 'https://api.netdb.scc.kit.edu/4.0/dns/fqdn/list'
Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, ohne explizite Statement-Indizierung
-
Ziel: Die folgenden 7 Statements (mit Positionsangabe) liefern
[0]
: alle eigenen Netzbereiche (BCDs)[1]
: alle Gruppenzuordnungen zu den Netzbereichen aus dem 0. Stmt.[2]
: alle Gruppen zu den Gruppenzuordnungen aus dem 1. Stmt.[3]
: alle Betreuerzuordnungen zu den Gruppen aus dem 2. Stmt.[4]
: alle Domainzuordnungen zu den Gruppen aus dem 2. Stmt.[5]
: alle neuesten Top-5-Eventlog-Records, die den Netzbereichen (BCD) aus dem 0. Stmt. zugeordnet sind (zeitlich absteigend je BCD)[6]
: alle ältesten Top-5-Eventlog-Records, die den Netzbereichen (BCD) aus dem 0. Stmt. zugeordnet sind (zeitlich aufsteigend je BCD)
-
Vorbereitung:
- Als Statement-Index wird automatisch die Position eingesetzt. Referenzierende JOIN-Anweisungen müssen sich auf diese Position beziehen.
- Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
query_dns.json
)
[
{"name": "nd.bcd.list", "old": {"is_own": true}},
{"name": "nd.bcd2group.list", "inner_join_ref": {"0": "default"}},
{"name": "cntl.group.list", "inner_join_ref": {"1": "default"}},
{"name": "cntl.mgr2group.list", "inner_join_ref": {"2": "default"}},
{"name": "dns.fqdn2group.list", "inner_join_ref": {"2": "default"}},
{"name": "evlog.record.list", "old": {"top_n": 5, "sorting_params_list": ["object_gfk", "ta_timestamp desc"]}, "inner_join_ref": {"0": null}},
{"name": "evlog.record.list", "old": {"top_n": 5, "top_n_from_newest": false, "sorting_params_list": ["object_gfk", "ta_timestamp asc"]}, "inner_join_ref": {"0": null}}
]
- generischer Transaktionsaufruf über
/wapi/transaction/execute
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute"
--data "@query_dns.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, mit expliziter Statement-Indizierung
- Ziel: analog zum vorigen Beispiel
- Vorbereitung:
- Auswahl der Indexnamen für alle Statements, die referenziert werden (Pos. 0-2)
- Einsetzen der Indexnamen in die referenzierenden JOIN-Anweisungen
- Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
query_dns.json
)
[
{"idx": "bcd", "name": "nd.bcd.list", "old": {"is_own": true}},
{"idx": "b2g", "name": "nd.bcd2group.list", "inner_join_ref": {"bcd": "default"}},
{"idx": "g", "name": "cntl.group.list", "inner_join_ref": {"b2g": "default"}},
{"name": "cntl.mgr2group.list", "inner_join_ref": {"g": "default"}},
{"name": "dns.fqdn2group.list", "inner_join_ref": {"g": "default"}},
{"name": "evlog.record.list", "old": {"top_n": 5, "sorting_params_list": ["object_gfk", "ta_timestamp desc"]}, "inner_join_ref": {"bcd": null}},
{"name": "evlog.record.list", "old": {"top_n": 5, "top_n_from_newest": false, "sorting_params_list": ["object_gfk", "ta_timestamp asc"]}, "inner_join_ref": {"bcd": null}}
]
- generischer Transaktionsaufruf über
/wapi/transaction/execute
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute"
--data "@query_dns.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Komplexe Transaktion: Verbund-Ausgabe mit Ref-InnerJOIN, explizite Statement-Indizierung und Constraint-Angabe; Filterung unbenötigter Objektattribute
-
Ziel: Die folgenden 3 Statements (mit Indexangabe) liefern
"rr_cname"
: alle eigenen CNAME-RRs"fqdn_cname"
: alle Ziel-FQDNs zu den RRs via Stmt-Index “rr_cname”. Dieses Statement wird nur als Verbindung zwischen vorigem und nachfolgendem Statement benötigt, daher soll die Ausgabe komplett gefiltert werden."rr_target"
: alle Ziel-RRs zu den Owner-FQDNs via Stmt-Index “fqdn_cname”. In diesem Statement werden nur die Objektattributefqdn
,ttl
,type
,data
benötigt.
-
Vorbereitung:
- Auswahl der Indexnamen für alle Statements
- Einsetzen der Indexnamen in die referenzierenden JOIN-Anweisungen
- Ermitteln der Constraint-Namen unter Abfrage des Systemdatenbereichs
für die relevanten Objekttypen
dns.fqdn
unddns.record
, da es zwischen diesen beiden Objekkttypen 2 FK-Constraints (TypF
) gibt. Für die Ziel-FQDNs der RRs muss demnach"api_fkey_dns_record_target_fqdn"
als Constraint eingesetzt werden; für die Owner-FQDNs kann"api_fkey_dns_record_fqdn"
oder"default"
eingesetzt werden. - Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
query_dns.json
)
[
{"idx": "rr_cname", "name": "dns.record.list", "old": {"is_own": true, "type": "CNAME"}},
{"idx": "fqdn_cname", "name": "dns.fqdn.list", "old": {"filter_params_dict": {"show": true, "attrs_list": null}}, "inner_join_ref": {"rr_cname": "api_fkey_dns_record_target_fqdn"}},
{"idx": "rr_target", "name": "dns.record.list", "old": {"filter_params_dict": {"show": true, "attrs_list": ["fqdn","ttl","type","data"]}}, "inner_join_ref": {"fqdn_cname": "api_fkey_dns_record_fqdn"}}
]
- generischer Transaktionsaufruf über
/wapi/transaction/execute
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute"
--data "@query_dns.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Komplexe Transaktion: Verbund-Ausgabe mit verschiedenen JOIN-Anweisungen (1)
Die folgenden 3 Statements (mit Indexangabe) liefern
"fqdn"
: alle eigenen FQDNs"fqdn: rrs nxst"
: alle FQDNs aus Stmt-Index “fqdn”, die nicht in RRs vorkommen."fqdn: rrs xst"
: alle FQDNs aus Stmt-Index “fqdn”, die in RRs vorkommen.
[
{"idx": "fqdn", "name": "dns.fqdn.list", "old": {"is_own": true}},
{"idx": "fqdn: rrs nxst", "name": "dns.fqdn.list", "inner_join_ref": {"fqdn": "self"}, "anti_join_noref": {"and": ["api_fkey_dns_record_fqdn"]}},
{"idx": "fqdn: rrs xst", "name": "dns.fqdn.list", "inner_join_ref": {"fqdn": "self"}, "semi_join_noref": {"and": ["api_fkey_dns_record_fqdn"]}}
]
Komplexe Transaktion: Verbund-Ausgabe mit verschiedenen JOIN-Anweisungen (2)
Die folgenden 6 Statements (mit Indexangabe) liefern
"bcdcat"
: BCD-Kategorie ‘USER’"bcd"
: alle BCDs, die zur Kategorie im Stmt-Index “bcdcat” gehören und die DHCP aktiviert haben"bcd: nxst s or nxst v"
: alle BCDs aus Stmt-Index “bcd”, denen entweder kein Subnetz oder kein Vlan zugeordnet ist"bcd: nxst s and nxst v"
: alle BCDs aus Stmt-Index “bcd”, denen weder ein Subnetz noch ein Vlan zugeordnet ist"bcd: xst (s or v) and g"
: alle BCDs, die zur Kategorie im Stmt-Index “bcdcat” gehören und denen- entweder (mindestens) ein Subnetz oder (mindestens) ein Vlan zugeordnet ist sowie
- (mindestens) eine Gruppe zugeordnet ist
"bcd: xst (s or v) and nxst g"
: alle BCDs, die zur Kategorie im Stmt-Index “bcdcat” gehören, nicht im Stmt-Index “bcd” vorkommen und denen- entweder (mindestens) ein Subnetz oder (mindestens) ein Vlan zugeordnet ist sowie
- keine Gruppe zugeordnet ist
[
{"idx": "bcdcat", "name": "ndcfg.bcd_categ.list", "old": {"name": "USER"}},
{"idx": "bcd", "name": "nd.bcd.list", "old": {"dhcp_enabled": true}, "inner_join_ref": {"bcdcat": "default"}},
{
"idx": "bcd: nxst s or nxst v", "name": "nd.bcd.list", "inner_join_ref": {"bcd": "self"},
"anti_join_noref": {"or": [ "api_fkey_nd_ip_subnet_bcd", "api_fkey_nd_vlan_bcd" ]}
},
{
"idx": "bcd: nxst s and nxst v", "name": "nd.bcd.list", "inner_join_ref": {"bcd": "self"},
"anti_join_noref": {"and": [ "api_fkey_nd_ip_subnet_bcd", "api_fkey_nd_vlan_bcd" ]}
},
{
"idx": "bcd: xst (s or v) and g", "name": "nd.bcd.list", "inner_join_ref": {"bcdcat": "default"},
"semi_join_noref":
{
"or": [ "api_fkey_nd_ip_subnet_bcd", "api_fkey_nd_vlan_bcd" ],
"and": [ "api_fkey_nd_bcd2group_bcd" ]
}
},
{
"idx": "bcd: xst (s or v) and nxst g", "name": "nd.bcd.list", "anti_join_ref": {"bcd": "self"}, "inner_join_ref": {"bcdcat": "default"},
"semi_join_noref": {"or": [ "api_fkey_nd_ip_subnet_bcd", "api_fkey_nd_vlan_bcd" ]},
"anti_join_noref": {"and": [ "api_fkey_nd_bcd2group_bcd" ]}
}
]
Komplexe Transaktion: Ausgabe globaler Objektattribute
Die folgenden 4 Statements (mit Indexangabe) liefern
"dev"
: einen Datensatz des Objekttypsnd.device
(via Primärparameter"fqdn"
)"otav"
: alle Objektattribute, die zum vorigen Objekt gehören"otak"
: alle Objekttypattribute zum Stmt-Index “otav”"otad"
: alle Objekttypattribut-Schüsselwortdefinitionen zum Stmt-Index “otak”
[
{"idx": "dev", "name": "nd.device.list", "old": {"fqdn": "r-bb-wh.tmn.scc.kit.edu."}},
{"idx": "otav", "name": "cntl.ot_attr_val.list", "inner_join_ref": {"dev": null}},
{"idx": "otak", "name": "cntl.ot_attr_key.list", "inner_join_ref": {"otav": "default"}},
{"idx": "otad", "name": "cntl.ot_attr_def.list", "inner_join_ref": {"otak": "default"}}
]
Komplexe Transaktion: Objektsuche über globale Objektattribute
Die folgenden 2 Statements (mit Indexangabe) liefern
"otav"
: alle Objektattribute zum Objekttypnd.module
mit dem Schlüsselwort"stack_pos"
und mit Werten zwischen 2 und 4"mdl2otav"
: alle Module, die zu den gefundenen Attributen aus dem Stmt-Index “otav” gehören
[
{"idx": "otav", "name": "cntl.ot_attr_val.list", "old": {"object_type_fq_name": "nd.module", "ot_attr_def_key_word": "stack_pos", "value": 2, "value_operator": "int_range", "value_range": 4}},
{"idx": "mdl2otav", "name": "nd.module.list", "inner_join_ref": {"otav": null}}
]
Objektmodifikationen
Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (dns.record.create
)
- Ziel: Anlegen eines DNS-A-Records eines RR-Sets (Satz von potenziell mehreren Records)
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
create_rr.json
).
{
"new": {
"fqdn": "myhost.kit.test",
"fqdn_description": "blubb",
"target_is_reverse_unique": false,
"target_is_singleton": false,
"type": "A",
"data": "192.168.1.1"
}
}
- Die in obiger Datei nicht enthaltenen, aber erforderlichen Daten für System, Objekttyp und Funktion werden in der URI-Adresse übergeben
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/dns/record/create"
--data "@create_rr.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (dns.record.imp
)
- Ziel: Importieren der RR-Sätze zu einem FQDN
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
import_rr.json
).
{
"new": {
"fqdn": "myhost.kit.test",
"fqdn_description": "hello world!",
"import_data": {
"dns.record_imp": [
{"type": "A", "target_is_reverse_unique": false, "data_list": ["192.168.1.1"]},
{"type": "AAAA", "target_is_reverse_unique": true, "target_is_singleton": false, "data_list": ["abcd::1", "abcd::2"]},
{"type": "TXT", "data_list": ["\"textpart_in_same_rr_1\" \"textpart_in_same_rr_2\""]},
{"type": "MX", "data_list": ["10 mail.kit.test"] }
]
}
}
}
- Die in obiger Datei nicht enthaltenen, aber erforderlichen Daten für System, Objekttyp und Funktion werden in der URI-Adresse übergeben
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/dns/record/imp"
--data "@import_rr.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit nicht-leerer Antwort (nd.device.imp
)
- Ziel: Importieren der Device-Daten (L-Ports, IP-Interfaces, nicht-statische Objektattribute)
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
import_dev.json
).
{
"new": {
"fqdn": "mydevice.kit.test",
"nc": "cs",
"acg": "rz-netze-mgmt",
"type": "z",
"description": "more details about mydevice",
"import_data": {
"nd.l_port_imp": [ {"name": "1", "tag_list": ["static"]}, {"name": "2"} ],
"nd.ip_intf_imp": [ {"ip_addr": "abcd::1", "l_port_name": "1"}, {"ip_addr": "192.168.1.1", "l_port_name": "1"}],
"nd.device_attribute_imp": [ {"key_word": "os_name", "value": "OS name/version of mydevice"}, {"key_word": "gen_single_ii_port_name", "value": "1"} ]
}
}
}
- Die in obiger Datei nicht enthaltenen, aber erforderlichen Daten für System, Objekttyp und Funktion werden in der URI-Adresse übergeben
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/nd/device/imp"
--data "@import_dev.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Einfache Dateneingabe durch eine Einzelbefehls-Transaktion mit leerer Antwort (dns.record.delete
)
- Ziel: Inhalt: Löschen eines DNS-A-Records eines RR-Sets (Satz von potenziell mehreren Records)
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
delete_rr.json
).
{
"old": {
"fqdn": "myhost.kit.test",
"type": "A",
"data": "192.168.1.1"
}
}
- Die in obiger Datei nicht enthaltenen, aber erforderlichen Daten für System, Objekttyp und Funktion werden in der URI-Adresse übergeben
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/dns/record/delete"
--data "@delete_rr.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Komplexe Transaktion mit mehreren Dateneingaben und -Ausgaben und expliziter Statement-Indizierung
-
Ziel: Die folgenden 4 Statements (mit Indexangabe) bewirken:
"ls_create"
Erzeugen eines neuen Lease-Datensatzes"og_create"
Erzeugen einer neuen Optionsgruppe (OG)"og2ls_create"
Erzeugen einer neuen Lease-Optionsgruppen-Zuordnung zur Lease aus dem Stmt-Index “ls_create” und zur OG aus dem Stmt-Index “og_create”"addr_list"
Ausgabe des via Stmt-Index “ls_create” zugeordneten IP-Adress-Datensatzes"subnet_list"
Ausgabe des Subnetzes zur IP-Adresse via Stmt-Index “addr_list” mit JOIN
-
Vorbereitung:
- Auswahl der Indexnamen für alle Statements
- Einsetzen der Indexnamen in die referenzierenden JOIN-Anweisungen und Bezugsparameter
- Ermitteln der Parameter-Namen unter Abfrage des Funktionsindexes
für die relevanten Objekttypen
lease
,og
,og2lease
des Systemsdhcpv4
- Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
mod_dhcp.json
)
[
{"idx": "ls_create", "name": "dhcpv4.lease.create", "new": {"ip_subnet_cidr":"192.168.1.0/24", "ip_addr_value":"192.168.1.1", "mac_addr":"00:11:22:aa:bb:cc", "is_static_addr":true }},
{"idx": "og_create", "name": "dhcpv4.og.create", "new": {"name": "wapi-test-optgroup", "ip_subnet_cidr": "192.168.1.0/24"} },
{
"idx": "og2ls_create",
"name": "dhcpv4.og2lease.create",
"new_ref_params": [
{ "idx": "ls_create", "params": {"lease_gfk": "gpk" } },
{ "idx": "og_create", "params": {"og_gfk": "gpk"}, "join_type":"inner" }
],
"new": { "priority": 15 }
},
{"idx": "addr_list", "name": "dns.ip_addr.list", "inner_join_ref": {"ls_create": "default"} },
{"idx": "subnet_list", "name": "nd.ip_subnet.list", "inner_join_ref": {"addr_list": "default"}}
]
- generischer Transaktionsaufruf im Test-Modus (es werden keine Daten permanent gespeichert, aber die Ausgabedaten werden trotzdem erzeugt):
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute?dry_mode=true"
--data "@mod_dhcp.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Bedingte Statements mit der WHEN-Anweisung
FQDN des Typs ‘domain’ eintragen, falls noch nicht vorhanden
- Ziel: Sicherstellen, dass ein bestimmter FQDN mit vorgegebenem Typ existiert. Die Transaktion ist beliebig oft wiederholbar, ohne dass wg. FQDN-Duplikaten eine Exception entsteht.
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
create_fqdn_if_not_exists.json
). - Das erste Statement dient der Abfrage ‘existiert der FQDN myhost.scc.kit.test?’
- Das zweite und dritte Statement wird in Abhängigkeit der Antwort des ersten Statements ausgeführt:
- FQDN anlegen, wenn nicht vorhanden
- FQDN-Typ ändern, wenn FQDN vorhanden, aber Typ nicht ‘domain’
[
{"idx": "list_fqdn", "name": "dns.fqdn.list", "old": {"value_list": ["myhost.scc.kit.test"] }},
{"idx": "crt_fqdn", "name": "dns.fqdn.create", "new": {"value": "myhost.scc.kit.test", "type": "domain"}, "when": {"returns_no_data": ["list_fqdn"]}},
{
"idx": "upd_fqdn",
"name": "dns.fqdn.update",
"old": {"value": "myhost.scc.kit.test"},
"new": {"type": "domain"},
"when": {
"and": [
{"returns_data": ["list_fqdn"]},
{"compare": [ "ne", {"returned_param_value": [ "list_fqdn", "type" ] }, "domain" ]}
]
}
}
]
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute"
--data "@create_fqdn_if_not_exists.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
RR-Set importieren, falls nicht exakt übereinstimmend
- Ziel: Sicherstellen, dass zu einem bestimmten FQDN ein bestimmtes RR-Set existiert. Der Import würde zwar keine Exception werfen, wenn das RR-Set schon existiert, wird aber aus Performance-Gründen nur dann ausgeführt, wenn tatsächlich erforderlich.
- Vorbereitung: Bereitstellen des Request Body als JSON-Dokument (z.B. als Eingabedatei
create_rr_if_not_exists.json
). - Das erste Statement dient der Abfrage ‘welches MX-RR-Set hat der FQDN scc.kit.test?’. Durch die Sortierung ist eine eindeutige Reihenfolge garantiert.
- Das zweite Statement wird ausgeführt, wenn das erste Statement nicht genau das verlangte RR-Set zurückgibt. Der Array-Vergleich zielt auf Position und Inhalt der Array-Elemente (trailing dot im statischen Vergleichsarray nicht vergessen!).
[
{"idx": "list_rr", "name": "dns.record.list", "old": {"fqdn_list": ["scc.kit.test"], "type": "MX", "sorting_params_list":["data"] }},
{
"idx": "imp_rr",
"name": "dns.record.imp",
"new": {
"fqdn": "scc.kit.test",
"strict_mode": false,
"import_data": { "dns.record_imp": [ { "type": "MX", "data_list": ["10 scc-mailin-cn-01.scc.kit.edu.", "10 scc-mailin-cs-01.scc.kit.edu."] } ] }
},
"when": {
"compare": [
"ne",
["10 scc-mailin-cn-01.scc.kit.edu.", "10 scc-mailin-cs-01.scc.kit.edu."],
{"returned_param_value_list": [ "list_rr", "data" ] }
]
}
}
]
- Inhalt der curl-Konfigurationsdatei
curl.cfg
:
--url "https://api.netdb.scc.kit.edu/4.0/wapi/transaction/execute"
--data "@create_rr_if_not_exists.json"
--header "Content-Type: application/json"
--header "Authorization: Bearer ***AUTH-TOKEN-TEXT***"
- Aufruf:
curl --config curl.cfg
Wiederholte Statements mit der RefParams-Anweisung
Löschen einer Subdomain (einschließlich)
- Ziel: alle DNS-Einträge rekursiv unterhalb eines vorgegebenen FQDNs löschen, einschließlich des vorgegebenen FQDNs selbst. Es werden auch RRs gelöscht, die auf einen zu löschenden FQDN zeigen (RR-Target liegt in der zu löschenden Subdomain)
- Das erste Statement dient der Festlegung des Startwertes (vorgegebener FQDN)
- Das zweite Statement gibt alle darunterliegenden FQDNs aus, beginnend mit der untersten Ebene. Die Reihenfolge der Ebenen ist für die fehlerfreie Löschung erforderlich.
- Das dritte Statement löscht alle FQDNs und deren RRs, die im zweiten Statement ausgegeben wurden (gleiche Reihenfolge).
[
{"idx": "list_fqdn", "name": "dns.fqdn.list", "old": {"value_list": ["scc.kit.test"] }},
{
"idx": "list_subtree",
"name": "dns.fqdn.list",
"old": {
"filter_params_dict": {"show": true, "attrs_list": ["value","tree_level","type","zone"]},
"sorting_params_list":["tree_level desc", "value"]
},
"inner_join_ref": {"list_fqdn": "api_func_dns_fqdn_is_superset_of_root_node_set" }
},
{
"idx": "del_fqdn",
"name": "dns.fqdn.delete",
"old": {"force_del_ref_records": true, "try_del_parent": false},
"old_ref_idx": "list_subtree"
}
]
Löschen einer Subdomain (ausschließlich)
- Ziel: alle DNS-Einträge rekursiv unterhalb eines vorgegebenen FQDNs löschen, ausschließlich des vorgegebenen FQDNs selbst. Es werden auch RRs gelöscht, die auf einen zu löschenden FQDN zeigen (RR-Target liegt in der zu löschenden Subdomain)
- Statement
list_fqdn
dient der Festlegung des Startwertes (vorgegebener FQDN) - Statement
list_subtree
gibt alle darunterliegenden FQDNs aus, beginnend mit der untersten Ebene. Die Reihenfolge der Ebenen ist für die fehlerfreie Löschung erforderlich. - Statement
del_fqdn
löscht alle FQDNs und deren RRs,- die im Statement
list_subtree
ausgegeben wurden - abzüglich der FQDNs des Statements
list_fqdn
(genau einer; bedient obiges Ausschlußkriterium)
- die im Statement
[
{"idx": "list_fqdn", "name": "dns.fqdn.list", "old": {"value_list": ["scc.kit.test"] }},
{
"idx": "list_subtree",
"name": "dns.fqdn.list",
"old": {
"filter_params_dict": {"show": true, "attrs_list": ["value","tree_level","type","zone"]},
"sorting_params_list":["tree_level desc", "value"]
},
"inner_join_ref": {"list_fqdn": "api_func_dns_fqdn_is_superset_of_root_node_set" }
},
{
"idx": "del_fqdn",
"name": "dns.fqdn.delete",
"old": {"force_del_ref_records": true, "try_del_parent": false},
"old_ref_params": [
{"idx": "list_subtree"},
{"idx": "list_fqdn", "params": {}, "join_type": "left_anti", "join_on": "val"}
]
}
]
Vorlage zum Testen mit dem generischen Objekttyp unter Verwendung der RefParams-Anweisung
[
{
"idx": "defineData1", "name": "tmp.generic_object.list",
"ref_params_join_on_val_attrs_tuple": ["name"],
"old": {
"_dict_list": [
{ "pk": 110, "name": "a", "descr": "1a" },
{ "pk": 120, "name": "b", "descr": null },
{ "pk": 130, "name": "c", "descr": "1c" }
]
}
},
{
"idx": "defineData2", "name": "tmp.generic_object.list",
"ref_params_join_on_val_attrs_tuple": ["name"],
"old": {
"_dict_list": [
{ "pk": 210, "name": "b", "remark": null },
{ "pk": 220, "name": "c", "remark": "remark_e" },
{ "pk": 230, "name": "d", "remark": "remark_f" }
]
}
},
{
"idx": "defineData3", "name": "tmp.generic_object.list",
"ref_params_join_on_val_attrs_tuple": ["name"],
"old": {
"_dict_list": [
{ "pk": 310, "name": "d", "descr": null, "remark": "3d" },
{ "pk": 320, "name": "e", "descr": "3e", "remark": null },
{ "pk": 330, "name": "f", "descr": "3f", "remark": "3f" }
]
}
},
{
"title": "Concat results from several list queries that cannot be expressed as one.",
"description": "This example demonstrates parameter mapping results for SQL NULL, JSON NULL and NOT NULL values, including default value in 'new'.",
"description": "Join type 'full_outer' or 'full_anti' must be used together with position based join and 'join_offset_by_idx_list'.",
"description": "Both join types produce equivalent results; comparable to a logical disjunction (OR).",
"idx": "qryData1", "name": "tmp.generic_object.create",
"new_ref_params": [
{ "idx": "defineData1", "params": {"id": "pk", "name": "name" } },
{ "idx": "defineData2", "params": {"id": "pk", "name": "name", "descr": "remark" }, "join_type": "full_outer", "join_offset_by_idx_list": ["defineData1"] },
{ "idx": "defineData3", "params": {"id": "pk", "name": "name", "descr": "descr" }, "join_type": "full_outer", "join_offset_by_idx_list": ["defineData1", "defineData2"] }
]
},
{
"title": "Filter different results from several list queries.",
"description": "Show only result sets that exist exclusive in either one of the ref params results, comparable to a logical exclusive disjunction (XOR).",
"idx": "qryData2", "name": "tmp.generic_object.create",
"ref_params_join_on_val_attrs_tuple": ["name"],
"new_ref_params": [
{ "idx": "defineData1" },
{ "idx": "defineData2", "join_type": "full_anti", "join_on": "val" }
]
},
{
"title": "Filter equal results from several list queries.",
"description": "Show only result sets that exist in both of the ref params results, comparable to a logical conjunction (AND).",
"idx": "qryData3", "name": "tmp.generic_object.create",
"ref_params_join_on_val_attrs_tuple": ["name"],
"new_ref_params": [
{ "idx": "defineData1" },
{ "idx": "qryData2", "join_type": "inner", "join_on": "val" }
]
},
{
"title": "Update example",
"description": "In an update the maximum number of the result sets of either old_ref_params or new_ref_params is being used.",
"description": "An equal number of result sets is being recommended, hence missing parameter values (from missing result sets) are treated as NULL.",
"description": "The old referenced statement returns 9 result sets, while the new referenced statement returns only 2.",
"description": "The update function receives the first 2 result sets with complete old/new pairs,",
"description": "and the remaining 7 result sets having only old values.",
"description": "The parameter values in the 7 new result sets do not exist and would be in this case NULL respective the default value, if defined.".
"idx": "qryData4", "name": "tmp.generic_object.update",
"old_ref_params": [ { "idx": "qryData1", "params": {"id": "id", "name": "name", "descr": "descr" } } ],
"new_ref_params": [ { "idx": "qryData2", "params": {"id": "pk", "name": "name", "descr": "descr" } } ]
},
{
"idx": "qryData5", "name": "tmp.generic_object.list",
"old_ref_params": [ { "idx": "qryData1", "params": {"id": "id", "name": "name", "descr": "descr" } } ]
}
]