Skip to main content
Redhat Developers  Logo
  • Products

    Featured

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat OpenShift AI
      Red Hat OpenShift AI
    • Red Hat Enterprise Linux AI
      Linux icon inside of a brain
    • Image mode for Red Hat Enterprise Linux
      RHEL image mode
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • Red Hat Developer Hub
      Developer Hub
    • View All Red Hat Products
    • Linux

      • Red Hat Enterprise Linux
      • Image mode for Red Hat Enterprise Linux
      • Red Hat Universal Base Images (UBI)
    • Java runtimes & frameworks

      • JBoss Enterprise Application Platform
      • Red Hat build of OpenJDK
    • Kubernetes

      • Red Hat OpenShift
      • Microsoft Azure Red Hat OpenShift
      • Red Hat OpenShift Virtualization
      • Red Hat OpenShift Lightspeed
    • Integration & App Connectivity

      • Red Hat Build of Apache Camel
      • Red Hat Service Interconnect
      • Red Hat Connectivity Link
    • AI/ML

      • Red Hat OpenShift AI
      • Red Hat Enterprise Linux AI
    • Automation

      • Red Hat Ansible Automation Platform
      • Red Hat Ansible Lightspeed
    • Developer tools

      • Red Hat Trusted Software Supply Chain
      • Podman Desktop
      • Red Hat OpenShift Dev Spaces
    • Developer Sandbox

      Developer Sandbox
      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Secure Development & Architectures

      • Security
      • Secure coding
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
      • View All Technologies
    • Start exploring in the Developer Sandbox for free

      sandbox graphic
      Try Red Hat's products and technologies without setup or configuration.
    • Try at no cost
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • Java
      Java icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • API Catalog
    • Product Documentation
    • Legacy Documentation
    • Red Hat Learning

      Learning image
      Boost your technical skills to expert-level with the help of interactive lessons offered by various Red Hat Learning programs.
    • Explore Red Hat Learning
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

JBoss Data Virtualization on OpenShift: Integrating a Remote SQL Server Database

 

January 4, 2018
Luigi Fugaro
Related topics:
Developer ToolsKubernetes
Related products:
Developer ToolsRed Hat JBoss Enterprise Application PlatformRed Hat OpenShiftRed Hat OpenShift Container Platform

Share:

    This example shows how on OpenShift to use a custom database driver to connect to an external database, through a Virtual Database (aka VDB). For this example, we will use a Microsoft SQL Server database (believe it or not, running on a Linux container), and the latest SQL Server JDBC driver.

    Prerequisites

    Before you begin, make sure you have the firewall and other security tools in a permissive mode.

    Here is the list of tools needed to follow the example:

    • Internet connection
    • Git client
    • OpenJDK 1.8
    • Docker
    • OpenShift oc command-line client

    You can download and unpack the OpenShift oc cli tool from the Red Hat Customer Portal for use on Linux, MacOSX, and Windows clients if you have an active OpenShift Enterprise subscription to access the downloads page.


    Editor's Note: Red Hat Container Development Kit includes a single-node OpenShift cluster you can run on your local machine. It is available by joining Red Hat Developers and downloading Red Hat Development Suite.


     

     

    Git clone the project

    To get the files needed for this example, clone my github repository:

    $ git clone https://github.com/foogaro/jdv-playground.git

    Then navigate to the ocp folder, as it will be our working directory.

    Setting up the SQL Server database

    Docker should be up and running, if it's not, start it as follows:

    $ service docker start
    Redirecting to /bin/systemctl start  docker.service

    Run SQL Server on a container as follows:

    $ docker run --name="sqlserver-loves-linux" -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=datavirt.2017' -p 1433:1433 -d microsoft/mssql-server-linux:latest
    Unable to find image 'microsoft/mssql-server-linux:latest' locally
    Trying to pull repository registry.access.redhat.com/microsoft/mssql-server-linux ...
    Trying to pull repository docker.io/microsoft/mssql-server-linux ...
    latest: Pulling from docker.io/microsoft/mssql-server-linux
    f6fa9a861b90: Downloading [======================>                            ] 20.91 MB/46.41 MB
    da7318603015: Downloading [==================================================>]    851 B/851 B
    6a8bd10c9278: Download complete
    d5a40291440f: Download complete
    bbdd8a83c0f1: Download complete
    3a52205d40a6: Downloading [========================>                          ] 14.45 MB/28.98 MB
    6192691706e8: Downloading [=====================>                             ] 16.51 MB/38.7 MB
    1a658a9035fb: Waiting
    97fa7291bda1: Waiting
    b27ed30c4cf6: Waiting

    Once done, you should have you database up and running, as follows:

    $ docker ps -aq
    CONTAINER ID        IMAGE                                                                                                                               COMMAND                  CREATED             STATUS                         PORTS                    NAMES
    d0bc27cdbf85        microsoft/mssql-server-linux:latest                                                                                                 "/bin/sh -c /opt/mssq"   2 hours ago         Up 2 hours                     0.0.0.0:1433->1433/tcp   sqlserver-loves-linux

    Once you have the database up and running, you can login to it and create the database, the schema, and the table, as follows:

    Create the database

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P datavirt.2017 -Q "CREATE DATABASE DATAVIRT2;"

    Create the table

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P datavirt.2017 -Q "USE DATAVIRT2;
    CREATE TABLE dbo.ITEMS ( 
      ITEM_ID INT NOT NULL, 
      ITEM_CODE VARCHAR(20) NOT NULL,  
      ITEM_DESCRITION VARCHAR(255) ,
      DT_INSERT DATETIME NOT NULL,
      DT_UPDATE DATETIME NOT NULL,
      CONSTRAINT PK_ITEM_ID PRIMARY KEY (ITEM_ID)
    );"

    Populate the table

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P datavirt.2017 -Q "USE DATAVIRT2;
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (1, '0000-0000-0000-0001', 'One', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (2, '0000-0000-0000-0002', 'Two', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (3, '0000-0000-0000-0003', 'Three', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (4, '0000-0000-0000-0004', 'Four', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (5, '0000-0000-0000-0005', 'Five', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (6, '0000-0000-0000-0006', 'Six', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (7, '0000-0000-0000-0007', 'Seven', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (8, '0000-0000-0000-0008', 'Eight', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (9, '0000-0000-0000-0009', 'Nine', GETDATE(), GETDATE());
    INSERT INTO dbo.ITEMS (ITEM_ID, ITEM_CODE, ITEM_DESCRITION, DT_INSERT, DT_UPDATE) VALUES (10, '0000-0000-0000-0010', 'Ten', GETDATE(), GETDATE());"

    Running OCP

    The OC client tool will use Docker to create all the nodes it needs, such as the docker registry, the HAProxy node, and so on.
    It's a good practice to have the OpenShift configuration persisted, so we don't need to eventually re-import tables, images and so on.
    Here is the script that we will use to launch OCP:

    oc cluster up \
    --host-data-dir="/opt/rh/oc-cluster-up/data"  \
    --host-pv-dir="/opt/rh/oc-cluster-up/pv"  \
    --host-volumes-dir="/opt/rh/oc-cluster-up/vol" \
    --logging=false \
    --metrics=true \
    --public-hostname="ocp.foogaro.com" \
    --routing-suffix="apps.foogaro.com" \
    --use-existing-config ocp-datavirt

    Feel free to change the hostname and the routing suffix to whatever you want. Also, make sure to add the hostname in your /etc/hosts file.
    If everything started properly, you should have an output similar to the following:

    Starting OpenShift using registry.access.redhat.com/openshift3/ose:v3.6.173.0.5 ...
    OpenShift server started.
    
    The server is accessible via web console at:
        https://ocp.foogaro.com:8443
    

    Login into OCP

    We can now start using the OpenShift Container Platform.
    First of all we need to login as system administrator and import the Docker images we need, as follows:

    oc login -u system:admin https://127.0.0.1:8443
    Logged into "https://127.0.0.1:8443" as "system:admin" using existing credentials.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
    
      * default
        kube-public
        kube-system
        myproject
        openshift
        openshift-infra
    
    Using project "default".

    To access the platform as system administrator you don't need credentials, as it uses a certificate which was created during the installation.
    Once we are in, we can start importing the templates as follows:

    oc create -n openshift -f https://raw.githubusercontent.com/jboss-openshift/application-templates/master/jboss-image-streams.json
    oc create -n openshift -f https://raw.githubusercontent.com/jboss-openshift/application-templates/master/datavirt/datavirt63-basic-s2i.json
    oc create -n openshift -f https://raw.githubusercontent.com/jboss-openshift/application-templates/master/datavirt/datavirt63-extensions-support-s2i.json
    oc create -n openshift -f https://raw.githubusercontent.com/jboss-openshift/application-templates/master/datavirt/datavirt63-secure-s2i.json

    Now that we have the templates loaded into the platform, we can use them to create our project.
    First login as admin as follows:

    oc login -u admin -p admin
    Login successful.
    
    You don't have any projects. You can try to create a new project, by running
    
        oc new-project <projectname>
    

    Now create a project:

    oc new-project jdv-playground --description="JDV Playground on OCP" --display-name="JDV Playground"

    Now create the app, as follows:

    oc new-app --template=datavirt63-extensions-support-s2i \
    -p APPLICATION_NAME=datavirt-app \
    -p CONFIGURATION_NAME=datavirt-app-config \
    -p SOURCE_REPOSITORY_URL=https://github.com/foogaro/jdv-playground \
    -p SOURCE_REPOSITORY_REF=master \
    -p CONTEXT_DIR=ocp/vdbs \
    -p EXTENSIONS_REPOSITORY_URL=https://github.com/foogaro/jdv-playground \
    -p EXTENSIONS_REPOSITORY_REF=master \
    -p EXTENSIONS_DIR=ocp/drivers \
    -p EXTENSIONS_DOCKERFILE=Dockerfile \
    -p SERVICE_ACCOUNT_NAME=datavirt-service-account \
    -p HTTPS_SECRET=datavirt-app-secret \
    -p HTTPS_KEYSTORE=keystore.jks \
    -p HTTPS_KEYSTORE_TYPE=JKS \
    -p HTTPS_NAME=datavirt \
    -p HTTPS_PASSWORD=datavirt.2017 \
    -p TEIID_USERNAME=teiidUser \
    -p TEIID_PASSWORD=datavirt.2017 \
    -p MODESHAPE_USERNAME=modeshapeUser \
    -p MODESHAPE_PASSWORD=datavirt.2017 \
    -p IMAGE_STREAM_NAMESPACE=jdv-playground \
    -p JGROUPS_ENCRYPT_SECRET=datavirt-app-secret \
    -p JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceks \
    -p JGROUPS_ENCRYPT_NAME=datavirt \
    -p JGROUPS_ENCRYPT_PASSWORD=datavirt.2017 \
    -p JGROUPS_CLUSTER_PASSWORD=datavirt.2017 \
    -p VDB_DIRS=

    This will automatically create the app and start building the image based on the code and resource files.
    While it is building the first images, we need to create a couple of secrets and link them to our application, as follows:

    oc create serviceaccount datavirt-service-account
    oc policy add-role-to-user view system:serviceaccount:jdv-play:datavirt-service-account -n jdv-playground
    oc secrets new datavirt-app-secret keystore.jks jgroups.jceks -n jdv-playground
    oc secrets new datavirt-app-config datasources.env -n jdv-playground
    oc secrets link datavirt-service-account datavirt-app-secret datavirt-app-config -n jdv-playground

    Next, create the following environment variables for the build config and the deployment config, as follows:

    oc env bc/datavirt-app VDB_DIRS=
    oc env dc/datavirt-app SQLSERVER_DS_DATABASE=DATAVIRT
    oc env dc/datavirt-app SQLSERVER_DS_JNDI=java:/SQLSERVER_DS
    oc env dc/datavirt-app SQLSERVER_DS_USERNAME=sa
    oc env dc/datavirt-app SQLSERVER_DS_PASSWORD=datavirt.2017
    oc env dc/datavirt-app SQLSERVER_DS_URL="jdbc:sqlserver://192.168.59.105:1433;DatabaseName=DATAVIRT;"
    oc env dc/datavirt-app SQLSERVER_DS_SERVICE_HOST=192.168.59.105
    oc env dc/datavirt-app SQLSERVER_DS_SERVICE_PORT=1433

    If you need to restart the build, do as follows:

    oc start-build datavirt-app-ext

    If you need to delete the serviceaccount, and the secrets, do as follows:

    oc delete secrets datavirt-app-secret
    oc delete secrets datavirt-app-config
    oc delete serviceaccount datavirt-service-account

    If you need to provide your own certificates, here is how I created mine:

    keytool -genkeypair -alias datavirt -storetype JKS   -keystore keystore.jks  -storepass "datavirt.2017" -keypass "datavirt.2017" --dname "CN=lfugaro,OU=Consulting,O=redhat.com,L=Raleigh,S=NC,C=US"
    keytool -genseckey  -alias datavirt -storetype JCEKS -keystore jgroups.jceks -storepass "datavirt.2017" -keypass "datavirt.2017" --dname "CN=lfugaro,OU=Consulting,O=redhat.com,L=Raleigh,S=NC,C=US"

    The web console

    If everything worked fine, you should be able to connect to the web console on port 8443, login as admin (password "admin" as well), and see something similar to the following image:

    alt text

    Getting the data out of the VDB

    JDV out-of-the-box exposes its data through the OData protocol version 2 and 4. The schema of the database can be obtained with the following URL:

    http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/$metadata

    Where odata4 specifies the protocol version to use; the first ITEMS refers to the VDB name, and the second ITEMS refers to the schema.
    Here is how the output should look like:

    <?xml version='1.0' encoding='UTF-8'?>
    <edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
        <edmx:Reference Uri="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/static/org.apache.olingo.v1.xml">
            <edmx:Include Namespace="org.apache.olingo.v1" Alias="olingo-extensions"/>
        </edmx:Reference>
        <edmx:DataServices>
            <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="ITEMS.1.ITEMS" Alias="ITEMS">
                <EntityType Name="ITEMS">
                    <Key>
                        <PropertyRef Name="ITEM_ID"/>
                    </Key>
                    <Property Name="ITEM_ID" Type="Edm.Int32" Nullable="false"/>
                    <Property Name="ITEM_CODE" Type="Edm.String" Nullable="false" MaxLength="20"/>
                    <Property Name="ITEM_DESCRITION" Type="Edm.String" MaxLength="255"/>
                    <Property Name="DT_INSERT" Type="Edm.DateTimeOffset" Nullable="false" Precision="4"/>
                    <Property Name="DT_UPDATE" Type="Edm.DateTimeOffset" Nullable="false" Precision="4"/>
                </EntityType>
                <EntityContainer Name="ITEMS">
                    <EntitySet Name="ITEMS" EntityType="ITEMS.ITEMS"/>
                </EntityContainer>
            </Schema>
        </edmx:DataServices>
    </edmx:Edmx>

    The XML code above shows the structure of the datatabse, along with the tables, which are the entities it has.
    We have one table named ITEMS. To access the table, point to the following URL:

    http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS

    Here is how the output should look:

    <?xml version='1.0' encoding='UTF-8'?>
    <a:feed xmlns:a="http://www.w3.org/2005/Atom" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata"
            xmlns:d="http://docs.oasis-open.org/odata/ns/data" m:context="$metadata#ITEMS">
        <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS</a:id>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(1)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(1)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">1</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0001</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>One</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.797Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.797Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(2)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(2)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">2</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0002</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Two</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.797Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.797Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(3)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(3)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">3</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0003</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Three</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.8Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.8Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(4)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(4)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">4</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0004</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Four</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.807Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.807Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(5)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(5)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">5</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0005</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Five</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.807Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.807Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(6)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(6)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">6</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0006</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Six</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.81Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.81Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(7)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(7)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">7</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0007</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Seven</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.81Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.81Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(8)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(8)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">8</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0008</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Eight</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.817Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.817Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(9)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(9)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">9</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0009</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Nine</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.817Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.817Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
        <a:entry>
            <a:id>http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(10)</a:id>
            <a:title/>
            <a:summary/>
            <a:updated>2017-12-10T00:24:38Z</a:updated>
            <a:author>
                <a:name/>
            </a:author>
            <a:link rel="edit" href="http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS(10)"/>
            <a:category scheme="http://docs.oasis-open.org/odata/ns/scheme" term="#ITEMS.1.ITEMS.ITEMS"/>
            <a:content type="application/xml">
                <m:properties>
                    <d:ITEM_ID m:type="Int32">10</d:ITEM_ID>
                    <d:ITEM_CODE>0000-0000-0000-0010</d:ITEM_CODE>
                    <d:ITEM_DESCRITION>Ten</d:ITEM_DESCRITION>
                    <d:DT_INSERT m:type="DateTimeOffset">2017-12-09T19:52:50.82Z</d:DT_INSERT>
                    <d:DT_UPDATE m:type="DateTimeOffset">2017-12-09T19:52:50.82Z</d:DT_UPDATE>
                </m:properties>
            </a:content>
        </a:entry>
    </a:feed>

    You can eventually have the result in a different format, for example in JSON, by specifing the $format, as follows:

    http://datavirt-app-jdv-playground.apps.foogaro.com/odata4/ITEMS/ITEMS/ITEMS?$format=json

    Here is how the output should look like:

    {
      "@odata.context": "$metadata#ITEMS",
      "value": [
        {
          "ITEM_ID": 1,
          "ITEM_CODE": "0000-0000-0000-0001",
          "ITEM_DESCRITION": "One",
          "DT_INSERT": "2017-12-09T19:52:50.797Z",
          "DT_UPDATE": "2017-12-09T19:52:50.797Z"
        },
        {
          "ITEM_ID": 2,
          "ITEM_CODE": "0000-0000-0000-0002",
          "ITEM_DESCRITION": "Two",
          "DT_INSERT": "2017-12-09T19:52:50.797Z",
          "DT_UPDATE": "2017-12-09T19:52:50.797Z"
        },
        {
          "ITEM_ID": 3,
          "ITEM_CODE": "0000-0000-0000-0003",
          "ITEM_DESCRITION": "Three",
          "DT_INSERT": "2017-12-09T19:52:50.8Z",
          "DT_UPDATE": "2017-12-09T19:52:50.8Z"
        },
        {
          "ITEM_ID": 4,
          "ITEM_CODE": "0000-0000-0000-0004",
          "ITEM_DESCRITION": "Four",
          "DT_INSERT": "2017-12-09T19:52:50.807Z",
          "DT_UPDATE": "2017-12-09T19:52:50.807Z"
        },
        {
          "ITEM_ID": 5,
          "ITEM_CODE": "0000-0000-0000-0005",
          "ITEM_DESCRITION": "Five",
          "DT_INSERT": "2017-12-09T19:52:50.807Z",
          "DT_UPDATE": "2017-12-09T19:52:50.807Z"
        },
        {
          "ITEM_ID": 6,
          "ITEM_CODE": "0000-0000-0000-0006",
          "ITEM_DESCRITION": "Six",
          "DT_INSERT": "2017-12-09T19:52:50.81Z",
          "DT_UPDATE": "2017-12-09T19:52:50.81Z"
        },
        {
          "ITEM_ID": 7,
          "ITEM_CODE": "0000-0000-0000-0007",
          "ITEM_DESCRITION": "Seven",
          "DT_INSERT": "2017-12-09T19:52:50.81Z",
          "DT_UPDATE": "2017-12-09T19:52:50.81Z"
        },
        {
          "ITEM_ID": 8,
          "ITEM_CODE": "0000-0000-0000-0008",
          "ITEM_DESCRITION": "Eight",
          "DT_INSERT": "2017-12-09T19:52:50.817Z",
          "DT_UPDATE": "2017-12-09T19:52:50.817Z"
        },
        {
          "ITEM_ID": 9,
          "ITEM_CODE": "0000-0000-0000-0009",
          "ITEM_DESCRITION": "Nine",
          "DT_INSERT": "2017-12-09T19:52:50.817Z",
          "DT_UPDATE": "2017-12-09T19:52:50.817Z"
        },
        {
          "ITEM_ID": 10,
          "ITEM_CODE": "0000-0000-0000-0010",
          "ITEM_DESCRITION": "Ten",
          "DT_INSERT": "2017-12-09T19:52:50.82Z",
          "DT_UPDATE": "2017-12-09T19:52:50.82Z"
        }
      ]
    }

    That's it, I hope it helped!


    OpenShift Enterprise is now officially known as Red Hat OpenShift Container Platform beginning with version 3.3. Learn how you can get a complete single-node OpenShift cluster running on your laptop using Red Hat Container Development Kit.

    Last updated: November 9, 2023

    Recent Posts

    • GuideLLM: Evaluate LLM deployments for real-world inference

    • Unleashing multimodal magic with RamaLama

    • Integrate Red Hat AI Inference Server & LangChain in agentic workflows

    • Streamline multi-cloud operations with Ansible and ServiceNow

    • Automate dynamic application security testing with RapiDAST

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Products

    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue