{"id":13213,"date":"2020-01-04T08:00:52","date_gmt":"2020-01-04T07:00:52","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/"},"modified":"2020-01-04T08:00:52","modified_gmt":"2020-01-04T07:00:52","slug":"documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/","title":{"rendered":"Documentum &#8211; Connection to docbrokers and Repositories inside K8s from an external DFC Client"},"content":{"rendered":"<p>How can you connect an external DFC Client to docbrokers and Repositories hosted on Kubernetes Pods? That seems to be a very simple question yet it might prove difficult&#8230; Let&#8217;s talk about this challenge in this blog and possible solutions\/workarounds.<\/p>\n<p>As you all know, Kubernetes is using containers so just like for a basic Docker container, you won&#8217;t be able to access it from the outside by default. On Docker, you will need to expose some ports and then you can interact with whatever is running on that port. For Kubernetes, it&#8217;s the same principle but it obviously add other layers in addition which makes it even more complicated. Therefore, if you want to be able to connect to a docbroker inside a K8s Pod from the outside of K8s, then you will need to do a few things:<\/p>\n<ul>\n<li>at the container level, to open the ports 1489\/1490 (default ones, you can change them obviously)<\/li>\n<li>a K8s Service to expose these ports inside K8s<\/li>\n<li>an Nginx Ingres Controller for which the TCP ports 1489\/1490 have been configured for external accesses (or other ports if these are already used for another namespace for example)<\/li>\n<li>a &#8220;Load Balancer&#8221; K8s Service (still at the Nginx Ingres Controller level) which exposes these ports using an external IP<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Once you have that, you should be able to communicate with a docbroker that is inside a K8s pod. If you want to have a chance to talk to a Repository, then you will also need to do the same thing but for the Repository ports. When you install a repo, you will specify in the \/etc\/services the ports it should use (just like for the docbroker).<\/p>\n<p>For this example, let&#8217;s start simple with the same ports internally and externally:<\/p>\n<ul>\n<li>DFC Client host: <strong>vm<\/strong><\/li>\n<li>K8s pod short name (hostname): <strong>cs-0<\/strong><\/li>\n<li>K8s pod full name (headless service \/ full hostname): <strong>cs-0.cs.dbi-ns01.svc.cluster.local<\/strong><\/li>\n<li>K8s pod IP: <strong>1.1.1.100<\/strong><\/li>\n<li>K8s pod docbroker port: <strong>1489<\/strong>\/<strong>1490<\/strong><\/li>\n<li>K8s pod Repositories port: <strong>gr_repo<\/strong>=<strong>49400<\/strong>\/<strong>49401<\/strong>\u00a0\u00a0\u00a0 \/\/ \u00a0\u00a0 <strong>REPO1<\/strong>=<strong>49402<\/strong>\/<strong>49403<\/strong><\/li>\n<li>K8s external hostname\/lb: <strong>k8s-cs-dbi-ns01.domain.com<\/strong><\/li>\n<li>K8s external IP: <strong>2.2.2.200<\/strong><\/li>\n<li>K8s external docbroker port: <strong>1489<\/strong>\/<strong>1490<\/strong><\/li>\n<li>K8s external Repositories port: <strong>gr_repo<\/strong>=<strong>49400<\/strong>\/<strong>49401<\/strong>\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 <strong>REPO1<\/strong>=<strong>49402<\/strong>\/<strong>49403<\/strong><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Considering the above setup (both the docbroker and Repositories ports configured on K8s), you can already talk to the docbroker properly:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [7,12,19,45]\">[dmadmin@vm ~]$ grep \"dfc.docbroker\" dfc.properties\ndfc.docbroker.host[0]=k8s-cs-dbi-ns01.domain.com\ndfc.docbroker.port[0]=1489\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ nc -v k8s-cs-dbi-ns01.domain.com 1489\nNcat: Version 7.50 ( https:\/\/nmap.org\/ncat )\nNcat: Connected to 2.2.2.200:1489.\n^C\n[dmadmin@vm ~]$ \n[dmadmin@vm ~]$ nc -v k8s-cs-dbi-ns01.domain.com 49402\nNcat: Version 7.50 ( https:\/\/nmap.org\/ncat )\nNcat: Connected to 2.2.2.200:49402.\n^C\n[dmadmin@vm ~]$ \n[dmadmin@vm ~]$ dmqdocbroker -t k8s-cs-dbi-ns01.domain.com -p 1489 -c ping\ndmqdocbroker: A DocBroker Query Tool\ndmqdocbroker: Documentum Client Library Version: 16.4.0000.0185\nUsing specified port: 1489\nSuccessful reply from docbroker at host (cs-0) on port(1490) running software version (16.4.0170.0234  Linux64).\n[dmadmin@vm ~]$ \n[dmadmin@vm ~]$ dmqdocbroker -t k8s-cs-dbi-ns01.domain.com -p 1489 -c getdocbasemap\ndmqdocbroker: A DocBroker Query Tool\ndmqdocbroker: Documentum Client Library Version: 16.4.0000.0185\nUsing specified port: 1489\n**************************************************\n**     D O C B R O K E R    I N F O             **\n**************************************************\nDocbroker host            : cs-0\nDocbroker port            : 1490\nDocbroker network address : INET_ADDR: 01 2d3 01010164 cs-0 1.1.1.100\nDocbroker version         : 16.4.0170.0234  Linux64\n**************************************************\n**     D O C B A S E   I N F O                  **\n**************************************************\n--------------------------------------------\nDocbase name        : gr_repo\nDocbase id          : 1234567\nDocbase description : dbi-ns01 dev k8s gr\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       : Global Registry\nDocbase Dormancy Status     :\n--------------------------------------------\nDocbase name        : REPO1\nDocbase id          : 1234568\nDocbase description : dbi-ns01 dev k8s repo1\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       :\nDocbase Dormancy Status     :\n--------------------------------------------\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>So as you can see above, the docbroker does respond properly with the list of Repositories that it is aware of (Repo name, ID, hostname, &#8230;) and for that purpose, there is no need for the Repositories&#8217; ports to be opened, only the docbroker is enough. However, as soon as you want to go further and start talking to the Repositories, you will obviously need to open these additional ports as well. Above, I used 49402\/49403 for the REPO1 Repository (both internal and external). When trying to login to a target Repository, it will fail:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[dmadmin@vm ~]$ echo \"quit\" | iapi REPO1 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO1\n^C[dmadmin@vm ~]$\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>Why is that? Well the reason is that to connect to a docbroker, a DFC Client will use the value from the well-known &#8220;<strong>dfc.properties<\/strong>&#8221; file. By reading it, it will know where the docbroker can be found: in our case, it&#8217;s &#8220;<strong>k8s-cs-dbi-ns01.domain.com:1489<\/strong>&#8220;. When that is done, the docbroker replies with the list of Repositories known and it will also reply with the &#8220;host&#8221; that should be used to communicate with the Repositories. That&#8217;s because the Repositories might not be on the same host as the docbroker and therefore it needs to provides the information to the DFC Client. However, that &#8220;host&#8221; is actually an IP! When a Repository register itself with a docbroker, the docbroker records the source IP of the request and it will then forward this IP to the DFC Client that wants to talk to this Repository.<\/p>\n<p>The problem here is that the Repositories are installed on K8s Pods and therefore the IP that the docbroker knows is actually the IP of the K8s Pod&#8230; Which is, therefore, not reachable from outside of K8s!<\/p>\n<p>&nbsp;<\/p>\n<h3>1. IP Forwarding, a solution?<\/h3>\n<p>If you want to validate a setup or do some testing, it&#8217;s pretty simple on Linux, you can quickly setup an IP Forwarding between the IP of the K8s Pod (which points to nothing) and the IP of the K8s LB Service that you configured previously for the docbroker and Repositories ports. Here is an example:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [7,9,10,15,18,19,23,33,36,39,51]\">[dmadmin@vm ~]$ nslookup k8s-cs-dbi-ns01.domain.com\nServer: 1.1.1.10\nAddress: 1.1.1.10#53\n\nk8s-cs-dbi-ns01.domain.com     canonical name = k8s-cluster-worker2.domain.com.\nName:   k8s-cluster-worker2.domain.com\nAddress: 2.2.2.200\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ external_ip=2.2.2.200\n[dmadmin@vm ~]$ ping -c 1 ${external_ip}\nPING 2.2.2.200 (2.2.2.200) 56(84) bytes of data.\n64 bytes from 2.2.2.200: icmp_seq=1 ttl=63 time=0.980 ms\n\n--- 2.2.2.200 ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\nrtt min\/avg\/max\/mdev = 0.980\/0.980\/0.980\/0.000 ms\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ internal_ip=1.1.1.100\n[dmadmin@vm ~]$ ping -c 1 ${internal_ip}\nPING 1.1.1.100 (1.1.1.100) 56(84) bytes of data.\n\n--- 1.1.1.100 ping statistics ---\n1 packets transmitted, 0 received, 100% packet loss, time 0ms\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ echo \"quit\" | iapi REPO1 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO1\n^C[dmadmin@vm ~]$\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ sudo sysctl -w net.ipv4.ip_forward=1\nnet.ipv4.ip_forward = 1\n[dmadmin@vm ~]$ \n[dmadmin@vm ~]$ sudo iptables -t nat -A OUTPUT -d ${internal_ip} -j DNAT --to-destination ${external_ip}\n[dmadmin@vm ~]$ \n[dmadmin@vm ~]$ echo \"quit\" | iapi REPO1 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO1\n[DM_SESSION_I_SESSION_START]info:  \"Session 0112d6888000152a started for user dmadmin.\"\n\nConnected to OpenText Documentum Server running Release 16.4.0170.0234  Linux64.Oracle\nSession id is s0\nAPI&gt; Bye\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>As you can see above, as soon as you configure an IP Forwarding from the Pod IP to the K8s LB IP, then the Repository connection is successful. Here, I just executed a &#8220;<strong>quit<\/strong>&#8221; command to close the iAPI session but it shows that the session creation is working so you are sure that the end-to-end communication is fine.<\/p>\n<p>Obviously, that is just for testing&#8230; Indeed, your Pod IP is going to change in the future (after each restart of the pod for example) which means that the IP Forwarding will be broken at that time. This also requires being setup on the client directly because the DFC Client will try to communicate with a specific IP&#8230; But this IP most probably doesn&#8217;t point to anything and therefore the only way to make it happen correctly is either setting that up on the client or on the network layer, which is super annoying and isn&#8217;t really reliable anyway so this isn&#8217;t a solution.<\/p>\n<p>&nbsp;<\/p>\n<h3>2. Docbroker Translation, a solution?<\/h3>\n<p>Several years ago, a feature has been introduced in the docbroker that was initially planned to handle blocking rules on a FireWall: IP and Port Translation. I believe it was introduced for Documentum 6.5 but I might be wrong, it was a long time ago&#8230; Since the issue here for K8s is pretty similar to what would happen with a FireWall blocking the IP, we can actually use this feature to help us. Contrary to the IP Forwarding, which is done on the client side, the Translation is done on the server side which is therefore global for all clients. This has an obvious advantage that you can just do it once for all clients (or rather you will need to re-do this configuration at each start of your K8s Pod since the IP will be changed). However, it also has a drawback which is that there is no exception: all communications will be translated, even K8s internal communications&#8230; So this might be a problem. There is a KB to describe how it works (<a href=\"https:\/\/knowledge.opentext.com\/knowledge\/cs.dll\/kcs\/kbarticle\/view\/KB7701941\" target=\"_blank\" rel=\"noopener noreferrer\">KB7701941<\/a>) and you can also look at the documentation as well. However, the documentation might not be really correct. Indeed, if you look at the <strong>CS 7.1 documentation<\/strong>, you will find this definition:<\/p>\n<pre class=\"brush: text; gutter: true; first-line: 1; highlight: [2,4]\">[TRANSLATION]\nport=inside_firewall_port=outside_firewall_port\n{,inside_firewall_port=outside_firewall_port}\nhost=inside_firewall_IP=outside_firewall_IP\n{,inside_firewall_IP=outside_firewall_IP}<\/pre>\n<p>&nbsp;<\/p>\n<p>If you look at the <strong>CS 16.4 documentation<\/strong>, you will find this definition:<\/p>\n<pre class=\"brush: text; gutter: true; first-line: 1; highlight: [2,4]\">[TRANSLATION]\nport=inside_firewall_port=outside_firewall_port\n{,inside_firewall_port=outside_firewall_port}\nhost=outside_firewall_IP=inside_firewall_IP\n{,outside_firewall_IP=inside_firewall_IP}<\/pre>\n<p>&nbsp;<\/p>\n<p>Finally, if you look at the <strong>CS 16.7 documentation<\/strong>, you will find yet another definition:<\/p>\n<pre class=\"brush: text; gutter: true; first-line: 1; highlight: [1,3]\">[TRANSLATION]port=[\"]outside_firewall_port=inside_firewall_port\n{,outside_firewall_port=inside_firewall_port}[\"]\nhost=[\"]outside_firewall_ip=inside_firewall_ip\n{,outside_firewall_ip=inside_firewall_ip}[\"]<\/pre>\n<p>&nbsp;<\/p>\n<p>Three documentations on the same feature, three different definitions :D. In addition to that, there is an example in the documentation which is also wrong, on the three documentations. The real definition is the last one, after fixing the formatting errors that is&#8230; So in short, this is what you can do with the docbroker translation:<\/p>\n<pre class=\"brush: text; gutter: true; first-line: 1; highlight: [2,3]\">[TRANSLATION]\nport=[\"]ext_port_1=int_port_1{,ext_port_2=int_port_2}{,ext_port_3=int_port_3}{,...}[\"]\nhost=[\"]ext_ip_1=int_ip_1{,ext_ip_2=int_ip_2}{,ext_ip_3=int_ip_3}{,...}[\"]<\/pre>\n<p>&nbsp;<\/p>\n<p>From what I could see, the double quotes aren&#8217;t mandatory but you can use them if you want to&#8230;<\/p>\n<p>Let&#8217;s test all that after removing the IP Forwarding, obviously:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,25,35,43]\">[dmadmin@vm ~]$ dmqdocbroker -t k8s-cs-dbi-ns01.domain.com -p 1489 -c getdocbasemap\ndmqdocbroker: A DocBroker Query Tool\ndmqdocbroker: Documentum Client Library Version: 16.4.0000.0185\nUsing specified port: 1489\n**************************************************\n**     D O C B R O K E R    I N F O             **\n**************************************************\nDocbroker host            : cs-0\nDocbroker port            : 1490\nDocbroker network address : INET_ADDR: 01 2d3 01010164 cs-0 1.1.1.100\nDocbroker version         : 16.4.0170.0234  Linux64\n**************************************************\n**     D O C B A S E   I N F O                  **\n**************************************************\n--------------------------------------------\nDocbase name        : gr_repo\nDocbase id          : 1234567\nDocbase description : dbi-ns01 dev k8s gr\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       : Global Registry\nDocbase Dormancy Status     :\n--------------------------------------------\nDocbase name        : REPO1\nDocbase id          : 1234568\nDocbase description : dbi-ns01 dev k8s repo1\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       :\nDocbase Dormancy Status     :\n--------------------------------------------\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ echo \"quit\" | iapi REPO1 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO1\n^C[dmadmin@vm ~]$\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>On the docbroker side (k8s), let&#8217;s configure the translation properly and restart for the new configuration to be applied:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [11,12,13,22,30,33,34,35,36]\">[dmadmin@cs-0 ~]$ cd $DOCUMENTUM\/dba\n[dmadmin@cs-0 dba]$ cat Docbroker.ini\n[DOCBROKER_CONFIGURATION]\nsecure_connect_mode=dual\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ external_ip=2.2.2.200\n[dmadmin@cs-0 dba]$ external_port=1489\n[dmadmin@cs-0 dba]$ internal_ip=1.1.1.100\n[dmadmin@cs-0 dba]$ internal_port=1489\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ echo \"[TRANSLATION]\" &gt;&gt; Docbroker.ini\n[dmadmin@cs-0 dba]$ echo \"port=${external_port}=${internal_port}\" &gt;&gt; Docbroker.ini\n[dmadmin@cs-0 dba]$ echo \"host=${external_ip}=${internal_ip}\" &gt;&gt; Docbroker.ini\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ cat Docbroker.ini\n[DOCBROKER_CONFIGURATION]\nsecure_connect_mode=dual\n[TRANSLATION]\nport=1489=1489\nhost=2.2.2.200=1.1.1.100\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ .\/dm_stop_Docbroker; sleep 1; .\/dm_launch_Docbroker\n.\/dmshutdown 16.4.0000.0248  Linux64 Copyright (c) 2018. OpenText Corporation.\nShutdown request was processed by Docbroker on host cs-0 (INET_ADDR: 01 2d3 01010164 cs-0 1.1.1.100)\nReply status indicates a success: OK\nstarting connection broker on current host: [cs-0.cs.dbi-ns01.svc.cluster.local]\nwith connection broker log: [$DOCUMENTUM\/dba\/log\/docbroker.cs-0.cs.dbi-ns01.svc.cluster.local.1489.log]\nconnection broker pid: 18219\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ head -7 log\/docbroker.cs-0.cs.dbi-ns01.svc.cluster.local.1489.log\nOpenText Documentum Connection Broker (version 16.4.0170.0234  Linux64)\nCopyright (c) 2018. OpenText Corporation\nHOST TRANSLATION TABLE:\n    [1] From(1.1.1.100), to(2.2.2.200)\nPORT TRANSLATION TABLE:\n    [1] From(1489), to(1489)\n2019-12-15T10:25:22.307379 [DM_DOCBROKER_I_START]info:  \"Docbroker has started.  Process id: 18219\"\n[dmadmin@cs-0 dba]$<\/pre>\n<p>&nbsp;<\/p>\n<p>Once that is done, back on the DFC Client side, trying to connect to the Repository:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[dmadmin@vm ~]$ dmqdocbroker -t k8s-cs-dbi-ns01.domain.com -p 1489 -c getdocbasemap\ndmqdocbroker: A DocBroker Query Tool\ndmqdocbroker: Documentum Client Library Version: 16.4.0000.0185\nUsing specified port: 1489\n**************************************************\n**     D O C B R O K E R    I N F O             **\n**************************************************\nDocbroker host            : cs-0\nDocbroker port            : 1490\nDocbroker network address : INET_ADDR: 01 2d3 01010164 cs-0 1.1.1.100\nDocbroker version         : 16.4.0170.0234  Linux64\n**************************************************\n**     D O C B A S E   I N F O                  **\n**************************************************\n--------------------------------------------\nDocbase name        : gr_repo\nDocbase id          : 1234567\nDocbase description : dbi-ns01 dev k8s gr\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       : Global Registry\nDocbase Dormancy Status     :\n--------------------------------------------\nDocbase name        : REPO1\nDocbase id          : 1234568\nDocbase description : dbi-ns01 dev k8s repo1\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       :\nDocbase Dormancy Status     :\n--------------------------------------------\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>As you can see above, the dmqdocbroker will still print the Internal IP (1.1.1.100), that&#8217;s fine\/normal. However the Repository connection should now work:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,11]\">[dmadmin@vm ~]$ echo \"quit\" | iapi REPO1 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO1\n[DM_SESSION_I_SESSION_START]info:  \"Session 0112d6888000175b started for user dmadmin.\"\n\nConnected to OpenText Documentum Server running Release 16.4.0170.0234  Linux64.Oracle\nSession id is s0\nAPI&gt; Bye\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>So as you can see above, using the docbroker translation mechanisms is indeed a solution to be able to connect to a Repository that is inside a K8s pod. There are drawbacks as mentioned above but at least, that&#8217;s a valid workaround.<\/p>\n<p>&nbsp;<\/p>\n<h3>3. Using different ports externally<\/h3>\n<p>Above, I have always been using the same ports internally and externally. However, in a real case, you will probably have, in the end, hundreds or even thousands of CS pods. So how do you manage that? Well you saw above that the docbroker translation can be used to translate an external port into an internal port but it&#8217;s not just for the docbroker port! You can actually use that for the Repository ports as well.<\/p>\n<p>Let&#8217;s say for this example that I have a second namespace (dbi-ns02) with the following:<\/p>\n<ul>\n<li>DFC Client Host: <strong>vm<\/strong><\/li>\n<li>K8s pod short name (hostname): <strong>cs-0<\/strong><\/li>\n<li>K8s pod full name (headless service \/ full hostname): <strong>cs-0.cs.dbi-ns02.svc.cluster.local<\/strong><\/li>\n<li>K8s pod IP: <strong>1.1.1.200<\/strong><\/li>\n<li>K8s pod docbroker port: <strong>1489<\/strong>\/<strong>1490<\/strong><\/li>\n<li>K8s pod Repositories port: <strong>gr_repo<\/strong>=<strong>49400<\/strong>\/<strong>49401<\/strong> \u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 <strong>REPO2<\/strong>=<strong>49402<\/strong>\/<strong>49403<\/strong><\/li>\n<li>K8s external hostname\/lb: <strong>k8s-cs-dbi-ns02.domain.com<\/strong><\/li>\n<li>K8s external IP: <strong>2.2.2.200<\/strong><\/li>\n<li>K8s external docbroker port: <strong>1491<\/strong>\/<strong>1492<\/strong><\/li>\n<li>K8s external Repositories port: <strong>gr_repo<\/strong>=<strong>49404<\/strong>\/<strong>49405<\/strong>\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 <strong>REPO2<\/strong>=<strong>49406<\/strong>\/<strong>49407<\/strong><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>The external IP is still the same because it&#8217;s the same K8s Cluster but the external ports are now different. The internal IP is also different because it&#8217;s another namespace. So with the default docbroker configuration (no translation), then we have the same issue, obviously, where the iAPI session will hang and never respond because of the IP that doesn&#8217;t exist.<\/p>\n<p>So if we try to setup the basic docbroker translation just like what we did above, then on the K8s pod, we will have the following:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [10]\">[dmadmin@cs-0 ~]$ cd $DOCUMENTUM\/dba\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ ifconfig | grep inet | grep -v 127.0.0.1\n        inet 1.1.1.200  netmask 255.255.255.255  broadcast 0.0.0.0\n[dmadmin@cs-0 dba]$\n[dmadmin@cs-0 dba]$ cat Docbroker.ini\n[DOCBROKER_CONFIGURATION]\nsecure_connect_mode=dual\n[TRANSLATION]\nport=1491=1489\nhost=2.2.2.200=1.1.1.200\n[dmadmin@cs-0 dba]$<\/pre>\n<p>&nbsp;<\/p>\n<p>With this configuration, if you are trying to connect from an external DFC Client, then it will be able to talk to the docbroker (assuming you have all the K8s stuff in place for redirecting the ports properly) but won&#8217;t be able to talk to the Repository:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,25,35,43,45]\">[dmadmin@vm ~]$ dmqdocbroker -t k8s-cs-dbi-ns02.domain.com -p 1491 -c getdocbasemap\ndmqdocbroker: A DocBroker Query Tool\ndmqdocbroker: Documentum Client Library Version: 16.4.0000.0185\nUsing specified port: 1491\n**************************************************\n**     D O C B R O K E R    I N F O             **\n**************************************************\nDocbroker host            : cs-0\nDocbroker port            : 1490\nDocbroker network address : INET_ADDR: 02 3d4 02020286 cs-0 1.1.1.200\nDocbroker version         : 16.4.0170.0234  Linux64\n**************************************************\n**     D O C B A S E   I N F O                  **\n**************************************************\n--------------------------------------------\nDocbase name        : gr_repo\nDocbase id          : 1234569\nDocbase description : dbi-ns02 dev k8s gr\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       : Global Registry\nDocbase Dormancy Status     :\n--------------------------------------------\nDocbase name        : REPO2\nDocbase id          : 1234570\nDocbase description : dbi-ns02 dev k8s repo2\nGovern docbase      :\nFederation name     :\nServer version      : 16.4.0170.0234  Linux64.Oracle\nDocbase Roles       :\nDocbase Dormancy Status     :\n--------------------------------------------\n[dmadmin@vm ~]$\n[dmadmin@vm ~]$ echo \"quit\" | iapi REPO2 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO2\n:Wrong docbase id: (1234570) expecting: (1234568)\n\nCould not connect\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>The reason for that is that I have been talking to the docbroker on the external port 1491, which is therefore the docbroker 1489 of the second namespace (&#8220;<strong>dbi-ns02<\/strong>&#8220;). This docbroker replied to the DFC Client that the Repository is using the port 49402\/49403, which is true but only internally&#8230; Therefore, my DFC Client has been trying to connect to the Repository REPO2 (from the second namespace) using the port which is actually the one used by the REPO1 (from the first namespace) and therefore there is a mismatch in the Repository ID.<\/p>\n<p>For that purpose, you can update the docbroker translation to include the Repositories ports as well:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [5]\">[dmadmin@cs-0 dba]$ cat Docbroker.ini\n[DOCBROKER_CONFIGURATION]\nsecure_connect_mode=dual\n[TRANSLATION]\nport=1491=1489,49404=49400,49405=49401,49406=49402,49407=49403\nhost=2.2.2.200=1.1.1.200\n[dmadmin@cs-0 dba]$<\/pre>\n<p>&nbsp;<\/p>\n<p>With this new docbroker translation configuration, the external DFC Client should be able to communicate properly with the repository:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,11]\">[dmadmin@vm ~]$ echo \"quit\" | iapi REPO2 -Udmadmin -P${dm_pw}\n\n        OpenText Documentum iapi - Interactive API interface\n        Copyright (c) 2018. OpenText Corporation\n        All rights reserved.\n        Client Library Release 16.4.0000.0185\n\nConnecting to Server using docbase REPO2\n[DM_SESSION_I_SESSION_START]info:  \"Session 0112d68a80001403 started for user dmadmin.\"\n\nConnected to OpenText Documentum Server running Release 16.4.0170.0234  Linux64.Oracle\nSession id is s0\nAPI&gt; Bye\n[dmadmin@vm ~]$<\/pre>\n<p>&nbsp;<\/p>\n<p>Alternatively to all that, you might want to take a look at Traefik or Istio which might also help you to configure the correct communications from the outside of K8s to the inside. I had a case opened with the OpenText Support so that they could correct the documentation for all versions.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How can you connect an external DFC Client to docbrokers and Repositories hosted on Kubernetes Pods? That seems to be a very simple question yet it might prove difficult&#8230; Let&#8217;s talk about this challenge in this blog and possible solutions\/workarounds. As you all know, Kubernetes is using containers so just like for a basic Docker [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197,525,1522],"tags":[567,1175,1176,129,1365],"type_dbi":[],"class_list":["post-13213","post","type-post","status-publish","format-standard","hentry","category-application-integration-middleware","category-enterprise-content-management","category-kubernetes","tag-dfc","tag-dmqdocbroker","tag-docbroker","tag-documentum","tag-k8s"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client\" \/>\n<meta property=\"og:description\" content=\"How can you connect an external DFC Client to docbrokers and Repositories hosted on Kubernetes Pods? That seems to be a very simple question yet it might prove difficult&#8230; Let&#8217;s talk about this challenge in this blog and possible solutions\/workarounds. As you all know, Kubernetes is using containers so just like for a basic Docker [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-04T07:00:52+00:00\" \/>\n<meta name=\"author\" content=\"Morgan Patou\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MorganPatou\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Morgan Patou\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\"},\"author\":{\"name\":\"Morgan Patou\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"headline\":\"Documentum &#8211; Connection to docbrokers and Repositories inside K8s from an external DFC Client\",\"datePublished\":\"2020-01-04T07:00:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\"},\"wordCount\":1855,\"commentCount\":0,\"keywords\":[\"dfc\",\"dmqdocbroker\",\"docbroker\",\"Documentum\",\"k8s\"],\"articleSection\":[\"Application integration &amp; Middleware\",\"Enterprise content management\",\"Kubernetes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\",\"name\":\"Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2020-01-04T07:00:52+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentum &#8211; Connection to docbrokers and Repositories inside K8s from an external DFC Client\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8\",\"name\":\"Morgan Patou\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"caption\":\"Morgan Patou\"},\"description\":\"Morgan Patou has over 12 years of experience in Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\/Banking, and the Pharmaceutical industry.\",\"sameAs\":[\"https:\/\/blog.dbi-services.com\/author\/morgan-patou\/\",\"https:\/\/x.com\/MorganPatou\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/","og_locale":"en_US","og_type":"article","og_title":"Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client","og_description":"How can you connect an external DFC Client to docbrokers and Repositories hosted on Kubernetes Pods? That seems to be a very simple question yet it might prove difficult&#8230; Let&#8217;s talk about this challenge in this blog and possible solutions\/workarounds. As you all know, Kubernetes is using containers so just like for a basic Docker [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/","og_site_name":"dbi Blog","article_published_time":"2020-01-04T07:00:52+00:00","author":"Morgan Patou","twitter_card":"summary_large_image","twitter_creator":"@MorganPatou","twitter_misc":{"Written by":"Morgan Patou","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/"},"author":{"name":"Morgan Patou","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"headline":"Documentum &#8211; Connection to docbrokers and Repositories inside K8s from an external DFC Client","datePublished":"2020-01-04T07:00:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/"},"wordCount":1855,"commentCount":0,"keywords":["dfc","dmqdocbroker","docbroker","Documentum","k8s"],"articleSection":["Application integration &amp; Middleware","Enterprise content management","Kubernetes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/","url":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/","name":"Documentum - Connection to docbrokers and Repositories inside K8s from an external DFC Client - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-01-04T07:00:52+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/documentum-connection-to-docbrokers-and-repositories-inside-k8s-from-an-external-dfc-client\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Documentum &#8211; Connection to docbrokers and Repositories inside K8s from an external DFC Client"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8","name":"Morgan Patou","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","caption":"Morgan Patou"},"description":"Morgan Patou has over 12 years of experience in Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\/Banking, and the Pharmaceutical industry.","sameAs":["https:\/\/blog.dbi-services.com\/author\/morgan-patou\/","https:\/\/x.com\/MorganPatou"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=13213"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13213\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13213"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}