apache atlas update type with v2 API

1.5k Views Asked by At

Did anyone succeed to update a type in Apache Atlas using curl and the V2 REST API?

For example: I would try to add fields to the rdbms_table type, such as :

    {
        "name": "business_contact_info",
        "typeName": "string",
        "isOptional": true,
        "cardinality": "SINGLE",
        "valuesMinCount": 0,
        "valuesMaxCount": 1,
        "isUnique": false,
        "isIndexable": false,
        "includeInNotification": false
    }

I tried several solutions around this command :

curl -u username:password -d @./typedef-rdbms_table.json -X PUT http://c7402.ambari.apache.org:21000/api/atlas/v2/types/typedefs -H ‘Content-Type:application/json; charset=UTF-8’

with a json file looking like :

{
  "classificationDefs" : [],
  "entityDefs": [
   {
    "category": "ENTITY",
    "guid": "ef3d3dd6-c2ac-4f0b-a566-9b8036c3b03b",
    "createdBy": "atlas",
    "updatedBy": "atlas",
    "createTime": 1541616267291,
    "updateTime": 1541616267291,
    "version": 1,
    "name": "rdbms_table",
    "description": "a table in an rdbms database (schema)",
    "typeVersion": "1.0",
    "attributeDefs": [
        {
            "name": "db",
            "typeName": "rdbms_db",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false,
            "constraints": [
                {
                    "type": "inverseRef",
                    "params": {
                        "attribute": "tables"
                    }
                }
            ]
        },
        {
            "name": "name_path",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "createTime",
            "typeName": "date",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "comment",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "type",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "contact_info",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "business_contact_info",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "quality_kpi",
            "typeName": "int",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "business_name",
            "typeName": "string",
            "isOptional": true,
            "cardinality": "SINGLE",
            "valuesMinCount": 0,
            "valuesMaxCount": 1,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false
        },
        {
            "name": "columns",
            "typeName": "array<rdbms_column>",
            "isOptional": true,
            "cardinality": "SET",
            "valuesMinCount": 0,
            "valuesMaxCount": 2147483647,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false,
            "constraints": [
                {
                    "type": "ownedRef"
                }
            ]
        },
        {
            "name": "indexes",
            "typeName": "array<rdbms_index>",
            "isOptional": true,
            "cardinality": "SET",
            "valuesMinCount": 0,
            "valuesMaxCount": 2147483647,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false,
            "constraints": [
                {
                    "type": "ownedRef"
                }
            ]
        },
        {
            "name": "foreign_keys",
            "typeName": "array<rdbms_foreign_key>",
            "isOptional": true,
            "cardinality": "SET",
            "valuesMinCount": 0,
            "valuesMaxCount": 2147483647,
            "isUnique": false,
            "isIndexable": false,
            "includeInNotification": false,
            "constraints": [
                {
                    "type": "ownedRef"
                }
            ]
        }
    ],
    "superTypes": [
        "DataSet",
        "Asset"
    ],
    "subTypes": []
   }
 ],
  "enumDefs" : [],
  "relationshipDefs" : [],
  "structDefs" : []
}

Thanks!

1

There are 1 best solutions below

0
On

Apache Atlas allows updating typeDef with optional attributes. Creating and updating a type definition can be done in following way:

Initial typeDef: POST: /api/atlas/v2/types/typedefs

{
    "entityDefs": [
        {
            "name": "test",
            "description": "test type",
            "superTypes": [
                "DataSet"
            ],
            "typeVersion": "1.0",
            "attributeDefs": [
                {
                    "name": "subject_area_name",
                    "typeName": "string",
                    "isOptional": true,
                    "cardinality": "SINGLE",
                    "isUnique": false,
                    "isIndexable": true
                }
            ]
        }
    ]
}

Adding optional attribute:

{
    "name": "subject_area_id",
    "typeName": "string",
    "isOptional": true,
    "cardinality": "SINGLE",
    "isUnique": false,
    "isIndexable": true
}

PUT:/api/atlas/v2/types/typedefs

{
    "enumDefs": [],
    "structDefs": [],
    "classificationDefs": [],
    "entityDefs": [
        {
            "category": "ENTITY",
            "guid": "d711c846-06a4-4965-b490-f603e16ca29e",
            "createdBy": "admin",
            "updatedBy": "admin",
            "createTime": 1549344291502,
            "updateTime": 1549344291502,
            "version": 1,
            "name": "test",
            "description": "test type",
            "typeVersion": "1.0",
            "attributeDefs": [
                {
                    "name": "subject_area_id",
                    "typeName": "string",
                    "isOptional": true,
                    "cardinality": "SINGLE",
                    "isUnique": false,
                    "isIndexable": true
                },
                {
                    "name": "subject_area_name",
                    "typeName": "string",
                    "isOptional": true,
                    "cardinality": "SINGLE",
                    "valuesMinCount": 0,
                    "valuesMaxCount": 1,
                    "isUnique": false,
                    "isIndexable": true,
                    "includeInNotification": false
                }
            ],
            "superTypes": [
                "DataSet"
            ],
            "subTypes": []
        }
    ],
    "relationshipDefs": []
}

This updates the type with additonal attribte. Detailed REST documentaion can be found here