Fn functions executing CRUD
operations on Oracle DB. This sample uses a simple Employee
entity for demonstration purposes
For the purposes of this lab, an Oracle Database instance on Oracle Cloud Infrastructure has already been provisioned for you along with the associated schema and table
As you make your way through the tutorials, look out for this icon Whenever you see it, it's time for you to perform an action
-
Clone or download this repo
-
download the Oracle JDBC driver from this link (
ojdbc7.jar
should be fine) and copy it to theoracle_driver_docker
folder -
Build a Docker image with the driver JAR (You will use an existing Dockerfile)
cd fn-oracledb-java-workshop/oracle_driver_docker
Start Docker on your machine
docker build -t oracle_jdbc_driver_docker .
(if you choose to change the name of the image i.e.
oracle_jdbc_driver_docker
, you'll need to update those references in thebuild_image
section of thefunc.yaml
for all the functions)
(if successful) You should see an output as below
Sending build context to Docker daemon 3.401MB
Step 1/3 : FROM fnproject/fn-java-fdk-build:jdk9-1.0.63
---> 973847bef180
Step 2/3 : COPY ojdbc7.jar .
---> dd9005799e07
Step 3/3 : RUN mvn deploy:deploy-file -Durl=file:///function/repo -Dfile=ojdbc7.jar -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.1 -Dpackaging=jar
---> Running in 94bce78bf6bb
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom (3.9 kB at 1.6 kB/s)
............ skipping all the maven magic ..............
Uploading to remote-repository: file:///function/repo/com/oracle/ojdbc7/12.1.0.1/ojdbc7-12.1.0.1.jar
Uploaded to remote-repository: file:///function/repo/com/oracle/ojdbc7/12.1.0.1/ojdbc7-12.1.0.1.jar (3.4 MB at 6.3 MB/s)
Uploading to remote-repository: file:///function/repo/com/oracle/ojdbc7/12.1.0.1/ojdbc7-12.1.0.1.pom
Uploaded to remote-repository: file:///function/repo/com/oracle/ojdbc7/12.1.0.1/ojdbc7-12.1.0.1.pom (392 B at 49 kB/s)
Downloading from remote-repository: file:///function/repo/com/oracle/ojdbc7/maven-metadata.xml
Uploading to remote-repository: file:///function/repo/com/oracle/ojdbc7/maven-metadata.xml
Uploaded to remote-repository: file:///function/repo/com/oracle/ojdbc7/maven-metadata.xml (302 B at 22 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 27.221 s
[INFO] Finished at: 2018-08-30T02:08:09Z
[INFO] ------------------------------------------------------------------------
Removing intermediate container 94bce78bf6bb
---> fc46eb9cc4de
Successfully built fc46eb9cc4de
Successfully tagged oracle_jdbc_driver_docker:latest
Start local Fn server
fn start
Ensure you are running the latest fn cli (v0.4.153 or above) and fn server (v0.3.545 or above. If you have older version please update the CLI and the server
-
To update the fn cli run the following command
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
-
To update the fn server run the following command
fn update sv
Switch context
fn use context default
Check if default
is now the current context. Run the following command. An *
is used to indicate the current context as shown below.
fn ls context
CURRENT NAME PROVIDER API URL REGISTRY
* default default http://localhost:8080/v1
workshop oracle https://api.test.us-ashburn-1.functions.oci.oraclecloud.com iad.ocir.io/oracle-serverless-devrel/workshop-NNN
Set registry to a dummy name
export FN_REGISTRY=fndemouser
fn create app --config DB_URL=jdbc:oracle:thin:@//129.213.138.81:1521/workshop_iad1hs.sub08241855250.workshoplisbonv.oraclevcn.com --config DB_USER=workshopNNN --config DB_PASSWORD=<password> fn-oradb-java-app
Please replace
workshopNNN
in theDB_USER
attribute with your username (no hyphen) and your database password (provided by the lab instructor) in theDB_PASSWORD
attribute. Please leave the other parameters unchanged since they have been pre-configured based on the lab environment
Deploy one function at a time. For example, to deploy the create
function
cd ../create
fn -v deploy --app fn-oradb-java-app --local --no-bump
Make sure you do not miss the
--local
option without which Fn will try to push the function Docker images to an external Docker registry
For read
function deployment
cd ../read
fn -v deploy --app fn-oradb-java-app --local --no-bump
Repeat for other functions i.e. delete
and update
Check your app (and its config)
fn inspect app fn-oradb-java-app
{
"config": {
"DB_PASSWORD": "t0ps3cr3t",
"DB_URL": "jdbc:oracle:thin:@//129.213.138.81:1521/workshop_iad1hs.sub08241855250.workshoplisbonv.oraclevcn.com",
"DB_USER": "workshop130"
},
"created_at": "2018-08-30T07:08:35.791Z",
"id": "01CP4TK42FNG8G00GZJ0000002",
"name": "fn-oradb-java-app",
"updated_at": "2018-08-30T07:24:15.182Z"
}
Check associated functions
fn list functions fn-oradb-java-app
NAME IMAGE
fn-oradb-app-create-func fn-oradb-app-create-func:0.0.2
fn-oradb-app-delete-func fn-oradb-app-delete-func:0.0.1
fn-oradb-app-read-func fn-oradb-app-read-func:0.0.1
fn-oradb-app-update-func fn-oradb-app-update-func:0.0.1
A custom Docker image has been used as
build_image
(seefunc.yaml
) - this Docker image pre-packages the Oracle JDBC driver
.. with Fn CLI using fn invoke
echo -n '{"emp_email": "a@b.com","emp_name": "abhishek","emp_dept": "Product Divison"}' | fn invoke fn-oradb-java-app fn-oradb-app-create-func
If successful, you should a response similar to this Created employee CreateEmployeeInfo{emp_email=a@b.com, emp_name=abhishek, emp_dept=Product Divison}
Create as many as you want - make sure that the emp_email
is unique
fn invoke fn-oradb-java-app fn-oradb-app-read-func
You should get back a JSON response similar to below
[
{
"emp_email": "y@z.com",
"emp_name": "abhishek",
"emp_dept": "PM"
},
{
"emp_email": "a@b.com",
"emp_name": "abhishek",
"emp_dept": "Product Divison"
},
{
"emp_email": "x@y.com",
"emp_name": "kehsihba",
"emp_dept": "QA Divison"
}
]
to fetch employee with email a@b.com
echo -n 'a@b.com' | fn invoke fn-oradb-java-app fn-oradb-app-read-func
[
{
"emp_email": "a@b.com",
"emp_name": "abhishek",
"emp_dept": "Product Divison"
}
]
It is possible to update the department of an employee
echo -n '{"emp_email": "a@b.com", "emp_dept": "Support Operations"}' | fn invoke fn-oradb-java-app fn-oradb-app-update-func
Successful invocation will return back a message similar to Updated employee UpdateEmployeeInfo{emp_email=a@b.com, emp_dept=Support Operations}
Check to make sure - the updated department should reflect
echo -n 'a@b.com' | fn invoke fn-oradb-java-app fn-oradb-app-read-func
[
{
"emp_email": "a@b.com",
"emp_name": "abhishek",
"emp_dept": "Support Operations"
}
]
Use employee email to specify which employee record you want to delete - you should see Deleted employee a@b.com
message
echo -n 'a@b.com' | fn invoke fn-oradb-java-app fn-oradb-app-delete-func
Check to make sure
echo -n 'a@b.com' | fn invoke fn-oradb-java-app fn-oradb-app-read-func