{"id":4556,"date":"2021-12-17T00:48:59","date_gmt":"2021-12-17T00:48:59","guid":{"rendered":"https:\/\/dalelane.co.uk\/blog\/?p=4556"},"modified":"2021-12-17T01:23:47","modified_gmt":"2021-12-17T01:23:47","slug":"event-endpoint-management-demo-in-a-box","status":"publish","type":"post","link":"https:\/\/dalelane.co.uk\/blog\/?p=4556","title":{"rendered":"Event Endpoint Management &#8220;demo in a box&#8221;"},"content":{"rendered":"<p><strong>In this post, I&#8217;ll share how you can get your own Event Endpoint Management demo instance with just seven minutes of work.<\/strong><\/p>\n<p><em>(Seven minutes of hands-on-keyboard time&#8230; there is a lot of waiting-for-stuff-to-run time, but it doesn&#8217;t sound so impressive if I include waiting time!)<\/em><\/p>\n<p><a href=\"https:\/\/raw.githubusercontent.com\/dalelane\/event-endpoint-management-demo\/docs\/docs\/simplified-architecture.png\"><img decoding=\"async\" style=\"border: thin black solid; width: 100%; max-width: 1000px;\" src=\"https:\/\/raw.githubusercontent.com\/dalelane\/event-endpoint-management-demo\/docs\/docs\/simplified-architecture.png\"\/><\/a><br \/>\n<!--more--><\/p>\n<h3>Why should you use this?<\/h3>\n<p>The best way to learn about something new is to get hands-on and play with it.<\/p>\n<p>With something like <a href=\"https:\/\/dalelane.co.uk\/blog\/?s=event+endpoint+management\">Event Endpoint Management<\/a>, to start kicking the tyres you need something to put in it. It starts getting interesting to play with once you have a few streams of events to publish and manage with it. You can really start to see the developer experience that it enables once you have a developer portal populated with a variety of real event sources.<\/p>\n<p>But setting all of that up (creating a Kafka cluster, creating a bunch of Kafka topics, starting applications to produce messages to those topics, writing documentation describing the schemas of those messages, creating Kafka credentials and configuring the gateway with them, etc.) takes a little effort.<\/p>\n<p>The idea of giving you this &#8220;<strong>demo in a box<\/strong>&#8221; is to do all of that for you, so you can dive straight in to playing with it &#8211; with hardly any up-front effort.<\/p>\n<h3>What do you get?<\/h3>\n<p>Before I jump into showing you how to set it up for yourself, let me show you what you&#8217;ll get.<\/p>\n<ul>\n<li>A variety of event sources discoverable through a <strong>Developer Portal<\/strong>.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-developer-portal-product.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-developer-portal-product.png\"\/><\/a> <a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-developer-portal-api.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-developer-portal-api.png\"\/><\/a><\/p>\n<ul>\n<li>Kafka topics documented in <a href=\"https:\/\/dalelane.co.uk\/blog\/?s=asyncapi\">AsyncAPI<\/a> and published in an <strong>API Manager<\/strong>.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-api-manager-apis.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-api-manager-apis.png\"\/><\/a> <a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-api-manager-api.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-api-manager-api.png\"\/><\/a><\/p>\n<ul>\n<li>Underlying topics for each of these event sources as a Kafka topic in your own instance of <strong>Event Streams<\/strong>, managing a range of Connectors to create the streams of events.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-eventstreams-topics.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-eventstreams-topics.png\"\/><\/a> <a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-eventstreams-topic.png\"><img decoding=\"async\" style=\"border: 0; max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-eventstreams-topic.png\"\/><\/a><\/p>\n<p>Under the covers, the demo script:<\/p>\n<ul>\n<li>adds the IBM catalog to your OpenShift cluster<\/li>\n<li>configures Cloud Pak Foundational Services<\/li>\n<li>installs Event Streams &#8211; and creates a Kafka cluster<\/li>\n<li>sets up a Kafka Connect cluster<\/li>\n<li>starts up a variety of Connectors, publishing to Kafka topics<\/li>\n<li>installs Event Endpoint Management<\/li>\n<li>sets up a catalog and developer portal<\/li>\n<li>generates AsyncAPI documentation for all of the topics<\/li>\n<li>sets up credentials for the Event Gateway<\/li>\n<li>publishes the topics to Event Endpoint Management<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/simplified-architecture-2.png\"><img decoding=\"async\" style=\"max-width: 1000px; width: 100%; border: thin black solid;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/simplified-architecture-2.png\"\/><\/a><\/p>\n<h3>Okay, you&#8217;re sold! How can you get this for yourself?<\/h3>\n<p>I&#8217;ll go through what you need to do step by step. For each step, I&#8217;ve recorded a video of me doing it.<\/p>\n<p><em>They are very boring videos &#8211; there isn&#8217;t any audio, so you&#8217;re spared any more of my voice for these bits. And I didn&#8217;t want to speed them up, so you can see exactly how long it takes!&nbsp;<\/em><\/p>\n<p>I haven&#8217;t included time to get the pre-requisites that I&#8217;m hoping you&#8217;ll already have:<\/p>\n<ul>\n<li>command line tools: <code>oc<\/code>, <code>git<\/code>, <code>make<\/code><\/li>\n<li>a Github account<\/li>\n<li>an IBM id account<\/li>\n<li>a Twitter account<\/li>\n<\/ul>\n<p>If you need to go get any of those, then this will take you a little longer than seven minutes, sorry! Hopefully not much longer though.<\/p>\n<p><em>By the way &#8211; I know you&#8217;ll see a bunch of my passwords and API keys in the videos, but don&#8217;t worry on my behalf &#8211; the cluster I used for the demo has been deleted, and I&#8217;ve revoked all the credentials that you&#8217;ll see.<\/em><\/p>\n<hr \/>\n<h4>Step 0 &#8211; get the code<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">time:&nbsp;<\/td>\n<td>&nbsp;20 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td><code>git<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Clone the demo setup code from<br \/>\n<a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\">github.com\/dalelane\/event-endpoint-management-demo<\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/5YPYKQHmc60\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/5YPYKQHmc60\">video recording at youtu.be\/5YPYKQHmc60<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 1 &#8211; get an API key for stock price events<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">time:&nbsp;<\/td>\n<td>50 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td><em>none<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>You need a free API key for the streams of events the demo will set up with stock price changes.<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/7ojNmattrSM?t=0\"> 0s<\/a> &nbsp; Find the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/template-alphavantage-apikey.yaml\"><\/a>template-alphavantage-apikey.yaml<\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/7ojNmattrSM?t=5\"> 5s<\/a> &nbsp; Rename it to <code>alphavantage-apikey.yaml<\/code><\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/7ojNmattrSM?t=15\"> 15s<\/a> Go to <a href=\"https:\/\/www.alphavantage.co\">alphavantage<\/a> and get a free API key<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/7ojNmattrSM?t=37\"> 37s<\/a> Update your <code>alphavantage-apikey.yaml<\/code> file to replace the <code>apikey<\/code> value with your API key<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/7ojNmattrSM\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/7ojNmattrSM\">video recording at youtu.be\/7ojNmattrSM<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 2 &#8211; get an access token for github<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">time:&nbsp;<\/td>\n<td>60 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td>a Github account<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The demo setup automation will grab some resources from the event-endpoint-management-demo on Github, so you need to give it an access token it can use to do that.<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=0\"> 0s<\/a> &nbsp; Find the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/template-github-credentials.yaml\">template-github-credentials.yaml<\/a><\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=5\"> 5s<\/a> &nbsp; Rename it to <code>github-credentials.yaml<\/code><\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=10\"> 10s<\/a> Replace the username value with your Github username<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=20\"> 20s<\/a> Go to <a href=\"https:\/\/github.com\">github.com<\/a> and create a Personal Access Token (in <strong>Settings<\/strong> -&gt; <strong>Developer settings<\/strong>)<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=35\"> 35s<\/a> Give it a name and an expiration &#8211; but don&#8217;t add any additional scopes<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/zX9YCklRtIg?t=50\"> 50s<\/a> Update the <code>github-credentials.yaml<\/code> file to replace the <code>password<\/code> value with your access token<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/zX9YCklRtIg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/zX9YCklRtIg\">video recording at youtu.be\/zX9YCklRtIg<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 3 &#8211; get an entitlement key for IBM images<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">time:&nbsp;<\/td>\n<td>60 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td><code>base64<\/code>, an IBM account<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Installing the IBM software used in the demo requires credentials for pulling the docker images from Entitled Registry, so you need to give it an entitlement key it can use to do that.<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=0\"> 0s<\/a> &nbsp; Find the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/template-ibm-entitlement-key.yaml\">template-ibm-entitlement-key.yaml<\/a><\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=5\"> 5s<\/a> &nbsp; Rename it to <code>ibm-entitlement-key.yaml<\/code><\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=15\"> 15s<\/a> Go to <a href=\"https:\/\/myibm.ibm.com\/products-services\/containerlibrary\">My IBM<\/a> and copy your Entitlement key<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=22\"> 22s<\/a> Paste your entitlement key into the empty password section in the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/template-dockerconfig.json\">template-dockerconfig.json<\/a><\/code><\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=35\"> 35s<\/a> base64-encode the contents of the <code>template-dockerconfig.json<\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/s3AofVrMBX0?t=43\"> 43s<\/a> Update the <code>ibm-entitlement-key.yaml<\/code> file to replace the <code>.dockerconfigjson<\/code> value with your base64-encoded docker config json<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/s3AofVrMBX0\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/s3AofVrMBX0\">video recording at youtu.be\/s3AofVrMBX0<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 4 &#8211; get a twitter API key<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">time:&nbsp;<\/td>\n<td>80 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td>a Twitter account<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>You need a free API key for the streams of events the demo will set up with messages from Twitter.<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=0\"> 0s<\/a> &nbsp; Find the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/template-twitter-apikey.yaml\">template-twitter-apikey.yaml<\/a><\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=3\"> 3s<\/a> &nbsp; Rename it to <code>twitter-apikey.yaml<\/code> file<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=12\"> 12s<\/a> Go to <a href=\"https:\/\/developer.twitter.com\/\">developer.twitter.com<\/a> and navigate to the <strong>Developer Portal<\/strong><\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=18\"> 18s<\/a> Go to your <strong>Standalone Apps<\/strong> on your <strong>Projects &amp; Apps<\/strong> page<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=23\"> 23s<\/a> Create a new standalone app<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=33\"> 33s<\/a> Update the <code>twitter-apikey.yaml<\/code> file to replace the <code>consumerKey<\/code> value with your API Key<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=41\"> 41s<\/a> Update the <code>twitter-apikey.yaml<\/code> file to replace the <code>consumerKeySecret<\/code> value with your API Key Secret<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=50\"> 50s<\/a> Generate an Access Token and Secret (from <strong>App settings<\/strong> -&gt; <strong>Keys and tokens<\/strong> -&gt; <strong>Access Token and Secret<\/strong> -&gt; <strong>Generate<\/strong>)<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=60\"> 60s<\/a> Update the <code>twitter-apikey.yaml<\/code> file to replace the <code>accessToken<\/code> value with your Access Token<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/p4iLElvQCf8?t=67\"> 67s<\/a> Update the <code>twitter-apikey.yaml<\/code> file to replace the <code>accessTokenSecret<\/code> value with your Access Token Secret<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/p4iLElvQCf8\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/p4iLElvQCf8\">video recording at youtu.be\/p4iLElvQCf8<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 5 &#8211; get an OpenShift cluster<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">(hands-on-keyboard) time:&nbsp;<\/td>\n<td>90 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td>somewhere to create an OpenShift cluster!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>You need somewhere to run the demo!<\/p>\n<p>I used <a href=\"https:\/\/techzone.ibm.com\">TechZone<\/a> to reserve a demo cluster on the managed Red Hat OpenShift service on IBM Cloud (ROKS).<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/pol7hXxC2is?t=0\"> 0s<\/a> &nbsp; Go to your OpenShift provider<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/pol7hXxC2is?t=68\"> 68s<\/a> Make sure you have enough space on your worker nodes for all the demo components<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/pol7hXxC2is\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/pol7hXxC2is\">video recording at youtu.be\/pol7hXxC2is<\/a><\/small><\/p>\n<p>When everything is up and running, this is how full my cluster was:<\/p>\n<p><img decoding=\"async\" style=\"border: thin black solid; max-width: 400px;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/deployment-overview.png\"\/><\/p>\n<p>You can tell I was a bit over-generous with the size of the cluster I reserved!<\/p>\n<p><em>You probably won&#8217;t get a cluster instantly, so now is a good time to go get yourself a coffee!<\/em><\/p>\n<hr \/>\n<h4>Optional step &#8211; choose the storage classes to use<\/h4>\n<p>I&#8217;ve chosen storage classes to use assuming that you&#8217;ll run this on ROKS as well. But if you&#8217;re running OpenShift somewhere else, you&#8217;ll likely want to choose your own storage class names.<\/p>\n<p>To choose the storage classes used by the Cloud Pak for Integration components installed, edit the <code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/cp4i-overrides.yaml\">cp4i-overrides.yaml<\/a><\/code> file before you start the demo deployment.<\/p>\n<pre style=\"max-height: 400px; padding: 10px; overflow: scroll; border: thin black solid; font-size: smaller;\">apiVersion: v1\nkind: ConfigMap\nmetadata:\n    name: cp4i-overrides\n    namespace: pipeline-eventdrivendemo\ntype: kubernetes.io\/basic-auth\ndata:\n    ibm-common-service-operator-storageClassName: ibmc-file-gold-gid\n    ibm-integration-platform-navigator-storageClassName: ibmc-file-gold-gid\n    ibm-eventstreams-storageClassName: ibmc-file-gold-gid\n    ibm-apiconnect-storageClassName: ibmc-block-gold<\/pre>\n<p>To choose the storage classes used by the demo deployment pipelines, edit the values identified by: <code>find . -name 'pipelinerun*yaml' -print0 | sort -z | xargs -0 grep storageClassName<\/code><\/p>\n<pre style=\"max-height: 400px; padding: 10px; overflow: scroll; border: thin black solid; font-size: smaller;\">$ find . -name 'pipelinerun*yaml' -print0 | sort -z | xargs -0 grep storageClassName\n\n.\/02-install-ibm-catalog\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/03-install-ibm-common-services\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/04-install-platform-navigator\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/05-install-event-streams\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/06-start-kafka-connectors\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/07-install-event-endpoint-management\/pipelinerun-install.yaml:          storageClassName: ibmc-block-gold\n.\/07-install-event-endpoint-management\/pipelinerun-setup.yaml:          storageClassName: ibmc-block-gold\n.\/08-publish-topics-to-eem\/pipelinerun.yaml:          storageClassName: ibmc-block-gold\n.\/08-publish-topics-to-eem\/pipelinerun.yaml:          storageClassName: ibmc-block-gold<\/pre>\n<hr \/>\n<h4>Step 6 &#8211; start the demo deployment<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">(hands-on-keyboard) time:&nbsp;<\/td>\n<td>40 seconds<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">pre-requisites:&nbsp;<\/td>\n<td><code>oc<\/code>, <code>make<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>You&#8217;ve got the demo automation, you&#8217;ve collected the credentials you need, and you&#8217;ve got an OpenShift cluster.<\/p>\n<p>It&#8217;s time to start the demo deployment.<\/p>\n<ol type=\"a\">\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/l3H3Lbl7DCw?t=0\"> 0s<\/a> Navigate to the OpenShift console<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/l3H3Lbl7DCw?t=8\"> 8s<\/a> Login to the cluster using the oc CLI<\/li>\n<li><a style=\"font-size: 0.7em\" href=\"https:\/\/youtu.be\/l3H3Lbl7DCw?t=24\"> 24s<\/a> Run make all<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/l3H3Lbl7DCw\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/l3H3Lbl7DCw\">video recording at youtu.be\/l3H3Lbl7DCw<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 7 &#8211; wait patiently for the demo deployment<\/h4>\n<table cellspacing=\"5\" border=\"0\">\n<tbody>\n<tr>\n<td align=\"right\">(hands-on-keyboard) time:&nbsp;<\/td>\n<td>none!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This is going to take a while.<\/p>\n<p><em>Sorry &#8211; the demo setup script could really do with parallelising some steps! I went more with simplicity than efficiency. (<a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/pulls\">Pull requests<\/a> are welcome!)<\/em><\/p>\n<p>The deployment script only outputs which step it is up to.<\/p>\n<pre style=\"max-height: 300px; padding: 10px; overflow: scroll; border: thin black solid; font-size: smaller;\">dalelane@Dales-MBP-2 event-endpoint-management-demo % make all\n\nsubscription.operators.coreos.com\/openshift-pipelines-operator-rh created\nnamespace\/pipeline-credentials created\nsecret\/ibm-entitlement-key created\nnamespace\/pipeline-eventdrivendemo created\nNow using project \"pipeline-eventdrivendemo\" on server \"https:\/\/c102-e.eu-de.containers.cloud.ibm.com:30823\".\nsecret\/github-credentials created\nsecret\/alphavantage created\nsecret\/twitter created\nconfigmap\/cp4i-overrides created\nserviceaccount\/pipeline-deployer-serviceaccount created\ntask.tekton.dev\/copy-secret created\ntask.tekton.dev\/create-cp4i-instance created\ntask.tekton.dev\/create-namespace created\ntask.tekton.dev\/create-resource created\ntask.tekton.dev\/install-operator created\ntask.tekton.dev\/wait-for-cp4i-operand created\ntask.tekton.dev\/wait-for-operator created\ntask.tekton.dev\/wait-for-pod created\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-ibmcatalog-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-ibmcatalog-rolebinding created\npipeline.tekton.dev\/pipeline-ibmcatalog created\n------------------------------------------------------------\nInstalling the IBM Catalog into the cluster...\n------------------------------------------------------------\npipelinerun.tekton.dev\/install-ibm-catalog-jsk75\npipelinerun.tekton.dev\/install-ibm-catalog-jsk75 condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-commonservices-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-commonservices-rolebinding created\npipeline.tekton.dev\/pipeline-cp4i created\n------------------------------------------------------------\nConfiguring IBM Common Services...\n------------------------------------------------------------\npipelinerun.tekton.dev\/install-ibm-common-services-f62pw\npipelinerun.tekton.dev\/install-ibm-common-services-f62pw condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-platformnavigator-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-platformnavigator-rolebinding created\npipeline.tekton.dev\/pipeline-cp4i configured\n------------------------------------------------------------\nCreating the Cloud Pak for Integration Platform Navigator...\n------------------------------------------------------------\npipelinerun.tekton.dev\/install-platform-navigator-wdmsg\npipelinerun.tekton.dev\/install-platform-navigator-wdmsg condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-eventstreams-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-eventstreams-rolebinding created\npipeline.tekton.dev\/pipeline-cp4i configured\n------------------------------------------------------------\nCreating the Event Streams instance...\n------------------------------------------------------------\npipelinerun.tekton.dev\/install-event-streams-kt9ws\npipelinerun.tekton.dev\/install-event-streams-kt9ws condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-kafkaconnect-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-kafkaconnect-rolebinding created\ntask.tekton.dev\/create-kafka-connectors-docker-image created\ntask.tekton.dev\/create-kafka-credentials created\ntask.tekton.dev\/maven created\nconfigmap\/pipeline-maven-settings created\npipeline.tekton.dev\/pipeline-kafkaconnectors created\n------------------------------------------------------------\nBuilding and starting Kafka connectors...\n------------------------------------------------------------\npipelinerun.tekton.dev\/start-kafka-connectors-bx9pj\npipelinerun.tekton.dev\/start-kafka-connectors-bx9pj condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-eventendptmgmt-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-eventendptmgmt-rolebinding created\npipeline.tekton.dev\/pipeline-cp4i configured\n------------------------------------------------------------\nCreating the Event Endpoint Management instance...\n------------------------------------------------------------\npipelinerun.tekton.dev\/install-event-endpoint-management-tbvw4\npipelinerun.tekton.dev\/install-event-endpoint-management-tbvw4 condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-eventendptmgmt-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-eventendptmgmt-rolebinding unchanged\ntask.tekton.dev\/apic-cli-login created\ntask.tekton.dev\/get-apic-cli created\ntask.tekton.dev\/setup-apic-admin-user created\ntask.tekton.dev\/setup-apic-catalog created\ntask.tekton.dev\/setup-apic-portal-user created\ntask.tekton.dev\/setup-apic-portal created\ntask.tekton.dev\/setup-apic-provider-org created\npipeline.tekton.dev\/pipeline-event-endpoint-management created\n------------------------------------------------------------\nSetting up the Event Endpoint Management instance...\n------------------------------------------------------------\npipelinerun.tekton.dev\/setup-event-endpoint-management-zbznf\npipelinerun.tekton.dev\/setup-event-endpoint-management-zbznf condition met\nclusterrole.rbac.authorization.k8s.io\/pipeline-deployer-stockpricesasyncapi-role created\nclusterrolebinding.rbac.authorization.k8s.io\/pipeline-deployer-stockpricesasyncapi-rolebinding created\ntask.tekton.dev\/apic-cli-login configured\ntask.tekton.dev\/apic-stockprices-asyncapi-publish created\ntask.tekton.dev\/create-kafka-credentials configured\ntask.tekton.dev\/generate-asyncapi created\ntask.tekton.dev\/get-apic-cli configured\npipeline.tekton.dev\/pipeline-asyncapi created\n------------------------------------------------------------\nGenerating and publishing doc for connectors...\n------------------------------------------------------------\npipelinerun.tekton.dev\/publish-topics-to-eem-5pdjj\npipelinerun.tekton.dev\/publish-topics-to-eem-5pdjj condition met\n\nInstall complete.\n\n\nCloud Pak for Integration : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nEvent Streams             : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/integration\/kafka-clusters\/eventstreams\/es\/\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nEvent Endpoint Management : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/integration\/apis\/eventendpointmanagement\/eem\/manager\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nDeveloper Portal          : https:\/\/eem-ptl-portal-web-eventendpointmanagement.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/events-demo\/events-catalog\/\nusername                  : demouser\npassword                  : FDL53QdIMQwnEWCwRFkVlZXpysGTGX0L\n<\/pre>\n<p>If you go to the <strong>Pipelines<\/strong> page in the <strong>OpenShift console<\/strong>, you&#8217;ll also see how far it has got.<\/p>\n<p><img decoding=\"async\" style=\"max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-pipelines-1.png\"\/><\/p>\n<p>You&#8217;ll also have access to the detailed logs for each step.<\/p>\n<p><img decoding=\"async\" style=\"max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-pipelines-2.png\"\/><\/p>\n<p><em>Try to resist keep checking though.<\/em><\/p>\n<p><img decoding=\"async\" style=\"max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-pipelines-3.png\"\/><\/p>\n<p><em>You don&#8217;t need to do anything in this step!<\/em><\/p>\n<p><img decoding=\"async\" style=\"max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-pipelines-4.png\"\/><\/p>\n<p><em>It won&#8217;t go any faster if you keep watching it!<\/em><\/p>\n<p><img decoding=\"async\" style=\"max-width: 500px; width: 80%;\" src=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/raw\/docs\/docs\/screenshot-pipelines-5.png\"\/><\/p>\n<hr \/>\n<h4>Step 8 &#8211; access the demo<\/h4>\n<p>The last thing the demo deployment script does is print out the URLs and username\/password for each of the demo components.<\/p>\n<p>Make a note of them.<\/p>\n<p>If you lose them, you can generate this again by running <code>make output_details<\/code><\/p>\n<pre style=\"max-height: 300px; padding: 10px; overflow: scroll; border: thin black solid; font-size: smaller;\">dalelane@Dales-MBP-2 event-endpoint-management-demo % make output_details\nInstall complete.\n\n\nCloud Pak for Integration : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nEvent Streams             : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/integration\/kafka-clusters\/eventstreams\/es\/\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nEvent Endpoint Management : https:\/\/cpd-integration.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/integration\/apis\/eventendpointmanagement\/eem\/manager\nusername                  : admin\npassword                  : fZG9JeSO8p1CzRZPifVxS1IOBoCyojRG\n\nDeveloper Portal          : https:\/\/eem-ptl-portal-web-eventendpointmanagement.itzroks-120000f8p4-5mlabz-6ccd7f378ae819553d37d5f2ee142bd6-0000.ams03.containers.appdomain.cloud\/events-demo\/events-catalog\/\nusername                  : demouser\npassword                  : FDL53QdIMQwnEWCwRFkVlZXpysGTGX0L\n<\/pre>\n<p>If you want to get rid of all the resources associated with the deployment pipelines, you can run <code>make clean<\/code>. (<em>This doesn&#8217;t remove any of the actual demo itself, just the automation used to deploy it<\/em>)<\/p>\n<hr \/>\n<h4>Step 9 &#8211; try it out<\/h4>\n<p>Use the URLs and usernames\/passwords in the output to access some of the UIs deployed by the demo.<\/p>\n<p>The following videos give you an idea of what you can expect to see. (<em>These ones do include audio, sorry!<\/em>)<\/p>\n<p><strong>Event Streams<\/strong><\/p>\n<p>This is the UI that the owner of the Kafka cluster would use. You can see all of the topics that the demo comes with:<\/p>\n<ul>\n<li>five topics with <strong>stock price change events<\/strong> for different tech companies\n<ul>\n<li>These topics will get a new event roughly once every minute. Each message contains the stock price at that time. They&#8217;re a nice example of a topic with a lot of historical data.<\/li>\n<\/ul>\n<\/li>\n<li>a topic with events from <strong>twitter<\/strong>\n<ul>\n<li>This topic gets a new message every time someone posts a tweet mentioning the word &#8220;kafka&#8221;. Each message contains everything about that tweet &#8211; what they said, who posted it, and so on. You can try posting the word &#8220;Kafka&#8221; to twitter yourself and see new events appear on the topic.<\/li>\n<\/ul>\n<\/li>\n<li>two topics with <strong>flight events<\/strong> &#8211; one for when planes land, one for when planes take off\n<ul>\n<li>These are generated events about a fictional airport. This helps to guarantee that you&#8217;ll always get new events every few seconds (unlike the twitter topic for example, where if no-one mentions kafka you might not get any new messages for a while, or the stock price topics which won&#8217;t get any new messages when stocks aren&#8217;t traded, such as during weekends)<\/li>\n<\/ul>\n<\/li>\n<li>a topic with random values\n<ul>\n<li>Messages are posted to this topic roughly every second. Each message is a JSON payload with a random letter and a random integer.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/4rejYy8uytI\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/4rejYy8uytI\">video recording at youtu.be\/5YPYKQHmc60<\/a><\/small><\/p>\n<p><strong>Event Endpoint Management (API Manager)<\/strong><\/p>\n<p>This is the UI that someone would use to document and publish their Kafka topics.<\/p>\n<p>An &#8220;Events demo&#8221; catalog is pre-created for you, with an Event Gateway and Developer Portal set up and ready for use.<\/p>\n<p>All of the demo Event Streams topics are documented in the API catalog using <a href=\"https:\/\/community.ibm.com\/community\/user\/search?executeSearch=true&amp;SearchTerm=asyncapi\">AsyncAPI<\/a>.<\/p>\n<p>The Event Gateway is configured for use with the topics, using custom Kafka credentials and SSL certificates generated for each topic.<\/p>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/9mZBNzdyBrs\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/9mZBNzdyBrs\">video recording at youtu.be\/5YPYKQHmc60<\/a><\/small><\/p>\n<p><strong>Event Endpoint Management (Developer Portal)<\/strong><\/p>\n<p>This is the UI that someone would use to discover the Kafka topics that are available within their organisation for them to use in their applications.<\/p>\n<p>All of the demo Event Streams topics are published in the Developer Portal, with documentation describing where the data comes from and the schema of the messages.<\/p>\n<p>The Portal helps developers to use the topics they discover, with generated code for creating new applications, and configuration properties for existing applications.<\/p>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/S-r47sYM1qk\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/S-r47sYM1qk\">video recording at youtu.be\/5YPYKQHmc60<\/a><\/small><\/p>\n<hr \/>\n<h4>Step 10 &#8211; try creating a client app<\/h4>\n<p>You can try using the Developer Portal to create your own client application.<\/p>\n<p>The Developer Portal provides a self-service way to create credentials for your application. You just need to log on first, using the credentials in the demo setup output.<\/p>\n<p>There are some <a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/tree\/master\/99-test-gateway\">resources with the demo<\/a> to help you do this. This is particularly useful if you&#8217;ve not written a Kafka application before.<\/p>\n<ul>\n<li><code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/99-test-gateway\/01-get-jars.sh\">01-get-jars.sh<\/a><\/code><br \/>\na script that will download the jars you need to compile and run a Kafka Java application<\/li>\n<li><code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/99-test-gateway\/02-download-truststore.sh\">02-download-truststore.sh<\/a><\/code><br \/>\na script that will download a truststore containing the cert for the Event Gateway that <a href=\"https:\/\/community.ibm.com\/community\/user\/integration\/blogs\/dale-lane1\/2021\/11\/11\/connecting-kafka-client-applications-to-eem\">you will need for your application to connect<\/a><\/li>\n<li><code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/99-test-gateway\/SampleApplication.java\">SampleApplication.java<\/a><\/code><br \/>\nsample code from the Developer Portal updated with the truststore config you need for it to run<\/li>\n<li><code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/99-test-gateway\/03-compile-sample.sh\">03-compile-sample.sh<\/a><\/code><br \/>\na script that will compile the sample code<\/li>\n<li><code><a href=\"https:\/\/github.com\/dalelane\/event-endpoint-management-demo\/blob\/master\/99-test-gateway\/04-run-sample.sh\">04-run-sample.sh<\/a><\/code><br \/>\na script that will run the sample code<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" width=\"450\" height=\"253\" src=\"https:\/\/www.youtube.com\/embed\/Q6XkjbR4k3g\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><small><a href=\"https:\/\/youtu.be\/Q6XkjbR4k3g\">video recording at youtu.be\/5YPYKQHmc60<\/a><\/small><\/p>\n<h3>Give it a try!<\/h3>\n<p>This is a long post, but I hope this doesn&#8217;t put you off giving it a try.<\/p>\n<p>You just need to create a few credentials, and then run a single command. And I think trying out an instance of Event Endpoint Management that is populated with real live Kafka topics with real messages on them is the best way to get you thinking about how you could use it for real.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, I&#8217;ll share how you can get your own Event Endpoint Management demo instance with just seven minutes of work. (Seven minutes of hands-on-keyboard time&#8230; there is a lot of waiting-for-stuff-to-run time, but it doesn&#8217;t sound so impressive if I include waiting time!)<\/p>\n","protected":false},"author":1,"featured_media":4569,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[593,582,583,584],"class_list":["post-4556","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code","tag-apachekafka","tag-eventstreams","tag-ibmeventstreams","tag-kafka"],"_links":{"self":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4556"}],"version-history":[{"count":0,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4556\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/media\/4569"}],"wp:attachment":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}