i-doit API für Relationen (Service assignment)



  • Hallo zusammen,

    ich braue gerade einen Wrapper der i-doit API in python. Bisher hat alles soweit gut geklappt.
    Leider bin ich an den Punkt gekommen, an welchem ich nicht mir weiter komme und auch die Doku keine Hinweise mehr gibt.

    Ich möchte einem Custom Object ein "Service assignment" hinzufügen.
    Was ich versuche ist:

    {
        "version": "2.0",
        "method": "cmdb.category.create",
        "params": {
            "objID": 45,
            "data": [{"sysid":"someservicename","id":1}],
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en"
        },
        "id": 1
    }
    

    Fehler ist:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "error": {
            "code": -32603,
            "message": "Internal error: There was an validation error",
            "data": [
                "(id) Category data id should be an integer value greater than zero."
            ]
        }
    }
    

    Bzw:

    {
        "version": "2.0",
        "method": "cmdb.category.create",
        "params": {
            "objID": 45,
            "data": {"sysid":"someservicename"},
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en",
            "id":1
        },
        "id": 1
    }
    

    Mit dem Fehler:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "error": {
            "code": -32603,
            "message": "Internal error: Database error : Query error: 'INSERT INTO isys_catg_its_components_list SET\n\t\t\tisys_catg_its_components_list__status = 2,\n\t\t\tisys_catg_its_components_list__description = '',\n\t\t\tisys_catg_its_components_list__isys_obj__id = NULL,\n\t\t\tisys_catg_its_components_list__isys_connection__id = 766;':\nColumn 'isys_catg_its_components_list__isys_obj__id' cannot be null\n",
            "data": {
                "mysqlErrorCode": 1048,
                "mysqlErrorMessage": "Database error : Query error: 'INSERT INTO isys_catg_its_components_list SET\n\t\t\tisys_catg_its_components_list__status = 2,\n\t\t\tisys_catg_its_components_list__description = '',\n\t\t\tisys_catg_its_components_list__isys_obj__id = NULL,\n\t\t\tisys_catg_its_components_list__isys_connection__id = 766;':\nColumn 'isys_catg_its_components_list__isys_obj__id' cannot be null\n"
            }
        }
    }
    

    Ein Update habe ich nun zumindest zum laufen bekomme, wobei die id eine vorlaufende Nummer ist.

    {
        "version": "2.0",
        "method": "cmdb.category.update",
        "params": {
            "objID": 45,
            "data": {"sysid":"someservicename","id":4},
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en",
            "id":1
        },
        "id": 1
    }
    

    Result

    {
        "id": 1,
        "jsonrpc": "2.0",
        "result": {
            "success": true,
            "message": "Category entry successfully saved. [This method is deprecated und will be removed in a feature release. Use 'cmdb.category.save' instead.]"
        }
    }
    

    Hat jemand eine Idee in welche Richtung der Fehler gehen könnte?

    Gruß Malte

    PS.: Die Methde 'cmdb.category.save' habe ich zwar im Changelog jedoch in keiner Doku gefunden. Hat jemand eine Idee wo ich hierzu mehr finde?



  • @Malte-Brodersen said in i-doit API für Relationen (Service assignment):

    Hallo zusammen,

    ich braue gerade einen Wrapper der i-doit API in python. Bisher hat alles soweit gut geklappt.
    Leider bin ich an den Punkt gekommen, an welchem ich nicht mir weiter komme und auch die Doku keine Hinweise mehr gibt.

    Ich möchte einem Custom Object ein "Service assignment" hinzufügen.
    Was ich versuche ist:

    {
        "version": "2.0",
        "method": "cmdb.category.create",
        "params": {
            "objID": 45,
            "data": [{"sysid":"someservicename","id":1}],
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en"
        },
        "id": 1
    }
    

    Hier fällt mir folgendes auf:

    • "data" sollte ein JSON-Objekt sein, nicht "Array of Object". Warum das überhaupt geht, weiss ich nicht.
    • "id" ist keine zulässige Property für C__CATG__IT_SERVICE. Beim Erstellen einer Kategorie muss man schon mysql die Wahl des primary keys überlassen.
    • "sysid" ist zwar zulässig; allerdings scheint mir das suspekt. Auch das Attribut würde ich weglassen.
    • Die eigentliche payload ist "connected_object". Hier gehört die ObjID des zuzuweisenden Services rein.

    Fehler ist:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "error": {
            "code": -32603,
            "message": "Internal error: There was an validation error",
            "data": [
                "(id) Category data id should be an integer value greater than zero."
            ]
        }
    }
    

    Bzw:

    {
        "version": "2.0",
        "method": "cmdb.category.create",
        "params": {
            "objID": 45,
            "data": {"sysid":"someservicename"},
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en",
            "id":1
        },
        "id": 1
    }
    

    Mit dem Fehler:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "error": {
            "code": -32603,
            "message": "Internal error: Database error : Query error: 'INSERT INTO isys_catg_its_components_list SET\n\t\t\tisys_catg_its_components_list__status = 2,\n\t\t\tisys_catg_its_components_list__description = '',\n\t\t\tisys_catg_its_components_list__isys_obj__id = NULL,\n\t\t\tisys_catg_its_components_list__isys_connection__id = 766;':\nColumn 'isys_catg_its_components_list__isys_obj__id' cannot be null\n",
            "data": {
                "mysqlErrorCode": 1048,
                "mysqlErrorMessage": "Database error : Query error: 'INSERT INTO isys_catg_its_components_list SET\n\t\t\tisys_catg_its_components_list__status = 2,\n\t\t\tisys_catg_its_components_list__description = '',\n\t\t\tisys_catg_its_components_list__isys_obj__id = NULL,\n\t\t\tisys_catg_its_components_list__isys_connection__id = 766;':\nColumn 'isys_catg_its_components_list__isys_obj__id' cannot be null\n"
            }
        }
    }
    

    Hier fehlt das "connected_object", welches im Feld "isys_catg_its_components_list__isys_obj__id" gelandet wäre.

    Ein Update habe ich nun zumindest zum laufen bekomme, wobei die id eine vorlaufende Nummer ist.

    {
        "version": "2.0",
        "method": "cmdb.category.update",
        "params": {
            "objID": 45,
            "data": {"sysid":"someservicename","id":4},
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en",
            "id":1
        },
        "id": 1
    }
    

    Result

    {
        "id": 1,
        "jsonrpc": "2.0",
        "result": {
            "success": true,
            "message": "Category entry successfully saved. [This method is deprecated und will be removed in a feature release. Use 'cmdb.category.save' instead.]"
        }
    }
    

    Aber ich nehme an, es wurde keine Änderung durchgeführt, mangels connected_object?

    Hat jemand eine Idee in welche Richtung der Fehler gehen könnte?

    Gruß Malte

    PS.: Die Methde 'cmdb.category.save' habe ich zwar im Changelog jedoch in keiner Doku gefunden. Hat jemand eine Idee wo ich hierzu mehr finde?

    Details finden sich in src/classes/modules/api/model/cmdb/isys_api_model_cmdb_category.class.php

    Im wesentlichen soll wohl eine bessere Konsistenzprüfung passieren. Außerdem passt der Name besser, weil ein Upgrade schon immer als Create bei nichtexistierenden single-value Kategorien funktioniert hat.



  • @franknagel said in i-doit API für Relationen (Service assignment):

    Außerdem passt der Name besser, weil ein

    Danke für das Feedback. Das mit der id, kommt daher, dass nach der ID gefragt wurde. Indem ich mich durch die API Modelle gewühlt habe, bin ich das WE noch mal etwas weiter gekommen. Leider ist es jetzt noch verwirrender:

    {
    	    "version": "2.0",
    	    "method": "cmdb.category.create",
    	    "params": {
    	        "objID": 45,
    	        "data":{"sysid":"someservice", "connected_object":[84]},
    	        "catgID": "C__CATG__IT_SERVICE",
    	        "apikey": "someapikey",
    	        "language": "en",
    	        "id":1
    	    },
    	    "id": 1
    	}
    

    Reponse:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "result": {
            "id": 11,
            "message": "Category entry successfully created. [This method is deprecated und will be removed in a feature release. Use 'cmdb.category.save' instead.]",
            "success": true
        }
    }
    

    Es wird auch ein Link erstellt, jedoch immer zur "Root Location" (id 1).
    Eine andere Idee die ich hatte war, die Relation/Connection zu erstellen. Diese wird auch im den Relationen und im Abhängigkeits-Baum angezeigt, jedoch nicht im Service.

    Langsam bin ich echt etwas frustriert 😞



  • Ich würde mal einfach

    "data":{"connected_object": 84}
    

    versuchen. So wie ich das verstehe, ist ein Array da nicht erlaubt. Dazu würde auch passen, dass in PHP 1 === (int) [84], wodurch sich der Link zur Root Location erklärt.



  • Das hatte ich auch schon versucht 😞
    Leider will er ein Array:

    {
        "version": "2.0",
        "method": "cmdb.category.create",
        "params": {
            "objID": 45,
            "data":{ "connected_object":84},
            "catgID": "C__CATG__IT_SERVICE",
            "apikey": "someapikey",
            "language": "en",
            "id":1
        },
        "id": 1
    }
    

    Error:

    {
        "id": 1,
        "jsonrpc": "2.0",
        "error": {
            "code": -32603,
            "message": "Internal error: There was an validation error",
            "data": {
                "connected_object": "(object_browser) Property has to be an array."
            }
        }
    }
    


  • Ich habe das ganze mal bei uns versucht:

    2019-02-19 16:18:49,401 DEBUG client Start RPC request
    {
        "id": "a86de6da345911e9aad1001999e535e4",
        "method": "cmdb.category.read",
        "params": {
            "apikey": "XXXXXXXXXX",
            "category": "C__CATG__IT_SERVICE",
            "objID": 52704,
            "status": "C__RECORD_STATUS__NORMAL"
        },
        "version": "2.0"
    }
    2019-02-19 16:18:49,475 DEBUG client RPC response
    {
        "id": "a86de6da345911e9aad1001999e535e4",
        "jsonrpc": "2.0",
        "result": []
    }
    2019-02-19 16:18:49,476 DEBUG client Start RPC request
    {
        "id": "a8793b5c345911e9aad1001999e535e4",
        "method": "cmdb.category.create",
        "params": {
            "apikey": "XXXXXXXXXX",
            "category": "C__CATG__IT_SERVICE",
            "data": {
                "connected_object": 7809
            },
            "objID": 52704
        },
        "version": "2.0"
    }
    2019-02-19 16:18:49,667 DEBUG client RPC response
    {
        "id": "a8793b5c345911e9aad1001999e535e4",
        "jsonrpc": "2.0",
        "result": {
            "id": 58,
            "message": "Category entry successfully created. [This method is deprecated und will be removed in a feature release. Use 'cmdb.category.save' instead.]",
            "success": true
        }
    }
    2019-02-19 16:18:49,667 DEBUG client Start RPC request
    {
        "id": "a8966d80345911e9aad1001999e535e4",
        "method": "cmdb.category.read",
        "params": {
            "apikey": "XXXXXXXXXX",
            "category": "C__CATG__IT_SERVICE",
            "objID": 52704,
            "status": "C__RECORD_STATUS__NORMAL"
        },
        "version": "2.0"
    }
    2019-02-19 16:18:49,752 DEBUG client RPC response
    {
        "id": "a8966d80345911e9aad1001999e535e4",
        "jsonrpc": "2.0",
        "result": [
            {
                "connected_object": {
                    "id": "7809",
                    "sysid": "SYSID_1435850439",
                    "title": "M4101400 LDAP-Infrastruktur-Provider",
                    "type": "C__OBJTYPE__IT_SERVICE",
                    "type_title": "Service"
                },
                "id": "58",
                "objID": "52704",
                "sysid": "SYSID_1435850439"
            }
        ]
    }
    

    Hier funktioniert es so. Der Unterschied ist: Ich habe die Validierung bei uns ausgeschaltet weil es noch anderswo Probleme damit gab.

    Unter Verwaltung -> Systemeinstellungen -> Experteneinstellungen

    einen Eintrag api.validation = 0 erzeugen (Ich glaube, der ist nicht per default vorhanden). Je nach Geschmack dann System- oder Tenent-wide.



  • Das wars! Klappt 👍
    Sollte man dafür noch einen Issue auf machen, klingt nach einem Bug?



  • Ja, kann man machen. Ich habe festgestellt, ich komme ohne Validierung besser zurecht.


Log in to reply
 


Datenschutz / Privacy Policy