Skip to content

Nutanix Prism API to SQL Server

Fetches data from the Nutanix Prism API and inserts it into SQL Server

Clusters and Cluster Hosts

This will sync all registered clusters to a table in SQL Server with the following format:

idnamedeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeecluster-nameNULL
aaaaaaaa-bbbb-cccc-dddd-ffffffffffffcluster-name-22021-01-01T00:00:01Z
yaml
  - name: Sync Clusters
    source: nutanix
    destination: sqlserver
    sourceConfig:
        listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
            kind: host
        response:
            length: metadata.total_matches
            items: entities
    destinationConfig:
        table: ntnx_cluster
        query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster] WHERE deleted IS NULL
        soft_delete: true
        deleted_field: deleted
        deleted_value: GETDATE()
    sourceTransformers:
        - transformer: strings.set_default
        config:
            inField: status.name
            defaultValue: no-name-provided
        - transformer: strings.uppercase
        config:
            inOutMap:
            status.name: name
            metadata.uuid: id
    comparisonColumns:
      - name: id
          type: Utf8
          unique: true
      - name: name
          type: Utf8

  - name: Sync Cluster Hosts
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
    destinationConfig:
      table: ntnx_cluster_host
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster_host] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.ipmi.ip
              to: ip_address
            - from: status.resources.controller_vm.ip
              to: controller_vm_ip
    comparisonColumns:
      - name: id
        type: Utf8
        unique: true
      - name: ip_address
        type: Utf8
      - name: controller_vm_ip
        type: Utf8
      - name: cluster_id
        type: Utf8
      - name: name
        type: Utf8

Subnets/Networks

Sync subnets and networks from Nutanix Prism API to SQL Server in the following format:

idcluster_idnamevlanvswitch_idvswitch_namedeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffsubnet-name100aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeevswitch-nameNULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffsubnet-name-2200aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeevswitch-name2021-01-01T00:00:01Z
yaml
  - name: Sync Subnets/Networks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/subnets/list
        method: POST
        body_type: application/json
        body:
          kind: subnet
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.vlan_id
          type: Int32
          unique: false
        - name: status.resources.virtual_switch_uuid
          type: Utf8
          unique: false
        - name: status.resources.vswitch_name
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_subnet
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_subnet] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: vlan
          type: Int32
          unique: false
        - name: vswitch_id
          type: Utf8
          unique: false
        - name: vswitch_name
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
            status.resources.virtual_switch_uuid: vswitch_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.vlan_id
              to: vlan
            - from: status.resources.vswitch_name
              to: vswitch_name

Virtual Machines, Disks and NICs

This section is going to synchronize Virtual Machines, Disks and NICs to three separate tables, using some of the more advanced transformers

Virtual Machines:

idcluster_idnameip_addressthreads_per_corevcpu_per_socketnum_socketsmemory_mbdescriptiondepartmentsdeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffvm-name1.1.1.12224096vm-descriptiondepartment-1,department-2NULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffvm-name-22.2.2.24448192vm-description-2department-3,department-42021-01-01T00:00:01Z

Virtual Machine NICs:

idvm_idmac_addresssubnet_idip_addressdeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffff00:00:00:00:00:00aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeNULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffff00:00:00:00:00:01aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee2021-01-01T00:00:01Z

Virtual Machine Disks:

idvm_iddevice_typesize_mbbus_iddeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffdisk10240NULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffdisk204812021-01-01T00:00:01Z
yaml
  - name: Sync Virtual Machines
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.nic_list
          type: List
          unique: false
        - name: status.resources.num_threads_per_core
          type: Int32
          unique: false
        - name: status.resources.num_vcpus_per_socket
          type: Int32
          unique: false
        - name: status.resources.num_sockets
          type: Int32
          unique: false
        - name: status.resources.memory_size_mib
          type: Int32
          unique: false
        - name: status.description
          type: Utf8
          unique: false
        - name: metadata.categories_mapping.Grupperingar
          type: List
    destinationConfig:
      table: ntnx_vm
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
        - name: threads_per_core
          type: Int32
          unique: false
        - name: vcpu_per_socket
          type: Int32
          unique: false
        - name: num_sockets
          type: Int32
          unique: false
        - name: memory_mb
          type: Int32
          unique: false
        - name: description
          type: Utf8
          unique: false
        - name: departments
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: structs.jsonpath
        config:
          inField: status.resources.nic_list
          outField: ip_address
          jsonPath: 0.ip_endpoint_list.0.ip
          defaultValue: ""
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.num_threads_per_core
              to: threads_per_core
            - from: status.resources.num_vcpus_per_socket
              to: vcpu_per_socket
            - from: status.resources.num_sockets
              to: num_sockets
            - from: status.resources.memory_size_mib
              to: memory_mb
            - from: status.description
              to: description
      - transformer: strings.join_listfield
        config:
          inField: metadata.categories_mapping.Grupperingar
          outField: departments
          separator: ","

  - name: Sync Virtual Machine NICs
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_nic
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_nic] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.nic_list
          fieldMap:
            id: uuid
            mac_address: mac_address
            subnet_id: subnet_reference.uuid
            ip_address: ip_endpoint_list.0.ip
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
            mac_address: mac_address
            subnet_id: subnet_id

  - name: Sync Virtual Machine Disks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: bus_id
          type: Int64
          unique: false
        - name: size_mb
          type: Int64
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_storage
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_storage] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: size_mb
          type: Int32
          unique: false
        - name: bus_id
          type: Int64
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.disk_list
          fieldMap:
            id: uuid
            device_type: device_properties.device_type
            size_bytes: disk_size_bytes
            bus_id: device_properties.disk_address.device_index
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
      - transformer: int.divide
        config:
          inField: size_bytes
          outField: size_mb
          factor: 1048576

Full Configuration

yaml
configVersion: V1
sources:
  - name: sqlserver
    type: Sqlserver
    connection:
      settings:
        connection_string: "Host=sqlserver;User=sa;Password=Password123;Database=NUTANIX_DB"
  - name: nutanix
    type: Rest
    connection:
      settings:
        base_url: "https://nutanix.local:9440"
        authentication:
          basic: true
          basic_user: username
          basic_pass: password
        ignore_certificates: true
sync:
  - name: Sync Clusters
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.name
          type: Utf8
    destinationConfig:
      table: ntnx_cluster
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: name
          type: Utf8
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id

  - name: Sync Cluster Hosts
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.name
          type: Utf8
        - name: status.cluster_reference.uuid
          type: Utf8
        - name: status.resources.ipmi.ip
          type: Utf8
        - name: status.resources.controller_vm.ip
          type: Utf8
    destinationConfig:
      table: ntnx_cluster_host
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster_host] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
        - name: name
          type: Utf8
        - name: ip_address
          type: Utf8
        - name: controller_vm_ip
          type: Utf8
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.ipmi.ip
              to: ip_address
            - from: status.resources.controller_vm.ip
              to: controller_vm_ip
                            
  - name: Sync Subnets/Networks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/subnets/list
        method: POST
        body_type: application/json
        body:
          kind: subnet
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.vlan_id
          type: Int32
          unique: false
        - name: status.resources.virtual_switch_uuid
          type: Utf8
          unique: false
        - name: status.resources.vswitch_name
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_subnet
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_subnet] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: vlan
          type: Int32
          unique: false
        - name: vswitch_id
          type: Utf8
          unique: false
        - name: vswitch_name
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
            status.resources.virtual_switch_uuid: vswitch_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.vlan_id
              to: vlan
            - from: status.resources.vswitch_name
              to: vswitch_name
              
  
  - name: Sync Virtual Machines
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.nic_list
          type: List
          unique: false
        - name: status.resources.num_threads_per_core
          type: Int32
          unique: false
        - name: status.resources.num_vcpus_per_socket
          type: Int32
          unique: false
        - name: status.resources.num_sockets
          type: Int32
          unique: false
        - name: status.resources.memory_size_mib
          type: Int32
          unique: false
        - name: status.description
          type: Utf8
          unique: false
        - name: metadata.categories_mapping.Grupperingar
          type: List
    destinationConfig:
      table: ntnx_vm
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
        - name: threads_per_core
          type: Int32
          unique: false
        - name: vcpu_per_socket
          type: Int32
          unique: false
        - name: num_sockets
          type: Int32
          unique: false
        - name: memory_mb
          type: Int32
          unique: false
        - name: description
          type: Utf8
          unique: false
        - name: departments
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: structs.jsonpath
        config:
          inField: status.resources.nic_list
          outField: ip_address
          jsonPath: 0.ip_endpoint_list.0.ip
          defaultValue: ""
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.num_threads_per_core
              to: threads_per_core
            - from: status.resources.num_vcpus_per_socket
              to: vcpu_per_socket
            - from: status.resources.num_sockets
              to: num_sockets
            - from: status.resources.memory_size_mib
              to: memory_mb
            - from: status.description
              to: description
      - transformer: strings.join_listfield
        config:
          inField: metadata.categories_mapping.Grupperingar
          outField: departments
          separator: ","

  - name: Sync Virtual Machine NICs
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_nic
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_nic] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.nic_list
          fieldMap:
            id: uuid
            mac_address: mac_address
            subnet_id: subnet_reference.uuid
            ip_address: ip_endpoint_list.0.ip
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
            mac_address: mac_address
            subnet_id: subnet_id

  - name: Sync Virtual Machine Disks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: bus_id
          type: Int64
          unique: false
        - name: size_mb
          type: Int64
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_storage
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_storage] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: size_mb
          type: Int32
          unique: false
        - name: bus_id
          type: Int64
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.disk_list
          fieldMap:
            id: uuid
            device_type: device_properties.device_type
            size_bytes: disk_size_bytes
            bus_id: device_properties.disk_address.device_index
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
      - transformer: int.divide
        config:
          inField: size_bytes
          outField: size_mb
          factor: 1048576