Community
    • Categories
    • Recent
    • Popular
    • Users
    • Search
    • Register
    • Login

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

    Scheduled Pinned Locked Moved Entwicklung
    8 Posts 2 Posters 911 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ? Offline
      A Former User
      last edited by A Former User

      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?

      F 1 Reply Last reply Reply Quote 0
      • F Offline
        franknagel @Guest
        last edited by

        @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.

        1 Reply Last reply Reply Quote 0
        • ? Offline
          A Former User
          last edited by

          @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 😞

          1 Reply Last reply Reply Quote 0
          • F Offline
            franknagel
            last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • ? Offline
              A Former User
              last edited by

              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."
                      }
                  }
              }
              
              1 Reply Last reply Reply Quote 0
              • F Offline
                franknagel
                last edited by

                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.

                1 Reply Last reply Reply Quote 0
                • ? Offline
                  A Former User
                  last edited by

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

                  1 Reply Last reply Reply Quote 0
                  • F Offline
                    franknagel
                    last edited by

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

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post