diff --git a/.docs/api/storage-service.md b/.docs/api/storage-service.md index e962c70966a3438d1379c5809e701510168d8785..5994929a5deb8e8f87fe33265823043a3387c72e 100644 --- a/.docs/api/storage-service.md +++ b/.docs/api/storage-service.md @@ -11,6 +11,7 @@ author: Martin Weise * Ports: 8888/tcp, 9000/tcp * Prometheus: `http://<hostname>:9091/metrics` * Filer UI: `http://<hostname>:8888` + * Cluster UI: `http://<hostname>:9333` To directly access in Kubernetes (for e.g. debugging), forward the svc port to your local machine: diff --git a/.docs/concepts/index.md b/.docs/concepts/index.md index c43e820a4a021725e313e6ee3c1a249b7da391fc..168758f9958f2e0c98ea8fb7ea34e63963e2e0f3 100644 --- a/.docs/concepts/index.md +++ b/.docs/concepts/index.md @@ -22,6 +22,6 @@ technologies. The conceptualized microservices (c.f. [Fig. 1](#fig1)) operate th *findability*, *accessability*, *interoperability* and *reuseability* (FAIR). <figure id="fig1" markdown> - -<figcaption>Fig. 1: Architecture of the services deployed via Docker Compose</figcaption> + +<figcaption>Fig. 1: Architecture of the services</figcaption> </figure> \ No newline at end of file diff --git a/.docs/images/architecture-docker-compose.svg b/.docs/images/architecture-docker-compose.svg deleted file mode 100644 index 96d6fc1256d69597f18ecb86bce81ea26b88fbc7..0000000000000000000000000000000000000000 --- a/.docs/images/architecture-docker-compose.svg +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495 428.63 L 495 411 L 380 411 L 380 171 L 337.5 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.5 426.88 L 495 428.63 L 498.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 173px; margin-left: 362px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="347.5" y="167" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115 428.63 L 115 411 L 220 411 L 220 171 L 272.5 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.5 426.88 L 115 428.63 L 118.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="226.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388 137 L 388 331 L 495 331 L 495 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.5 344.88 L 495 346.63 L 498.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 296px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="436.5" y="290" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 332px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="436.5" y="326" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACKVJREFUeF7tXGeI1kwQnteOInbFrqjYe8GCig0VexesqAceKIrYe8eK7Y/YK/ZeEBv2hvUETxR7x4K968mzfLskubxvkr39SC7sgD8u2Z3dmSczOzM7r5GkpKQk0hQaDUQ0oKHBkgmiAQ0XnhrQkOGpAdWAhk0DIZNHn6Ea0JBpIGTiaAsNM6ArVqyguLg4IWLz5s3p0KFDSkUuVKgQPXv2zJFnxowZKUeOHJQzZ07KlSsXValSherVq8f+gcf/RRMmTKDp06eb2A8bNozmz58vvaRbmY0LZMmShbJnz85krVWrFjVu3Jhat25N6dKli7kPk4UGCdBYu27QoAENHz6cCRiJRKQVbZ34588fKlq0aLIPLnfu3OxZhgwZpNaSAdRuIfCZOHGiyeis41IloFyI8uXL08aNG6ly5cpSirZO2rNnD7Vv396W15YtW6hr165S66gClC/etm1b2rp1K8GLBQ7QmTNnUqlSpZJt7Pv37/T27Vt69+4dXb9+nc6dO0dv3rxJNi5Tpky0YMECGjhwoJSyjZNatWpFBw8eZI/g7rGHb9++sb+bNm1KR44ckVrDCmg0mTlzeIqPHz/SgwcPmNynTp0ia8m9U6dOtH379uABev78eapdu7ajoiDQ2bNnac6cObR///5kAk6ePJkmTZrkyCfagCdPnlCxYsXo79+/bEivXr2YUmG1ILj2+/fvszFeyQqoW5n5Onfv3mVu9uTJk6al7byG7y7Xq3CQ6MSJE9S9e3d69eqVScDNmzdTt27dvOqbjcfHMHXqVDEXQH769Il69uwpno0fP56mTZvmmX9KAcWCP3/+ZF7i9OnTYv2yZcvSrVu3TPtJlYBCgufPn1P9+vWZ1XDKli0b3blzh/LmzetJ6XBxsLynT5+yeYguX758yZSYJ08e+vHjB3tesGBBevToEaVNm9YTfxWAYsGbN29SpUqVTGvDekuWLCmepVpAIUFCQgLVqVOHvn79KgQaNGgQLVmyxJPC9+3bRwg0OA0YMICWL1/O/uzSpYvprMJYRNdeSBWgWBOBoNEq165dS7179w4HoJBixowZBFfICfkbLA1W5pbatGnDzmVOOKuQGoHwHO85AXh+rrrlrxJQ6weGmGLEiBHhAfT9+/csd0QAw2ndunUsqHFDAB/uFm4XBPcFt83zWzwvXLgwvXjxgr1HYv/48WPKnz+/G/ZsjEpA+/fvT6tWrRJroxBiPPtTtcvlUvXt25fgejj16NGDNmzY4ErhU6ZMIUTInGDxY8eONc0dPXo0zZ49WzxD2jFmzBhX/FUDinRl586dYu2FCxfSkCFDwmOhkARfLL5cTshrYWVOhBSlePHizOJACHYQ9CD4MRJ4lS5dWjwqUaIEIRhxW6VSaaHwIPfu3RN72bFjB3Xs2DFcgCJIQLDACW4RRQGnaPTAgQOmAKdly5aisGD9GBBRnzlzRjw+duwYq6+6IVWAXr16lapXry6WTJMmDb1+/ZrVuzmFwuWiooR6q5GQ1jidc+3ataO9e/eKaai8wKXZ0erVq6lfv37iFfLgTZs2ucFTyRmKFKpJkyamj8ru8iQUgMJ1wiqN5TG4SbuSIkcAgBcpUkQEQ04F+C9fvrAPBMUGEOqo4GG0jmjoptRCcSTgY4JXEJYYidClS5eoRo0apmVDASgkQk2XFwDw9+3bt03nnlXZuCJDhMhp6NChrCYci5Cfrly5UgyxBiRuAZ03b17MveHDxIcDIFHuxBXm79+/TewR2Rr3HyqXC2HTp09vEhjXXQUKFLDVMSwagc3Dhw/FexQpKlasGBNQFMpxH8upQoUKrHrjRKpvW5B3Iv+0o1BYKMCzXnp//vyZUGSwI3zxCIA41axZk7kvN1SuXDlKTEwUQ93UolUBikh77ty5pkKHdc+hAPT48eMsYOCEsw7nWzRCmL9r1y7xGldvbov6a9asMeW8SJfQGBCLZADlHRtIoerWrUstWrRgH6FTqhQKQHEDgpt8TgD36NGjtjpG0R2VH+uZ5MY67cbAC6CKlDVr1qgsUhoUedlbKADFferFixeF3Ah4xo0bZ6sHVHmivfOiOOPYZcuWxWwL0YB60KzdlRIS8KpVqybjgugRlRbjlZuHpaIOdTqDNaAetGw9D6tVq0ZXrlyx5XD48GFCMs4JRX20eTidS1ZmSPIRQaOgwenGjRvJ7ir5Ow2oS0B3795NHTp0MI1ev369qcvA+LJz586E2icnFOaNZ6/LZdkw5K2LFi0SUwYPHkyLFy+2ZaEBdaFZuFXUUj98+CBGo3/1woULthaHdhUEQ79+/WLjUQeFdaJaJENWV4+mMkTWKHBYSQPqoGFcMPfp08cEZubMmQk5obVFg7OaNWuW6cpLRRM5zs7Lly+L3eLKDld3GlAXXX9Q0rVr11iHgtFtcmtDoTxa3yyCIdR1jddO6GvF7X9KaOnSpRQfHy9YNGzYkDWwBRZQXEnhrJAlJN3WgMNLjypqs+jLxfUYFIX6rJXQzY4OhViFAeSkzZo1E1Px0wq4R9lOeM4I7h5FDN67i+d2lwKBcbmyQPJ5OK+sv8WQqZpE2wfKcOhUsN44WMfDcrdt2yYeuynEu5UdrS7G7ohRo0YR3LuRNKAO2kSXAQrU8ABOVoYLYCgUqQYnBDQorKsgeI5GjRoJVvny5WNNasYPWQP6n3rgrlFSw51jmTJlCDkmWihRGXKbO6KYPXLkSKFwRMLGqlJKQbU7n9HzY0ynfAM0pcLp+f5rQP/g138MlO5AA6pUnf4z04D6j4HSHWhAlarTf2YaUP8xULoDDahSdfrPTAPqPwZKd6ABVapO/5lpQP3HQOkONKBK1ek/Mw2o/xgo3YG6/4ZL6bY0M1kNaEBlNRfQeRrQgAIjuy0NqKzmAjpPAxpQYGS3pQGV1VxA52lAAwqM7LY0oLKaC+g8DWhAgZHdlgZUVnMBnacBDSgwstv6B7Iqwbui8BEvAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 412px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="406" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115 481.37 L 115 500 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 476.12 L 118.5 483.12 L 115 481.37 L 111.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.16 516.81 L 114.63 518.63 L 118.16 516.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 374px; margin-left: 211px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="196.5" y="368" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115 346.63 L 115 331 L 210 331 L 210 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.5 344.88 L 115 346.63 L 118.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 332px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="174" y="319.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.5 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.5 421 L 147.5 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 144 426.88 L 147.5 428.63 L 151 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 422px; margin-left: 246px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="231.5" y="416" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 466px; margin-left: 401px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="386.5" y="460" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAABECAYAAAC2wE+iAAAAAXNSR0IArs4c6QAADedJREFUeF7tnQXMLUkRhc/i7hoIbou7w+Lu7u4QNCSwwCKBxXXR4O5O0MUdFofF3d1d50u6d4vee+9035n5/7n3P5W8vLx32+b0zOnq6qrqfWQxAkbACBiBWSCwzyxG4UEYASNgBIyATMh+CYyAETACM0HAhDyTifAwjIARMAImZL8DRsAIGIGZIGBCnslEeBhGwAgYAROy3wEjYASMwEwQMCHPZCI8DCNgBIyACdnvgBEwAkZgJgiYkGcyER7GERC4h6SDwv9+RtIFtxSnD0jaLzzbAyU9ZsGzHkXSP4v/v5CkQ7YUlz33WCbkPTflG/PAJuQjTpUJeWNe3/UGakJeDzfXmh4BE7IJefq3bGY9mJBnNiFbPBzetQdLOrKk30l6Ss+zmpBNyFv8OSx+NBPynpvyXXvgs0v6Sur9+5JOZ0I+DAHbkHfttZxXxybkec3HNo/m9pKeZ0JeOMUm5G1+8xuezYTcAJaLDkLg+ZJuZ0I2IQ96i7a8sgl5yyd4Ro93qKR9Tcgm5Bm9k7Mbigl5dlOylQM6gaTfSIele7UN+f+n2SaLrXzt2x/KhNyO2U7XOIek60i6SNIwTyzpuJL+kbwVILdPS3qrpPdK+m/lAF8k6dahLCaFO1TWpdizJd05lH+xpNuEf19B0nsa2ntq9zz3DuVLL4tPSrpo+J1DQUwgl5d0ls5rA9L/m6Rfd3h9viv7TkkvkfSXhjGMVfTSkm4kib9Pmcb25w7v70r6WDfeV0j6aOhsCCETLEPQDHLCNKdXkXROSSeR9B9JP5f07S6w5m2SXiXpZ2M9qNsZFwET8rh4jtkaXglP7j7gKzU0+lVJHJ59vKLOphHyhxPBHakjmQO6BWl/SUftec5fSLpJFwX3/go8xigC+bJQXauisbdLuq0kxsj4LhPqtETqnV/S59JiyKJ2vJ6+/9hF+z2oiIKsGK6L7AQCJuSdQLm9DzSc10o6TntV/VvSzSS9pqfuphHywZ1WecXOXa4cdx9EhBpfLGiRfeXX/f2kSes9c0MD35B08W7n8+qk6eeqLYR8bkmXq/DrLod1YCLmhuG66NQImJCnRri9/TMl8oiaDmaId6U/35L0J0nHlHRaSVftchlcQxKaY5a/dyaMCwS/30WjmJqQjybpRKnjayfNMY/jR5LIwRCFLT3aW5bSZPEWSR+R9LhUgDZYdDBP/L7T+DDlQE43TmaC2DYaJJrklPLBpMHHPr7ZjeU53RxhbsGGjkkBUwJjvGwqiBkBTf/KoWILId88mWYIuPlXR/DvTqaiHyfz1eklXTctSuXz30DS66cExW23IWBCbsNrJ0pjX7xpQa7X7LHH8nHzYR8r1HtT+hCXjXlqQo79YjZ4ZfiPdQ71MMOcr0u6c4xu5/AESQ9JNuPy+Y4v6Y2B8PLvF0629inmEGJjRxMFrReTxF+XdAgpY+Nm4fptIutctIWQsUtDupireG++sKQ/xvLcFCmZi7C4YxorExZNgZHbrEDAhFwB0g4W4bAOTYokMlkeneylfcO4f9AeKYu2hIYatc7YxqYRch77o1II9io8TtOZbTAHHD0UekC3q3hsH4hr/s6hasxE97W0eHDIuEpisEws10LI1OOQjh0Hu4ZVgu34kUWB66UFbM1Hd7UxETAhj4nm8LbQVsjxcLL0h1NyPrRlWk/skTqcpkfBFo2pY5FsIiF/MZkesJP3yTsk8fxZ8C6IO4+++rW/Yzb6XlEY748XVjTA9/dZSectyrYS8l2SaaSvS3ZQP0jmnVz2ZZ0Hxi37Kvr3nUHAhLwzOK/bC/NT68ZGHz8p7KeriGETCZltN+OuEWzN7Bqy4MnA4dfYctdu8XxmaBQ3MxZSzBA1gqsf3jRRWggZ2zv2c84NaqScdxbxU9RUdJnpETAhT4/xTvbw5c6Wid9ylvt1blBPWjKATSTkkyc3sRpMeXZszVnQRDnoHFsgY0g5C1r8eRo6OWvnmoeJY11C5rCTQ9NawVe81N4hdExlll1GwIS8yxMwcvd4HEQyQEOMpBS72zRCRvs/VQNed5P0jFCeTHN4OIwtZVAHXgsc8tUK3hEEr3C4l6VFQ354V+lhtZ11h8OXSN4qscoli0CVhuZcdEwETMhjojl+W3gM4GGByxZkgobIwR/+ydHNLfdMtBofeJZtImS0/3M1QIxd9Vk7QMh4Kpwx9MOOBO28RXCPw91xHUK+haSXN3R26i546IdF+et3LoNvaGjDRSdCwIQ8EbADm+WAjjvVOITCzWtd2SZCbr1Tr5aQOeyDpGoELwZc+KJgg2W+srRqrNTDnIJL3zqEjP8yvse1wiLPBQFRCKHHBc+yywiYkHd5AhZ0j52TDywHVQwZoQn5cPSWmSxKDXcV3uSDiJosZTlUi/7f67jXERaO2WAdQr7UAhPEqmcgCIU8KFHuXhxMDnnnXHcAAibkAeBNUBUbKYdCJRmzpSVHAsERuFhxgs+peumBsc025Kk05KGETOBH3MUss/+uel2I5CNwZR1CJunUpxrexUUXpXIoyftl2WUETMi7PAFF94vyNJBz4KEp0KNvtCbkwxGqNVkMJeRfFX69j0jz1TdX8ffSO6blUI8oTQ4Wa4WQfELNo7TaoWv7crlGBEzIjYBNWJxtL65HMbqMcGMSBdUK4bNnC4WnNFkQUEAehSxl+s045jFCp6fSkGuxXVaOHQvBIVnwKb5vY6OlHbqFkHF5w/WtVtiFlRF9pHd9c20DLjcdAibk6bBtbZk0m2VUXU6tWNMWXhd/kHTsNQn5BSl1Z01flCkj4fYqIZfmBrwV8FqolUWHbC2EfJ/GTG9kl4u5mBlnzKlcO26XmwABE/IEoK7ZJFF1JInPQsIXbJNEftUIh0IcDkVZpSGThexOoXCrNv7TIsJrrxJyaWZqdc8jepCLBaK0EDIXx96x5gVJZW7VJSNirrJwDoEb5W4k8m8Y9t4oakKezzzfq9B0WgMhINTSJWsVIRMwEv1lsUPmlJB9qOCihatWlL1KyGVSJwiO3MjcXFIjT1xg4mghZHyKSaZUK/GyWeos8hypbcvlRkbAhDwyoAOaK0NacafiAKZGQ756usKpnE+ye3EouEhKIoFAIJKa3Bn4rJYJaVoIuYZEynzIc7UhkxiIfMtRapP9EORD+kxCl6O0EDL1uMbqfRXvHucTpD4lwCjL0zqvHZQBywwQMCHPYBLSELgvrrx6iTBX7mBbJRzikbidj5o0jDFRzKoDJm7fKAMKuHqIu/lWCWUWHQCtImRsqq8LjbI9Zpu8ivw3hZB5rO+knMT5ESFZQtiXpT7N5Z4uCR/gUloJ+ZAUEl36F5ftlrswft+vS7r0ofl8Bnt7JCbk+cw/Dvvcr0b4cxYIGhvjsry6XKSJDRFNC5MF7kxoZ1nI0xv9W+PTUgcCj0ENEAvaVplOMtdDKybJOZoWd8JdLTS4ipAxhZQaHIeYqy5B3SRCXkR0PBuRlotMF+BHXudsMgL3MwQslxEy+S7KrG45uT1J+cmGV7q05WaJ6GMhjV48n1hyk8h8voo9NhIT8rwmHPMCH2MUAkVIJYnzP8RMmC7BAPiOclccAoFyUg4BHFTUJ8H9S1PSe8pFra20J1KVD5zyaF244eG1wa3OJDLP4b2EG+MRErOGUYcDo0WC9v5LSfF9wyRDMAJBL5hm6CMeTm0SIbOYEglY3qeHjzJYsTCCKzhg4mDHkMO1yUPBToH5zLLM1ASZloszN4WzSIItCywLI6lGOXTF8waiv2G6NiriT05povxqLsSd11eyxaMxIc9rctFW+XhJVF8rfHhotfgg8/ER6LBsXkl2D9FmwWb8pcKm2Ncv9dF4uccvXsvU56WBRs39f8sEgog3pWwSIfNMpNHEdEQu5Fo5NF1y+vhiMSIQiACTUlgcuU8xCjdd46GDxt0ieNhA5JYZIWBCntFkpKFgAyaFI/6ifYINmGuAoqM/Gc6i2SK2URJyJhK2u/v2dZYuFUWLxd+ZgATu7cvSl3YS7RF7+DLC2nRCBgcwxIRUM3csUCT1QYsuPS2W3QhNSH1pAsEWz26D8Gc8Z6IJatGUYha7Z7rpumLKXWQnETAh7yTa9X0xLxyecREm5glOxdmuYm5AA4bY2ApjAyyF9JvYJjEfkAgHf2YIG7e2A5LpYFEdcvhCspA2ZhG0MT50DqgIJMCzgiCILGjlB4d/szjEm5MXPS0RbWzHKYdmhz2UrTz337EziOaaTdOQ8/Myd9jWMfFgUmLuCP7IWGIi4CLb6DO+f6HhYnaCNEvBvQ0viSzMbcyjzLzhrYN9nl0WJhIWOiIBv54WUC5frb3NpP6NdclREDAhjwKjGzECRsAIDEfAhDwcQ7dgBIyAERgFARPyKDC6ESNgBIzAcARMyMMxdAtGwAgYgVEQMCGPAqMbMQJGwAgMR8CEPBxDt2AEjIARGAUBE/IoMLoRI2AEjMBwBEzIwzF0C0bACBiBURAwIY8CoxsxAkbACAxHwIQ8HEO3YASMgBEYBQET8igwuhEjYASMwHAETMjDMXQLRsAIGIFREDAhjwKjGzECRsAIDEfAhDwcQ7dgBIyAERgFARPyKDC6ESNgBIzAcARMyMMxdAtGwAgYgVEQMCGPAqMbMQJGwAgMR8CEPBxDt2AEjIARGAUBE/IoMLoRI2AEjMBwBEzIwzF0C0bACBiBURAwIY8CoxsxAkbACAxHwIQ8HEO3YASMgBEYBQET8igwuhEjYASMwHAETMjDMXQLRsAIGIFREPgf3FbsY8o93hkAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200 127 L 200 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="176.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115 264.63 L 115 250 L 114.65 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.5 262.88 L 115 264.63 L 118.5 262.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.19 237.03 L 114.65 235.37 L 111.19 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 497px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="482.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACm1JREFUeF7tnAWoFG0Xx881Xrsbu7sTuwsVxU5QTLDF7m4xMRC7CyxssTsudjcGJrZer/fjN3yz3+zszM7uvbvDu/ebAyLuPvOcec7/OX3WsKioqChxKNZIIMwBNNZgqRzEATR24ekAGsvwdAB1AI1tEohl53F8qANoLJNALDuOo6H/b4DeuHFDihYtannsWrVqyeHDhw3XLV++XLp162a5R1hYmCRPnlxSp04tqVKlkmzZsknFihWlUqVKUqZMGfnnn38s9zBa0KFDB1m/fr1Pz8aJE0eSJEkiyZIlU/gXKlRIKleuLI0bN5a0adP6tIcvi65cuSL79u2TCxcuyP379+Xly5fy7ds3iRs3rsI7Xbp0Cu+SJUsqvIsVK+bLttZRrp2AentjAO7Ro4f07dtXMmXK5NPh1EX+AGq2cbx48aRLly4yYcIEyZAhg1/81cV///6V1atXy6xZs+TWrVt+7VG4cGEZPny4tG3bVrh0ZmRpcv8tgKoHQEsHDRqkCBYh+0KBAFTlkyVLFtm/f78gYH/ozp070r59e0EzY0JYi7Vr10qOHDkMt7EE9OPHj7J9+3aPhy9evCjLli1zfe6PyS1RooSMHDnSY09u8KdPn+TDhw/y4sULOX36tFy/fl0iIyM91nKwjRs3CgK2Ij2gCLZp06aGj/EOmL7nz5/LpUuXFDfy48cPt7W5c+eWa9euSeLEia1YK9+zR7NmzeTr168e69OkSSPILnv27JI+fXqJHz++IHM0+OTJk/L69WuPZzD9R44cMTTDloCavfGmTZsU9VfJH0Dr1aun3HJfiMNxcebNmyevXr1yewQfx6H52xvpAZ06daoMGzbMF/by7t07GTBggKxbt85t/ezZs2XgwIGWe1y+fFmJAX79+uW2tkKFCjJ58mSpXr26qQnlcnEZxo8fL2fOnHF7HlCvXr3qcaH/9YCqp0BLevXqpfggLaHt586dkwQJEpgKNyaAqpvWqVPHLegjWMOCeCOsTalSpeTx48euZfi/uXPnSp8+fSwvg7qAhhiXUG/VuAxHjx4VgkmVQgZQ9YWnT5/uoV0EC1OmTAkqoDt37nQz05hKtNcbderUSfF3LmGHhSluonXr1j6DqV1IMDV48GC3Z3fs2KGY85AFlBfv2LGjmwlEOx8+fCiZM2c2FFQgNPTevXuSP39+N00z8u3qArQyb968bv6fCB3XEROqW7euHDp0SNmC9A6Ate4j5DSUg3z58kUJIvCvKmGOJk2aFDRAb9++reSFKpFGEbyZUe/evWXRokWur7lsDx48kIQJE8YET8EnE1M0b95catas6RHphySgSGTMmDEyceJEl3By5cqlaKkRBUJDMW0IUaUaNWoo/suI8HlErFqTzGUziuxjhK7BwyEL6JMnTyRnzpxuR6LikidPHo9jBgLQhg0bKpUdldASs+rXzZs3pUiRIm7vQSXI34JIdMAOWUA5LOkK+aJKlPfatWsXUEDRNooY48aNc+0LWJg+s1LkkiVLlIhcJXwpPtgOCmlAW7VqJVu3bnXJCaGPHTs2RoCS+1EAwAKQllCH1lZ3smbNKseOHRNMvBn179/fLfghiFuzZo0deFrXcs3ewq7CgjcpkMstXLjQtaR79+6ydOlSS0CjI1nKjFSYKCiQsngjfbpilVZF533MnglpDUUbMYcqYW6NuioxreWijYDSpk0bSZo0qaX8GzVqJHv37nWtI3ceMmSI5XOBWBDSgE6bNk0RtEoInMRdTzEFVN0vUaJE0rJlSyW69lZupIJz/Phx12ssWLBASGPsoJAGdNSoUUo9VCWiTm3DQP1cDyjrjIIndX1ERISS61IcIPjZs2eP8m+V6Jdu2LBBmjRpYohRgwYN3GrVdqUsvExIAwowBC0qUTWZMWOGpYb6U5xnM7ovlBZ5Tv2hAT6VjkfVqlU9+FHa27Jli+tzivj4XjsopAFFmHRbVCIgIjCyMrn+AqruR1GdzotK5MGkI/q+7NChQ90uFj519+7dduAZuhpKO4pa5vfv312CAlz6pMECFO0kB9VOG6CJ+FUtrVy5UpluUIn3pGqk7YoEC92Q1VD6qfgqrV97//69YRstEJUilQ9BGMGYSkap0t27d6VAgQJumDE7VLZs2WDh6No32oASTWoDC29Na/2QmD8NbjMJUFelvqoSAQotLiMKJKD6KhDdjwMHDniwZUTk6dOnrs8DWVw4ePCgUACpX7++B9+wiIiIKPwA9Uf+YFbokFsR/qpnz56uZQQCFBuMKNCAhoeHS+nSpZVDqbRr1y5lOi7YgM6fP1/69evnYmNWpNdH4JQJMdWMr8SEcDFoPyXPcuXKKZUx6swqhYWHh0fR9VeJxBnTZTUySaI8c+ZM13Peen2BBPT3799SpUoVZfxRJWqlDGGZTcMFUkMBE1BVMst9ETjgkQKpxNjJqVOnlFHN6FLnzp1l1apVrscZ8yS1Uv1zWGRkZBTzKdre4ubNm4U6qTdCQ7Q1TrPCOHsEClA0kmBDP4ZCVUZ7S/XvHShA//z5I/ny5XMbKSEPHjFihKGomE6cM2eO23f43MWLF3sdxTSTu9G0Bi08rIRLQ/nBL/Ou2oSczjxgmU21MbjEjI1KhO3Pnj0zbQ8FAlAuXNeuXd38JvwBSzvmEUyTSy6q72niprSNby3/z58/KzNF+j4t7gmZ+FJGZD8uElMJ+lzWyCoqQRGjkphdrU8icEFTU6RI4SYj/BfO+M2bN67PrYQaE0BJ6jExaIJ+6o9p+hMnTgglOW8UUw3lHSj3UbTQ/g8GBGbbtm3zyhvAGSgDXC1lzJhRiVWYnGRS3ogAkirV6NGjhfloLVWrVk0IjvSu0RXl6jsXPIwpJpLlBpL3MUrIjC6MVGIUg3FCRkLMSA+o2Vwuz3OpKLPhg7ASVGO0uabKg6ICgZD+wvmiod7mcnke0GihcYE4GymSfqaWNtrZs2dN55i074GPI8V6+/atx+sBCOAULFhQmXLAKjItyEXgsho9U7t2bSWiN7KgLkABDD9kNlZhJCg0g9TBKHzWrvf1ty1er/p/vySgoMTH7bYK3NT9AlWcV/cjCANkbz1R/Vm4oLgMtCq6xNmJntFYs8DKLQ/9+fOnULaix6g1v0YvQOhMcELobEWBAJQDEKjhw/z9GUKgAE2ZMqXSNeEdojvshWZRejx//ryV2FzfE6NQjSJF0U4eGm1gWFh49OiRrFixQmkBkaMSkHAATEL58uWVLkOLFi18Dr/9BZSxTH6Fhlnjl2+YJHhaNZbNJBQdQAlYMOe8A6kBJp6fT0QXSP27IVfqu6RfmFd+8qB2dODLlGDx4sWVFA2+vp492pUin6+Xs9BWCTiA2iru4DNzAA2+jG3l4ABqq7iDz8wBNPgytpWDA6it4g4+MwfQ4MvYVg4OoLaKO/jMHECDL2NbOTiA2iru4DNzAA2+jG3l4ABqq7iDz+x//31G8Hk5HGyQgAOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gZcDqA1CtpOFA6id0raBlwOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gdd/AGTpUcp01/CWAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.37 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.12 547 L 198.12 543.5 L 196.37 547 L 198.12 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403 127 L 403 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 404px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="389.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417 137 L 417 288 C 420.9 288 420.9 294 417 294 L 417 294 L 417 328 C 420.9 328 420.9 334 417 334 L 417 334 L 417 408 C 420.9 408 420.9 414 417 414 L 417 414 L 417 418 C 420.9 418 420.9 424 417 424 L 417 424 L 417 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 238px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="406.5" y="232" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 279.5 257.6 C 279.5 252.85 290.69 249 304.5 249 C 311.13 249 317.49 249.91 322.18 251.52 C 326.87 253.13 329.5 255.32 329.5 257.6 L 329.5 304.4 C 329.5 309.15 318.31 313 304.5 313 C 290.69 313 279.5 309.15 279.5 304.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 329.5 257.6 C 329.5 262.35 318.31 266.2 304.5 266.2 C 290.69 266.2 279.5 262.35 279.5 257.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="262" y="313" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 322px; margin-left: 260px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="260" y="315.5" width="89" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAABECAYAAAC2wE+iAAAAAXNSR0IArs4c6QAAD95JREFUeF7tnWWw7LgRhc9mAxtmZk4qzMzMzMzMzBtmhgpVmJk2nGyYK8zMFWZmf3lybZfKM5bGmrm+d07/2X13RD6Wj1qt7tZ+shgBI2AEjMAsENhvFqPwIIyAETACRkAmZE8CI2AEjMBMEDAhz+RFeBhGwAgYAROy54ARMAJGYCYImJBn8iI8DCNgBIyACdlzwAgYASMwEwRMyDN5ER6GETACRsCE7DlgBIyAEZgJAibkmbwID2MSAp+QdJ7Qwt0kPWVSi7uz8kUlHRyG/ndJByx4lEdIekD47SBJV9ydj713Rm1C3jvvcpufxIS87+2bkHf5V2BC3uUv0MP/PwImZBPynvgUTMh74jXO7iEuIuliaVRvkvT5NY/QhGxCXvMU20zzJuTN4LxtvbxG0rXSQ99M0ovWDMCRJB069PFXSdhPt01sstjlb9yEvMtf4EyH/yNJJ9ogIc8Uho0Py4S8ccjbdmhCbounW9tHxBByL5vQkI27TRZ7Yg6YkPfEa5zVQ1xb0qtNyDvyTqwh7wjs7To1IbfD0i3tQ+DJku5qQt6R6WBC3hHY23VqQm6D5ccknS80dW5Jn07/PqykG0m6hqSzSjqWpH9J+lnniP8ZSS+X9OYFwziVpFtJuoQk/v+Ikn4v6QeS3i/pWZK+t+IjnFzSlSRdqhvDqSUdW9KRJf1G0q8kfbF7pndJepukX4/08RFJF6gYx9E70v5dKA8O5wj/PlvwzLhsN6Y7SzqXpGNIOlSHV/ydalO8LBjLlSVdTtKZOkyP0wWVHE3SHyT9uPv7JyW9MWHxn4pnbFH0mJKu02Fx1fSOjpca/WV3aPoVSW+X9JI0J/hpCiHznpkPveApcz1J55XEXDmCpN9K+rkk3jeYvLvFQ7qNQxAwIbeZDRDXpUNTF08RU2eQ9AZJpxnphol9TUl/TOUgnYdJuq+k/ZfU/Wf3MRKV9syKxzhBavumI233TTKmx0t6giS8F4ZkKiHn9SF3Frn7dJFmjxnosAUhHyYR/QMTAY9B+HVJt5H0obGCjX5nESfakEVombCw3albsF/WzTlI9AOhcE2k3lskXUUSpP/ibD4v6h+lAIXhu42eeeubMSG3mQJvzcJOCUH9atLc0LhKBI3j6qng8zrt7JYllVIZtG+If0zOnrSq444VHPgdLfTySUvKf55KyO/ptK5Lhkb5fzRU+mRxymUqIR++04Zfn7TiGij+K+n2HWk9u6bSCmUx+WD6qRF2EZ/rdlMfXpGQmT8sOB9Pu7HSvn+adkffL63gcosRMCG3mR2QKdvKXjjYQnPFjPEXSa9KmhXmAEwDaNDXHdBQ0XDQpiFk5BvJpIF2hpnjFB3R0zYmkSg/TNvKZVtqtuNonfjsRnmHJPyGv5Y0dDSyc0q6QfpvLMsHzxb2H1kb1ME0g0AImFd6gVziIR9/Z9sLufXCdvkK4d9sne/YkcNlwt8gaPrFnID5Igab1JgsmPPsaDDVRPlOZ1IiiOWbCQfe0wXTe0WbjsJuBkJfh2CeYoGK3ybvFdMWpNkTHzsdFq6bJC36392475Hl8KjRkF+R5gbmGwSzGM/4pWTGwnxCvhBMKLyDKF+QxGK/aZPOOvDf0TZNyG3g50O5WmgKEwQmDOx8TPChLR32Pj68GNCALfnCkrBrPi4lf4GIc3l6Iqz4995MMvREkCU27TNnBAe5Q06L5LaS6CuO8aFd4QOX1GHxOG34vcTtjefuiYCq95P06NQG5hjMJT0R8SyQOeaaXmoIGaLnmaLQH2YZSC2X03f2bXZApww/YEtlcYx28BYzid0Ai158T39OmnzUfGNfLByvTOcMjIu500sNIXMWga0YwVxG8qGIcd8mJg2I+vzZA99c0gtbgLDNbZiQ27z916VDu9gaH8cZJbGlWyREsKHh5MJBzdDf+3IcsODrG+2LkCRkOSRo608KP0A8LAiYGsbk7t1h3xNDIbTUk6ZDyaG6qxByvqChpbJTQOOL41401lJCZnfA++DwsheI50EjIJwuaeSHC+XIlPaoMfAqf2eXwG4hCrZ+bLrLhOdiwWWcUWoIuQYPtOUvJ3tzX49D4LNUPq+LZwiYkNtMiSFCLkkBiZkDc0eUv0k6iSRO0pcJZhC2j70whj5cOdbjHUNw0YzwtM4WfJfCR6c+5oyo9d47aZRDTaxCyEP4fTSZDEqGWUrIHEA9NzT4i6QVYlYak+d3i+AtQqF1ENALOlMBO4pe0FrxgBnS3PPxskPLzxFqCRnTF/3lJqkhbJgDj81+YI5h+rGsiIAJeUXgsmo5obDVO36BuxhaIHbiKGwHsVGOyYMzjZjTf2zQuVxowDOArWnNIUx+yIRdMW6rY5+tCJkDznyxWoRJKSF/MJmE+nae02n6mGVKBHv2w9M7xS2QBRNSGjIplbQ3VAbbejwExsuChb1E8MahPtprL7WEzE6BHUOJnGzA5fJ2GzjwLBnbri1jQm7z6nJC/mzmV7uoF7bOHFZFQXNFgx2TXNtb1GfuOob3B+54NYIdlXq9YMM9iqQ/DTTSgpAhEogF+2mJlBAyhAXWmHt6wYb+2pIONlAGIoZQo9QsStTDlsxhcS+1hMzBHDbsUmFRx3zVC7Z5vD0sKyJgQl4RuKxaTsgv7Q7yblzQNCSRa1gcBnLYNyZ4QeB72gsHiNisc8nts5zW33Cs8ex35gnb+nj7BB4ImBVyaUHIkALkUColhIyXCWaGKNg887+V9tm6XB7UQfuMGVttqaDhciDXSw0hMw9ZrIYO8hb1n7srvnfAe6V07C6XudYYkNURyAm5xkYb3b8YQYzyWzYiNCE0ol4WETLkRoRgL2iERPjVCotMn8GNumjo2FVzaUHIjBHttVRKCBkvjjwi8qgDO5TSPluXY5EE4yjsQvpgoZL+8kW6hpC/nezHJf30ZXK7+jJTVk27W1vWGnKbV58TMocdRNmVSE7IpVpRKSFzMIS9r7XcK7mjrYOQa2y79F9CyOxYcm8FdiitfGfZ2WDXLxU02Rh6jP01Xyhxg8vnx7L280WnhpAJCMld2caeJc9bwlzDHdCyIgIm5BWBy6rNmZAJRom+qW2eeN8B1xABtdCQ+dBxtyuVEkImvDja5vFmIWKvlQxpuMvaJjQ6mpxY4PA972WV8RFUgtmglxpCfl8WLVmCyyM7j4z7h4IcdJZGppa0v3VlTMhtXvmcCRnXLoIHWssi0mxByPg937NiwKsQMrbSPrqwoquFRacScn74uoxMFw2CBEkkHFqFkInYJDS+RvKbqzmU7BMg1bTjsgkBE3KbqTBnQv5W5oP8kOzgpw0Ch7QyV0IeMlkQEt3KbW0qIQ9FENaaVHCXjF4jNRoyLoEcLNYIQTvRLW8VO3RNf3u+rAm5zSueMyETwUVuil74iIiAW5fMlZDJZEauiij4ipMGdQ5CRF4eelx76JjboWsIudazBczyJFjkFyHxk2VFBEzIKwKXVZszIZM0hry2veAGR3a4dclcCZlAFpLgRCGQZlPpNMfwzs0NlGfMeC6UCoEkMQKzhpDJs50nDRrrl0PJmKQpz6k8Vt+/ZwiYkNtMiTkTcp7Hgixe6/C66JGcKyGz/ceFLB7kEYH41MIpwLeSpy0lcX+N3+6yroYi32qzyrG4EJnZSw0hUwe3xp8U4kExkmb1CYn4N4eS2MItKyJgQl4RuKzanAmZlIkcekXhdg4i+9YhcyVknjUnLAIb4sUCy/DIoxUpe8KR5FE1+PItsmBwK0wvNZFveNLg5RAvNKglZHJ1kE+jRE4sidwXUXLPkZJ2XCYgYEJuMx3mTMg8IcmBYiYw3K34eEqFrHLcREFkHttUbopgizskOSGXfOQ5fuvwsmCsJGCPyeXxQSa6EXzGJE+ms46dBjZubN29kNGPtJ8lWjjuZ7ihRaklZFJ8kv61RPL8JiRAwiY/lhSrpO2tLWNCbvPq507I5BfIt+YEEZDnd0wITiDBfEx4tCwBEjbPGMJNgEyeFSzvc1OETOQb6TejFsriQuKgZd4W3INIJGT0sV3khz2G57LfhzxB8J9+xkijZGj71IANuJaQ6abk9hlysIAHWnIvB6eLF6Y8/9bXNSG3mQJzJ2T8bflgY75aAg+4JorcFouEBD9EzcVDQIgrv7Ej1s8zqpFzGa1rWcTZpgiZceb5nfkbB51gQQ7rXCA7XMkidpTDhJEnA5o6m8glQapUTCG9kAqTkGgwGhJC7UnFii2X1Jcxkf4yQiaXM4n5e+mT25PQiTSu+CUPCbmX6S/e8EI5DiXfORWAba9vQm4zA+ZOyDwlWivhsfkVTrjFcYUTmi2HVCQQ4uOGRMm3HJO5085YYnY08TzjF1thLtHkYyfXM4tDTK25SUJG40crzlOVcvsHmj+uW/w/wTQckHE/Yn6F0/WzPCJtZtG+Vobc3/g7Cx25ODCVYCfmAI4bubnGiWeCuMn/EV37lgW/cCNLDO/HjEWbvS8yASbggTkHPFicSSh16+wgj7FBxBCyZSICJuSJAKbqu4GQGSoZ1A6aEE3FDdBRqxpCb+gQMS+X593dJCEzFhYliItQ4xrB5sxiU3PLd037fVlCvDFV1AhEybuNXhLsSoYuiaVdrqyK0ZDshLhxhkU7ptQcGwPZ6Fi8h3YXY3X9e4aACbnNlNgthMzTcvDCdU/cgRbvyluGBNozh1qlW9IhLTm2v9OEzFgw42C+YIHBtjwmHFaS4a7k2quxtsZ+57sEb3KFxPzNQ/U4XOUmbPzNh/Jr85xDh4I56XNvIfk00JIxY5Uc7jHv79D1T3i+pQECJuQGICb7XrSzzinb26InxHTAdhzHfjwwOLjCdQq7I9oOIdeYM9C6cBeryTpGn9wJCIER3IAZBOIgKg6TANpYJLZNa8gREzxI8Gxg+0+mPQ7uiJDDBQ1tE40RUwFb+FoMps4uyJGgHuy1ZFHDjILGiycDiyQLJBns4mWrvL+YowNTAwmmcsmvi8pNUbgDYgLhlnHmCgsD84JDUTxuOOjlFnNLQwRMyA3BdFNGwAgYgSkImJCnoOe6RsAIGIGGCJiQG4LppoyAETACUxAwIU9Bz3WNgBEwAg0RMCE3BNNNGQEjYASmIGBCnoKe6xoBI2AEGiJgQm4IppsyAkbACExBwIQ8BT3XNQJGwAg0RMCE3BBMN2UEjIARmIKACXkKeq5rBIyAEWiIgAm5IZhuyggYASMwBQET8hT0XNcIGAEj0BABE3JDMN2UETACRmAKAibkKei5rhEwAkagIQIm5IZguikjYASMwBQETMhT0HNdI2AEjEBDBEzIDcF0U0bACBiBKQiYkKeg57pGwAgYgYYImJAbgummjIARMAJTEDAhT0HPdY2AETACDREwITcE000ZASNgBKYgYEKegp7rGgEjYAQaImBCbgimmzICRsAITEHAhDwFPdc1AkbACDRE4H/y1m9yS92XTAAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550 127 L 580 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550 373 L 580 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60 209 L 29.5 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250 455 L 220 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250 455 L 220 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/.docs/images/architecture.drawio b/.docs/images/architecture.drawio index 4343db2e4a0483a162a38cd87ac13b3674f79761..2559a653790f7a5de96948d00394017982d8073a 100644 --- a/.docs/images/architecture.drawio +++ b/.docs/images/architecture.drawio @@ -1,10 +1,10 @@ <mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.2 Chrome/134.0.6998.178 Electron/35.1.2 Safari/537.36" version="26.2.2" pages="9"> <diagram id="mvBsv1rP8O80Qe3yGnn_" name="docker-compose"> - <mxGraphModel dx="819" dy="330" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> + <mxGraphModel dx="985" dy="565" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" parent="1" vertex="1"> <mxGeometry x="700" y="574.61" width="150" height="105" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-119" edge="1"> @@ -165,7 +165,7 @@ <mxPoint x="-9" y="-20" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="uDJ2bVtIrgoZBCZFZmDG-12"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="uDJ2bVtIrgoZBCZFZmDG-12" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-119" value="<b>Gateway Service</b><div><i>nginx</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> @@ -271,34 +271,34 @@ <mxCell id="a_cl7nsyDpLQFaXOHeFD-4" value="metric-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> <mxGeometry x="542" y="382" width="85" height="17" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-5" target="FWEJ_FGA9GBXbfwohBE8-105"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-5" target="FWEJ_FGA9GBXbfwohBE8-105" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-5" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-5" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="850" y="189" width="40" height="14" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-8" target="FWEJ_FGA9GBXbfwohBE8-108"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-8" target="FWEJ_FGA9GBXbfwohBE8-108" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-8" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-8" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="850" y="435.5" width="40" height="13" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-10" target="FWEJ_FGA9GBXbfwohBE8-120"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-10" target="FWEJ_FGA9GBXbfwohBE8-120" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-10" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-10" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="280" y="272" width="40" height="12" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="520" y="258" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endSize=0;startSize=0;jumpSize=3;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endSize=0;startSize=0;jumpSize=3;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-14" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-14" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="470" y="517.5" width="40" height="13" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-104" value="<b>Auth Service</b><br><i>keycloak</i>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> @@ -313,25 +313,25 @@ <mxCell id="FWEJ_FGA9GBXbfwohBE8-108" value="<b>Dashboard Service</b>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="710" y="422" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-21" value="data-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-21" value="data-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> <mxGeometry x="732.5" y="657.61" width="85" height="20" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-23" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-23" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="719.5" y="583.61" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-24" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-24" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="779.5" y="583.61" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-25" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-25" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="750.5" y="593.61" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" edge="1" parent="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" parent="1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="774.86" y="544" as="sourcePoint" /> <mxPoint x="774.86" y="594" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-30" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="uDJ2bVtIrgoZBCZFZmDG-29"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-30" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="uDJ2bVtIrgoZBCZFZmDG-29" vertex="1" connectable="0"> <mxGeometry x="0.3566" relative="1" as="geometry"> <mxPoint x="1" y="-12" as="offset" /> </mxGeometry> diff --git a/.docs/images/architecture.svg b/.docs/images/architecture.svg new file mode 100644 index 0000000000000000000000000000000000000000..369974785eeda30172c581771c30a8b0ec270a69 --- /dev/null +++ b/.docs/images/architecture.svg @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: #ffffff; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: rgb(255, 255, 255);"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495.01 428.63 L 495.03 411 L 380 411 L 380 171 L 337.49 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.51 426.88 L 495.01 428.63 L 498.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="346.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115.01 428.63 L 115.03 411 L 220 411 L 220 171 L 272.51 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.51 426.88 L 115.01 428.63 L 118.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 171px; margin-left: 240px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="225.5" y="165" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388 137 L 388 331 L 495.03 331 L 495.01 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.51 344.88 L 495.01 346.63 L 498.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 295px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="289" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="325" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 411px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="405" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1++uvv6RMmTLyxx9/qM9uvvlmmTJlive9HwA4xfjNH374wevDBsyZM0dZhCBC0NyxY0fPetIXi7RixYqU7iAMAPAsNp9AFOukBX1MnjzZDQB2JE1ky+TXrFkTs4AePXootAcRe5GYp9mzZwv+H0FxmZmZQYZUbRcuXCh9+/ZVf4N4Nv+6665zBsAVV1whnB4tbP7q1auFg5COoMNmzZqpg6MF14GVKFq0aMIhwwIAgz/99NNy2223ec8588wzZffu3W4AuOuuu1T0qwXl9unTR5lGBtKLQkmY7FNPPdVZR/Yix40bJ5ze+++/X42B+ec04m+DiLmBbdq0ke7du8s111zjBID3338/Lm0KIy1dtWqVZGRkxLiDVK4gTABgycqVKxfzbCyDrwsgqCD4076+RIkSyiwWK1ZMKZNgZvz48Z5iAQrZgqvYi8T8t2/fXurWresNEVT5gBD/poPJWbNmqdjk+uuvdwJAp06dBNejhVz63XffDRzfJNKBGZfwPZnBjh07hEzKljABwNjEVHof+R8ewxcAzz77rPTu3dub2w033BDj9zFhderU8b6HJwiSJ9uLHDVqlIwcOVIRKZhNJCgn8Oijj6r4BClcuLCyUEuWLJF+/fr5AuD333+XUqVKxQR+uDXcWxhCSklAasprr72W0LWEDYCzzz5bdu7c6T361Vdf9QcAES8T1PL222/LRRddFLMAWCbMppZ33nlHLrzwQid92YscPny4PPDAAypfBQhagnACWA8Nws6dO8sLL7yg8u+bbrrJFwDENrgMLTBqWLx0M5FESkA37733nvfVkCFD5JFHHslxC4Br/uWXX2J0mtICQHPWqFHD8xv8/cUXX8RNlJQQlksLwRaBnIvYAICkIHXCP1WuXNl7tisnsGHDBmnYsKH3aPJ4XMrUqVNVJqAlWRbAZuCXteCzX375ZZelOLexn0FgaR4yPVCYFgC3SLymBZf4008/pbYA5KkEZVowrffcc0/cQjGbBBgEbwh053fffad4cT9JBgD6tWjRQsjFEVdOAMqVTMLu4woAeHNzw7FEI0aM8FtGoO+JL4gztJCumtlBTgAAQu3OO+/0nqndalILQPAHYkAJQu5P2lC2bNmEiyXCnj9/vvcdCjetQjINpQIA45mRux8ncOjQIcVQ6jkDBk1duwLANs/k/QRuYcpHH30kDRo0iBkSppV4xZSwLABUOM8zA0DqI8RJSQHw/PPPS8+ePb35YEYxp8kEksjMkTHDmtFLpbxUAMCiALj9+/erIfw4Acw689SCos877zz1rysAqlevrip8WuAgeG6Y8tVXXynm1BQ2x06fwwAAJNTVV18tPNO0OGQeWOqkALj88suFKFGL3+mjHWVdJq3FJXBLBQDGIXXjFCJ+nEDXrl1VwIcQCBJxa3EFAIAz2T/IIHQRprDZuDRT9uzZo9JtUxLVAl588cWUU4GboRawbds2tX9mcK51SClb10gSAgB0sJmav8ZHMUHcQCohhzcrTQMHDpRJkyal7OMHgDfffFOaNm3qjZGME/j1119VHIIpRR5//PGYgosrAMjLzephblkA4ig7Zgq7GsiJnzt3rnBQtCQEAL6BgE8LwaAZGSfbURg7CBhdPDnllFNUMAgVm0z8AEA/LjYASiQZJ2BuMKQK8QqACGoBzBSSvmQzJoUchiXgngN1Bi3Ml/jFljABwImHDq5Vq1bMY+IA8O+//0qFChVizCDKJQV0EdI1bsxoWbBgQUwV0W+ROg0028ELaGqYzxO5FrgJ2DpE1yrMMVwtAH2hbLXARUBOhSlkGeZtJNcswHUOsLSQWRA/3OCCC9GxkD1GHABgzLp16+b6LN92mG9q49mxAJhkCifaJdmcgH1SEjF3rgBgbG7OaOHyhgkI3wU7NABUpJdaknENYQSBftOJA4BdBfMbwOV7KF2i60Ti4gLohwnjggNicwJYB6wEcvLJJ6uc2nY7rgCwqW/Go4xqp2gu607WxtYxdwtMC6f75ToASBUwG2G/K5IqhnAFAK6EdEaLvojKXJmzTnPg+6F9bXEFQKKqma5+ZmfTdV8YOayZ6fMT0eu0z3UA2BcoUbi+URNk8TYde/rpp6ssIhGf7goAmxPglgsUNH7frE0kU6YrAFinnQJzmcJOp4Low2wLqwjVrYVC2qeffupkHdO5EeQ3T88FgEiCP5OSxHebKZjfYOb3ROtmMEh+TjBiiysA6EclUtcYyJkBlUlXky2YJI75rCAASBQHPfPMMzJgwIAgKohrS25OMKYpcxoQmd9yyy3/PwAgGLp06eJNJJUyXbQAH2/e67/yyivVXfrsAMDmBAAYFz102Zg4gGpiIgkCANwKTCZMohYia55vpm8uetBt2HRuBJnsKKVzUsJk8UWuugA2iCtPWjRXHGSRZlvKjvDympjhDhx+Gp7AlCAWgH4mJwDAdMROdYvxIXKyCwD641qwfqav5oUL6OagVpGb1KR9ZgmY+ULT2qX1VLrJMRdA6RVuWt+gSUSkpAMEagnUFLQkyqmDAsDkBDiV2pxyb0FnCWEAgDFgE+3qJ2wogSbcgE3n2s+FEOM2Em0hxEwBuOYdvURzzjULgNl86KGHvDlk500fcyH2pVFOP6fUfE0qKABsTkA/D4rTrBzaCg3iAsy+EFPmLWX9HacRk47l5PAQ6AIOKpFsNvV91m/WFXRfxhs6dKjvmcoVABw6dCiLjTFf8nAp/PjOXkRZFJRj3kknDkBpWoICgH4mJ8D/cNwEr9xXTCbpAoDxKEYRqJnBm8v67TYwfjNmzHB+jzJXAJCZmZllX05wKfy4KgDzB9GhRV/Ryg4AbE7AJV3NDgCYKyDGhfGCTCLePpU+KPOSwZCxBLndnCsAyMjIyOIenBZ8nlkIct3oZO3sq11wAQAMk4mkYwE4iRR6qKAhLi+kZBcAen2YeFJa7j+QhWB5mIcJCgI8LpbAH/D2EAFgqoJYMt3lCgCCvh6eXUDkxf74eXgJ8xUybkvblbejce2+18KPxkkfjXOy+X1II8ijo10iAIS0Q1wcMZlOyB2IJPOdiZAeFeowEQBCUifsIZdJzNexqYByqzmd300IaVq+w0QA8FWRewM2m6vsppAB8B4AbzhTBSQ1piLI9S8dCLs/IfyWEQBC1ql5NyHV0Nw7MG9dhzwN5+EiADiryr0h5V74D/uHJcwRIgC46/OYbMm7ibyNw3UyTL4W+AACQ2oBcAT/t0QWIBd2gBdbIIugrLliFvRndHJyihEAclK7x8DYEQCOgU3KySlGAMhJ7R4DYwf7TbdjYEHRFINpIAJAMH3ludYRAPLclgZbUASAYPrKc60jAOS5LQ22oAgAwfSV51pHAMhzWxpsQREAgukrz7WOAJDntjTYgiIABNNXnmsdASDPbWmwBf0HvLkmY11zz9QAAAAASUVORK5CYII="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115.03 481.37 L 115.03 500.03 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115.03 476.12 L 118.53 483.12 L 115.03 481.37 L 111.53 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.17 516.81 L 114.63 518.63 L 118.17 516.96 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="195.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115.01 346.63 L 115.03 331 L 210 331 L 210 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.51 344.88 L 115.01 346.63 L 118.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="173" y="318.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.51 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.49 421 L 147.49 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 143.99 426.89 L 147.49 428.63 L 150.99 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 421px; margin-left: 245px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="230.5" y="415" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 465px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="459" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200 127 L 200 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="175.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115.01 264.63 L 115.03 250.03 L 114.66 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.51 262.88 L 115.01 264.63 L 118.51 262.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.2 237.03 L 114.66 235.37 L 111.21 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="481.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305.03 41 L 305.03 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305.03 105.88 L 301.53 98.88 L 305.03 100.63 L 308.53 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPgAAABECAYAAACs2fgFAAAAAXNSR0IArs4c6QAAEqFJREFUeF7t3QOQLc2SB/B8y7e2bdu2bdvet36rt7Zt27Zt27bt3f5FdG1k5NeonnNm3pz5KiMm7r3T1V1VWfVPV937xKDBgcGBO8uB+9zZmY2JDQ4MDsQA+NgEgwN3mAMD4Hd4ccfUBgcGwMceGBy4wxwYAL/DizumNjgwAD72wODAHebAAPgdXtwxtcGBAfCxBwYH7jAHBsDv8OLey6f2VxHxKIkHLxcR33Rv48kA+L1txe898x0Aj7hHocsjRsTfnrAH/ici/jEi/i4i/jAifjoifjgivjEi/u2E745XBweOcmAA/BoAvrYIhMZnRMQHRMS/HF2p0X5w4AocGAC/QYC39fndiHjliPi5KyzYeGVw4AgHBsA7Af6jEfErnZx9iIh4hIh4soh48oh40IX3/joiXjAifqnzm6PZ4MBVODAA3gnwt4uIT7oCh0UwXzsi3iciHq28//OTX/4s07P/vsJ3xyuDAz0cGAC/ZoC3RQDu74iIZyyr8oYR8fk9KzXaDA5cgQMD4DcEcGvzJLNJft+0UN8cES97hYUbrwwO9HBgAPwGAW5BvnIC+aumlfmniHi4npVKbZ49Il4qIl44Ih53Nv35/X8ZEX8REeIF3z5bDP9+8NuaP8wsdF48Ip4uIh5/HuNDRsQ/R4RN8xtzP18fEVyNq5B0JOH2ErNlw8p55DnFqI/fjojvnAszfvMqHczvmA9+6edpJ4vpieb54Nk/RMTfzHOQyvzimYc93T3sPNbW9u8jwpyQuMtbTnN4vYh46rm//Hzt+w8eES85j/e5IuIx5kIV6VXrK+Vqbb+sMxNTAY4P3zZ3/iBzsNd+5Co+VkTgSUvv/tBsXf5MDzMW2jxYRNhD+P4881weNSL+a57LH09xqO+LiG+d2v3IgT4+auL7O6f295v4/nHzv59qSkW/R0S8UEQ8ZkTg5/1qoctSHvyqPngd97tMAPrI8ksAB/Q9eraI+PB58HttPf+9iHivKdD3JT2Np/SdBccs8QJBwl76ngkUbx0Rv975AgvmnaYN+m6d/agr+MJ5LjZFL5mPfu4/C46e9/5jEpifHBHv2VGzAMQ2a6P/nAHi91+3YJntAfzl570hMLtHUq428mdGxP9uNK4Af5GIsF5PM++Lp9/raOb9W0TEv3a0bU1eIyI+KCKetPOdH5wwABs/0dHed+3rRv7+IXPQmrDIFrI2NwrwN58k5aeXSTx2RPzpzsTeYNLWnzUxjVQ8Sp82Scy3iQhAWSPfpRVe5ejH5/YE1EtHhIXaIkFHpZLPeYV+WCc0Qo/FQBN97TymK3QVPz5bSHv1CkCd18Tf3zEiaJlKWwB/vwmoD7jCQAm+N9oI1FaAP+8M1O9O1kZPt3gptbtHhJtgNOvlKBGWbzwLlK13ARrIG/n7R0TEr011JrBU6UYB/t6T+faBZQQkzpYpbQE/p7xD03xBRHzLrKltNCaWBXyTSbI/TmlPK73tBtdogw8tz2nkL58BBVz6oNlpGKYeU5KWbCT19xQR4c8lYiqT0EzWTL8wzwWovPvwk7B5yqlO4BUj4hWKC8V8ZMn81s7u+ZSIeKvS5k9mIcbkNB8bisB55tmU5u5k+qL591tdEWzm1YhZ+Mul/hvI8ImlyAWpVDes59wG7o+x4gkr75kigmZ8pPKBT5zav/3KICvAX2zeS483a34aj8mv4pI5CyAE9YsuuK7W4ht2+P55EUEZZcJryok5TpERvk8wVXcai7YPnRqzRl5z2iNfsdFPtYI/enYb8/7l0hCo9uv9b9JE/65JyzGTGil6eeKNyTBxFMTkTSQfz5zjoy4RgUGKAnomPvv3LrxgYS1C8x81+YTZXN/S+vw2kt1mafRhs0m8NC6WBFOvkcVkPnNZ1vrhu31NRDx6es9GMZc105RwALIsfAQzX33Db32oyZwE6KylfB/4twqSbCICqRFBiQc0PzPfhtcGWUMxjExAS7BZg0Y2Nw24VC5tjcQJgDATnxNfKlWAW39tuW+vNrkRP7W0UJNQf6U5XpRrOCiTl1lp79eA+aXluZiTfah0e4kIFHtIXKmRMfOl/blE3MiPSQ8+deYHocEywfefnPcHbN/3pgD+rLMGy/3xoZjta0SKA3MjPqhU29rk83fqu784gWXJ53r+adG/P734Z3Pwric/D+SY2eZk4whiVQIUAaJMFqJaDUt8sPgCPhkEXAnAXyJxCv59I6ASKKQVt4gm+f1JOAoENfItoF0j38waVfDxCWd/ULBzjwBOwVMjIKXZsm9fv0GA/+xs5bRngpHcl0oV4J4T5tZjL55RrSB8JMyWhLEA7B8UQcw6EETdUhLGQ2hxu6xRoy2rhLXy8aktnrMqxT3si3v0dxMAN3ggsviZgHXNpySRfqdoIhqGxOshmtX72UcEFoDM9LrF72Fl2GS9pLYeATeA2LSVyZ89+1ftm7Qi4bC3+K29uEUWhFva5INn0ND6fgSVaKQeqpv6xyYTVjR7jZYAJOCTg0Br76p0tDkzcT/WtOrWmuGjuVb3aGl8NPdXdTDjOSY3zPwzsY6WgqmyBVzGRlxOgn4vttTav1YJBrNeuJxLritXkwDIxEKArUUhfp0AJ/H4Ge+/4DvxS95sg9Gi2Q08mgErk30ralo/R6rxnRotScZqWtl0fOlzEeluwZjBjY4W+BCEtFYj1oUNIHW0R9a3l2c1CEorEbRrVAF0ZFz2xPumDwMOAPUQX54gBuj2I1VU04l1fFxCe6hHsLJoqkvxApN79AMLA2Qac5sacU3EjnqJEmI55rPra1baEsC5lO+w1lkPwJlOPdFbfRhsq0W3MW3wSvwuvnhlYG7HxBHIakS7iIYfIYEm7zWivbO/4/e0Rk1P2Ojch3NQ1QTAJhjFVOwla0QbyAs34g/S5OckOWF+YyOaIfvYta8KIK7E83UOSHArm9VXWd+9rur4jvZh/vL9jbiLjj1n4qeLM+Q4kXhH5uPeOD0X0PVeI7GZ7Gq13y8BXFCQkFmkHoD3DLC3Dd+YSbMWeGjfIZlz1JW2p/WPEPMyFxGILorIZh/P/AXusvYAQiaXCCXf/RSqPhPfr0ase75fASEjwRw/J4ncZxeIAM4bvPZVAfSxc+69Z0z1XRqIJjon1T6OCm5COJ+hWDLvxXWq8uN+7GU66jwFXLk3jdZcxSWAU6iKlh6oAOfPkEprwaE8OAOWEsrErztS8eNdJk/1t5aYz7xS4ZQDWa1vrgFrAsPFEY5ehmHTyw03YkZuBRbX1kn1Ui7rFU0WP9gjwU0SXlWeudPIhNySZSWFkysLjwKchZUtprWxGUOLrrc2PWmovbnW5xXgLJSvPvARZnO2mpYAbtxcwUysq70agjoMFi2h3WhNEVSAc9NyluUe07tuDa6AQQoGUHqJ3ydodR20Fshhfjn4ktNltX++G1+YNmWJ9FQefe40Fz73uWmvjt9mpuF7KsPWxnYU4IJFCob2SNBVQDLTWhpz71tbz0+tRe8BuBgTn/vctMb7CvDd2EUPwHtLVZnUOsypFppRYcgRWjJ7jry/1baVKy61sfEE9mxU2myP5OKlLOS4FcIsEYulN4q9119+rmpOiq+S/DdX5kiQZ63fowDv1cKsCQU+mVT3ic2ck24C4NUFO+f4xbNqurYCnMKR9lulcwJcJ0uVZ3xuWryXVHsp1rgO6tmETHsakE8qcpoj4EtjItSk8JYuxVC4wbQ7N60trEKTdy+diTmoyWd1uGSDZmJC1nzzqT54762lSwBX1HPUBdvj6U0A3DkElZLXQUu+dQW4+gpu2I0BnMCQSlA22kjATHVOT1rHO0pN/6iMeC1FcR2Mzd9UWGHz8WNpf/nrXCXW2vLNRcxrqkY0/k3TB+XJc0rlnOPnYxOMOZYg1SUb8asdHd0UwJdMdLUH4hznpJsA+OsU5cWNo3l7U5NH5/tAB7gBO5ZIw+QiE74Z07eHpBzqCbOlFEXPt87dhvshR+mkVvVvCTaCKJPAovrhRuqrCYnrIHX+OVBjs1mLHnAbj1rv7EMfNdF7NfhSELXXfz/Ct5sAuIBavWtdEHEvS3RkHrntrQC4ATnh8q5lFr0bwGsORyjmaMTXqRU8V2XSOd6jJUWMs3b2XfGDnFqrxSOsmRyjOMdY2jeYuLnyzOGIXOiz1xfTnonf6LoA7vs1DSoYmwub9sba8/wmAE7I1+q2ugd6xtrb5tYAnBamOfJhDGa3s7irObs0y1pLLsJ9HdHoXsYutWOhWNx8YIZP5gBAIwcq6qUByhivI0vAHM/8VilWT+9tzbceBrpOgLvCK5cESzUdCUaKk2RXhMashVM3AXAuqRLRnH0Rh7qOyLq1uzUANxgLVvPeIs71KOPSpqvahMR3+sZR0esgfrXI+dH/nMFR1hyxrqAiBGyAnF+W084ngs41H3GAvNGOFHaIkQjA5fjCdQKctlaO3IhLxrLpvYXnz0v+ly9cL/e4CYAbf626VO2WD0mda31vHcANiH+Sj9kJPjhBtFTTmxkh0CZXmo/sMYcd3OglpZCqg2gLuWsmbE5nqTmXApRmeIbZ5K5uxV5fNlWOLSylFOtRUek1lkzvZm58BDhz8eMMcyVWQa4dJyS5SntECCniee7SkDBdKohpzU4BEN67pCCTY6L1QpClsSs3rik1VpRa80ynjM93evLg2tXzDLITMgV1flvrwEURzG3rW9OI7d1bpcENijkqsptTTQ50ANSetqw5ZFpcgKoWSSwxTk5e9ZzIcqMKvhrNBSDjWjtrXvvhhijgyZVESwUbvlnPVSuDzcG3rcU37lzGqS4dkGvuXc2BO8AarR2jzH0xMX3bxrGh1cln2iqDPBVAhHyuXde/9RV/WSPjBQJZjUZrNQGnjq8X4Cw/7lGuenPHnaxLjxCX5lLHn4Xpmh9/6wBuEZx9rnXTW5cjtIVzEytg5HrovcP63hU5dvjen40sADO0lhBW88r3mXt7OVkb35VBAoeNAI8PvHSWnF9er/JxtREzdU3Q8TFpYeZsrlewyEu516U776S+xDOWiB+r5t4FCoSFgqSaqto61HIqgFQVOjeerTTKwKGLpZoC0WnWUM3GSAOy0CqdOr5egOvXmB0YyUTAqnTbOjbKjWWV5nP1yqvXaiduJcBJOAX5+UAHM4aplY9BLm1CgTXlnpmkf/g5fmhQARY+ru9bbDXb2Ze0eZnrS7d+KKpxyixfnaMvAKcpBApZDr5BY9P6xq2wpZa1SjOtXbfj+/qpVzYRPMx8/fErjVusQR9Mv3pc05jMcSnPymph3WSBiM80tNNNgpzy+u3aKZuvxQZaXECtQo7ys2YIJn9axxwxPhVA+Fx9cb/Da4KXhnfgA99pdunJemUTk37tDrRTx3cE4Ma9VJYstiD1COwsExodf2lo8yHkMqlB5zKunTa8lQA3AVfluHwgk+iy4pCtGzy0f/25/HLpMMiKcvr/X9PYNHI9EJDfo4VJ372KtbW+gI2mrTfG1vY0JqG0dYnC1nxoVxp565jtVWqjnaV2FRBaulesjanWv58KoPbdpeq7vXX1nGC0N9Zu3zl1fEcBzhKRyu0JIi/Nj3CmiOpFGLntrQW4QTJp6wkoVwK5GmiPSHAbIftee+/QAk5ybTGsfYM57+TXke97lwuh6GXpvrel8dGgxuSsb9VGa/MhzQULbZ6eywpEz2ntrQCZvpzoMg7/62sjMQvlj0v31V8XwPVNm9kH3LI9kpXg9u0F5G4a4G3czGvpyd6LQ7hozHRz2ksh32qAC0KILGbT1uSYK72X+wM6X5FFwHx1XpcJR1MDgu8LcDjXfCSK2RaHCc3Ed/jBAgk6+b5IM3PL5vJd1geroOeKoaUNy5/k38oFm5N50PCsAYssIsyt4VsC1l5AsvbBzGe6CvQwyfGc6csNEKEVkHPkdGlDiQC7ccVhFuPkokih2YS50u1UANUxs9CsrR9WjuAlnjBr8398IL7Scxzz1PEd1eB5PrQ5ZUEjK9u2j6xx20dMcfEGVq191HsByMkA35Oe4/ngwODABXGgnia7oKGPoQ4ODA7scWAAfI9D4/ngwAVzYAD8ghdvDH1wYI8DA+B7HBrPBwcumAMD4Be8eGPogwN7HBgA3+PQeD44cMEcGAC/4MUbQx8c2OPAAPgeh8bzwYEL5sAA+AUv3hj64MAeBwbA9zg0ng8OXDAHBsAvePHG0AcH9jgwAL7HofF8cOCCOTAAfsGLN4Y+OLDHgQHwPQ6N54MDF8yBAfALXrwx9MGBPQ4MgO9xaDwfHLhgDgyAX/DijaEPDuxxYAB8j0Pj+eDABXNgAPyCF28MfXBgjwMD4HscGs8HBy6YAwPgF7x4Y+iDA3scGADf49B4PjhwwRwYAL/gxRtDHxzY48D/AbTWH0p48Qc9AAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.37 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.12 547 L 198.12 543.5 L 196.37 547 L 198.12 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305.03 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403.03 127 L 403.03 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 403px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="388.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417.03 137 L 417.03 288 C 420.93 288 420.93 294 417.03 294 L 417.03 294 L 417.03 328 C 420.93 328 420.93 334 417.03 334 L 417.03 334 L 417.03 408 C 420.93 408 420.93 414 417.03 414 L 417.03 414 L 417.03 418 C 420.93 418 420.93 424 417.03 424 L 417.03 424 L 417.03 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 237px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="405.5" y="231" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 279.5 257.6 C 279.5 252.85 290.69 249 304.5 249 C 311.13 249 317.49 249.91 322.18 251.52 C 326.87 253.13 329.5 255.32 329.5 257.6 L 329.5 304.4 C 329.5 309.15 318.31 313 304.5 313 C 290.69 313 279.5 309.15 279.5 304.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 329.5 257.6 C 329.5 262.35 318.31 266.2 304.5 266.2 C 290.69 266.2 279.5 262.35 279.5 257.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="262" y="313" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 322px; margin-left: 260px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="260" y="315.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550 127 L 580 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550 373 L 580 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60 209 L 29.49 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250 455 L 220 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250 455 L 220 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAABECAYAAAD3Lo2pAAAAAXNSR0IArs4c6QAAHhxJREFUeF7t3QXUNU1SH/Ba3N2Cu3uCu7s7y+KQhMXdgiUszuLunuAs7u6SBIK7uztB7o+9c5jTVPfM3Ofe+zzfO1XnPOf7zntnenqqerr/XfWv6vtFSWmgNFAaKA2UBkoDu9PA/Xb3xvXCpYHSQGmgNFAaKA1EAYAaBKWB0kBpoDRQGtihBgoA7NDo9cqlgdJAaaA0UBooAFBjoDRQGigNlAZKAzvUQAGAHRq9Xrk0UBooDZQGSgMFAGoMlAZKA6WB0kBpYIcaKACwQ6PXK5cGSgOlgdJAaaAAQI2B0kBpoDRQGigN7FADBQB2aPTklZ82In6ho4p3ioiPuZCavuDw3Psnbf/Z4ZmPdaFnVrPX08BnRMRbJI/7u4h4pOt1o550BzTwmxHxJEk/vjoiXv0O9G+XXSgAsEuz/7uXLgBQ4+ASGrgrAOARIuLpI+IZI+KxI+LRI+JRIgIQ+auI+POI+OWI+MWI+P1LKKLajAIAd3AQ3FcAwMtHxDds1J+P+2+OH7TB91MR8WMR8a0R8dsb27rXLy8AcK9b+Hbe7zYBgN3m60fEa0XE80TEw61Uwa8c55rPi4gfWnlPXbasgQIAyzq6+hX3MgAYKfMHI8Lk9PkR8fdX1/rde2ABgLtnk3uhR7cBAB4jIt43It7uDGGGb4mIt4yIX78XjHHL71AA4JYNkD1+rwBg0oUP+90i4n/dQdtcs0sFAK6p7f0869oA4Mkj4usj4lnOqOI/jIhXjIgfOWObe2yK/v5D8uLfeARZe9TJrb/z3gHAZIAvOZKV/vrWLXI7HSgAcDt6v9efek0A8GgR8X8i4qkvoNTfioj/FBG/e4G2q8nSwK1poADAv6n+hyPiZY6EoFszyC09uADALSn+Hn/sNQHAJ0TEAwf6/NuI+O4DJ+Anj7wgHCFEwKeMiBeMiGddsMVndTIa7nET1uvdyxq4FwDA90fEZzdGephjGtnjHt2BLxwRj7nCkN8VES99iCH+/xXX3kuXFAC4l6x5d97lWgDgUY+LugU9k0+KiP8WEX88UM0LRIRFXqZAJuaEpyk+wN0ZXNWTm2vgXgAAnxsRb7qgCoBAHO99IuL5F679kAMx8L1vrtr7VAsFAO5T5rrPdPZaAOA1I+LLO1r54oh4w5Uas2EQq36qzvXvEBEft7Ktuqw0cOc1sBcAMDfEux7YwR8aEQ/bsc4/RMSzH1KIfnaD9Z43Il4tIp4rIp7p6H0Qk5SG+CfHIjs/cPBGfGlE/N8N7baX8mJ4zoscJrxnO+xYkJ7kND/yMZ/5TyPi5w6FNf53RHxNRPCO/NOK540AQDvpcZliRvOUyK32np6LUCnF0i7q51c80yW9QkDak689iXd848Pk/ErH9378o5dGOqe4LxLnVx0AHtudKk980NfLRsRLHO3/eBFhQfjn487xj4624yXCDr8pM1ys2sL1fEf3s3fynv94HDNY07JVpL9+07Efa97toyNC8aZWvuPgAn/J2T++ySEd9q0PunvmWdEl6XI/OnjIlFr3KsdF8gmPdviNY1+/6KibqYlP7xC8zl0ICJH3wzv9Nk6/bY3ijte8TkIKNgaMNVlD77WhLR6DV4iIl4qIZ4gIY0qBK4Wu1Bv46UOK4tdFxEMOWQvG1xq5qX3fsVN8y7PNLeaNtfKxh2/j7TsXv+rxvaafz5UFYK5jU+Fam7kniAjfjk2eufbXjumbX3u0O9udKpew36l9uch9ewQAFCk/2M6gJ194KAryRis0zqvwYSvih/OmTEb/OSJ+aUX70yWPc1jI3+9AQvovEfGIG+4DYqRE9XZHU1MjAKCvn3b8wPTBBKiwSk+4Sh8cEe+5Anz0AADmtY+a2L19/GHnRQcjAax4gn5ig35caiHm8QEwHn7lvRbp/3m4/oOPk/jK2/71MguuMfPKG25SpVF8G/BYkg84gIX3Ty6il+c+/jt7vlVyTQ8AAMvvHBEfeASboz6Is9OlifhTjyCjvf7cAMDiDwRk8h8j4seXlDb73dhmV/1XHMif2gD6vFae7nAhO5hnLExL8pfHZ/pulp5zU/taMIGOTD5zIyOfjmxCWgFmMP7ngPymAIBdjFnz2RMtKfT4u+/Ghm8LqHHrJe23suvXuWyvAIB2lbe1u83EwLUjtBBlQm8m8d6ks2Q9H7zyl2t2JlKapMo86VKjg9/tyi3kPW7DCACYzC3UCqOsAUVTN+yW3DuSHgCw27Lb9PF+xIb3ple73LUpW28QESY9u4pTRA2Jtz301U53jdhdClmd8jw7GUCF92okvd2wKncmtjc7emmyNjIAYKx/zgpbzttjP7wbffmvyYPODQB6i6JHWzSEIq4lvmvjGi9hq/DY8RioTNiTm9qXd/B3jt6I9hm/d1y41+yajRXE6UxwLlpC5k0AAM+JksHImqcIjhhv1xpu16Xtd0r/L3bPngEAFzMEy+2aiRrmFs5M7LBMOjcRHzkX1s8MGjHw/9/RzXWTZ7nXbowHIZMRAHjtI/kJ4NkqDzhOhr37egDgV48T9zcfdp1bx+gfHImf/jsSi6md3jnkfxxJZqO2ABPv0ws9re3Hkk4VwMni1Cb3JzvuaHtgMgMAdHQKJ0YoARC7BgDg+WmJwJM+hSeEzHzrlxYAGcBbs+vv9cWi+qIDT8A57PvJg7kAGVLoaUkeNAiHWKiFPOdyKgDgsfi+wzxijrqJfMWhGqy5bARurmG/m7zD2e/dOrmevQMrGxyVAl5DAuw9ZhTDsjiZbFvBD+BOzT7yyTXMDWoB4kXQBo5AJuK7wgg96ZGoXM+t+T2HhVKOsh2VWLyYvDg54JCJWOS3Jz+MAMDbHF36W0IP0yO4T7Xd++hGAAB/Ap+C8MR875Fr8BTHCX1U2tUEp989Eev8ygG4sFNgQ2EaNvUOL7YQIniNIw8heybdaSs7DMX13g0/hC0BUjY0WWUidiw2yduRCU/PpyQ/qHmPuzEKfbUAQLjCjrEXGmFXfTcW6UwqnfjsBHKADjyBVs7tAUDaM9Z6YvwIXwAJ9HAJMVaBniwTQQoim/je9cWiJkbOHplugS6u7kvZF8DAZclkLQnaxiXLmDDOs8X6FABgfRKu4BXJxPgDDpR5dy0OVm+udT+P4kd12rqW/S4x9k5uc+8AwOLbi4ch02UDvLdoMYIPmkt5LiZDhBQgJhPP8KxWuIlN9hb2VsQWxaAz4Xq0uCHJtIKkl/37CACIf06saLHjTzwSJE10SHM8A4iBPbHzRUDLZKRL1yMw4h2I8c7jiXaweBomskws2mKT2ZkPuAVig720UK5GnpK26IuYpvfvxe4RkICTv0g6ZFz0wgS9UMnIQ6F/PDqZcHVmv9Hld86IgBYi48EYowvj0L1zkiruCKJiJhZ3dfZNwHNBdrPbAh56cm4A4Dn4EcDHSCz+ALDQG/DsXde4hRea/defAUaehlYQ/nwDGQ9BmIRXqA0JGetCf9kJneewr3mfR4RHqBWLKYLxSCyWCIyZfFCHg3IKAOCF7YVvtGf8tWEIQB0hODtN1KbCN5p5B69lvzVj6WrX7B0AmPhM3JkeTFI+zPnu1WKO4JItHhaMrNQlY47iZb3UoufsENpMWs+xMEIMfnG++ZGrFkXuUB+vHclcRgBguq4XS+XlMLllOz33CpeYFDJZAgB2QT03vZrvnms3nAm2Mw9PKyPXJaAmBkhXmfA64GPwpGQiPvuRyQ/atavPhD2yjBOkJ2Nqng0x3Q/g9RbmEdiY7lc0x25oRDjzXM/vET6BL4toJsAXz0HWd9dfAgBYtOzARwTVtq8qfzogjLsakPE+5oOtokpgj3cyAmue04vp4768e9KRc9lX+8ZAJoixgH9PRuCUFzIDLlsBgDkZyMg2Yb5P2TNsl8nrDjZIPEFt+Paa9ts6ti56/d4BAOVKOevtBrnq5mjRotPLKba49rwJwgV2H9kZ6HaV3Lat2F1L/2rFh7mm3KmdKvvaBfuzY+ulBC4BgKWsCKlA2WKr76PFagQAuHTtJkc7tFHsl4vzxRvlAXSAUWZvoMjkxY4j0ScTUxYCsqvKvCFii5knx0Q2IhDaHWYeG2mW+pHJ0gIhVe/+K2YVaYLIf5mot98DNNP1o0XiEgDAc4EiIY4tIGD+fr4PoBJg42FbmwrcS3fkDTKHtIB7/kzjgjemDbEZp3boLRg9l31lhPQW0B54nvoN7Fg0W7EbtzBnshUAGPfGfyZswws6EiAkC0VkG6hr2m/Fp3e9SwoAPDR22Cv84d8R0s4hvQ+Au5Qrq5UXOsZXs2dziyOerWHrrun7EgDw+yht0e6/VyddjDhzjerXCACMdv/TOwFkPDIZH4DrtXUD2rlze2fSs0N2rd1ij5HMIzGKR6+xx3RNTz8q2qlRkMlogbDwGtMWlyUR6unxKAAv3JuR4DsY85lcCgB4loUNeXfJS7b0/n63ANkxYuePBCCTYdGKcEPPWzS/tud+9i5tWuu57Ov5AE4GJEf9Bkp6NTBsBKTsZrIVAIxSOwE9G4uRALkIja0Aee/ShBSvab814+5q1xQAeCjLvhevXFr4thgKkBB/asUuP+MH2KXaGfTIbhbkLzvGHp1bvraQSNbnEQCwS8jQfttO7wNXex1xMpMRAPDM3g5l3ha3r1zvTOh7Pln99wG5aku6mEUBCMtkzeK4dtzYgduJtzJaQEcLhJ2tIj5rBHADQjNZC3J4SiYi57ydSwIAzzGvIVFK0QQ+bzLPAdmK76h/kRWaQrjtZZw4ZCzLgmh1CmxlnsUsE+lc9tWHXjYTrxuuDO9oK70sBPcAfTglmWwFACOQrW+9FO01Y3t+zbXtt7V/F73+Jh/GRTvWNH6pLACPwbwWx85EwQmu855Az693XCCRdsQ87Uq3pHr1AIBnjkhYbZ/keUvfQbjzN4rhtfeOAMASo35qSxw1K7PcI1O6rwcATLpco2tOZzTJskEmSFZzkhqCH/Z1JlnqUs/uo0JS8vRH1eJMOPprcbVLNZkBe1vc1qcCgB5HIXvP3ndhERRK6fEk5m0BqJl369IAYN4HhFHzh504gliPp7M0n/XCYMZ8m/K21Nba3+2m20p7IwCwxb76IOSVEZD9pkaGb6sV3gHVMltZCgttBQDSpLMU7bZK6Fpd9q67tv1u2t+z3l8A4KGLTK8wC6Y75mgrYvBQe4/Zv8VIIwBgB2tyOWXSkqYjtUxWwlLZ2hEAcIiKcMOS9FjYpwAAOyqx0zVikrTTy0T6ENLeJKNdLeLaUvx/ageru1fEqcfpMJkhNOJ7bFnss/c6FQC05VlH+hW/zngLI7Jr217vhL5rAoDs2+UaRswF+qSOjVJK5/dj4LecDWPM4ncJAaAUj5rLCABsse/UZs+Dlp2hoBqnDVGmLx6MUYrpFgCg/V5Zb7F9wOVccm37navfZ2ln7wBA3K5Xt16cNPMM2LlZVLLJ8RSjjACA9uRWK2XZ4yksPVO1OmlhGMU9MtI5DgOik5dLOnMKAFhLdPQ4O+736CjBTts5AZP0cpf9bnJbywAfZXVkkzaOBFJij7i3ZMP291MBQOsR6T0XwZFLN5sf8Bt6mRdtez3b3CYAaPsobZZngKdC3HhU7wKZFslzvjjZKSNWXkJwENpvagQA1tp33lfx8CxzxU57OnNjur5HDFWTwhgfeey2AADP7YUSnP0hQ+pccm37navfZ2ln7wBAqdoemSkjwtiJW0R6WQMmTQPUYMf6n5P0pJdl5UGXAABD80Q4yRApK8tvXTMYxNO5QZHjWrlrAKBXTCR7zxFZSBx4fg5CLya9FQBgOveqpQEc85CEb4wXp8eO9mwg1M7GRDrPerBTzTI+TgUAGaks0ykA0HPxb7GNhcUCswXArBnLl7oG4AeWR+c0cH+rpzDJKOXspv3E7WnDaiMAsNa+836J2/MQZlktbeEw+fWKaLWiTHjGVZlftwUAmGezGh7aG3GKTtH3te13Sh8vds/eAcAoPzurxtU7RIWB7PCke/WYz1tJgJnRhSqkB0rBMhFtLY/pA1ax7q4DAG7GtQd+jNjqdDU/QOdcIYBRNkHLmeAaFT/OxFgxAfViyOcmAXJ3y89fIwBsVtWu5xnL2lT9LktxvUsegLbfFkLerCz90rXIn8ikk/TSdf2uJHPvvJE1NsiuGQGALfadtw3Q8IK04ryU6WRJYwHxLguXtt9Zb6xnlTDxcmyO5iJdOgu9umYLAF2j42vbb02frnbNngGAnZVdV69ud1sTW1xKbDrbgSOsiNdnrNnJmL16A2s8AL0BASnbISh/Of0thSay09HumgfA7tOEI3yxJNKB2glkuodu7KIm6e1g/L6FBDjKkW/PBRiBzFGVRH3q9fdUD8CWBcJCn4GwLSRApW8znsw1AABX/tLJer2xpX5Er3olwDnnnIzCQUoPv/nSAN74+yUAQK989Dze7hvLUu969Qra19riAXAvAJDVTQFMl+a4LSq9tv229O3i1+4ZAIwmZjFoi+K8cI7Js3esaOv2bQ0nO0DudiY3AQBte8hldi6KsPTy1DOW+l0DAN5L6iB335IoXSoDI5M2XWiUvpcRvHrPHlVRQ9rCA5hEyEVmSCtinL3qidO1wklZCuU1AIAQRy9ssTYNEKkyO3jonABA+9J4pRv6m/5fWKWXxrg0pka57krTzo9SHlUTzYpRLT176fdLAAD8F+TO7FyCydZqKzhJshUpklmYp71uKwDojX3tsrkslXPIte13jj6frY29AoBR5TrK5fbi/prLiC06d5VlxhkdwXpOADA9WxoiZjL3VitSexBf5nIXAYBJxeQyEgu8cEE2jqcjhef3j9j7uAK9A3jaPvRqR+B8WNSnvHDu0h4xiiseqOzJ6ICbawCAXnU0/bWr7Z2+N70P8moPwJ0LAPDKsb8FLJPWA7R24hwV4eL+b2tA9MilwJ8x2mO0r+3P/LpLAADt9zZEeEdCOXb6GWBdyzvYCgAcKdyroYCsuUS8VIJZFkomdv3zAkvXtN8pNr/YPXsEABZ3J0L13t1AVX+6PTVM7Fy1uEx6B7q41iQl1aZXmUyMOluo3cvVZXGWreAPj2Bp4E/968WeH5Lkwt9FAGCRVd99VO1wBOQyvgOXooksC+PIkLDb6ZGPJr0qLKNyWyZtKdSR58fuWOphT0bcBgtKL5XwXAuECRSfIZPRmJ2uH/X/XADAs5B4kXkzMbFbzNdmd0xt8Oi16XfTb8I/SG9zQRzkQcpkTWqe4lFc3oAjz5A/8fasdPe57Nv21aKqLkcrYvRAjzmsFaTanvetvXYrAADGpTFnsqagVa/mh3AtUDYPL17Tfp1Xup1/3hMAsABjJS+dGNYrM4kkM2f/zi0m1Y3rMftgl85TzyrtWZC5D9s0RIsTILCmQA6gk+2gofkWWd9FAEC/DzzUA7ATyEQpXHW9e0WceoVMRtUAeQFM/D3QIZcfkbBX2bDNOsAvsVhnPBNjRUpZVntA6hcPzuhceX3JjgQ+1wKBX2LS7vVBqKlXVhnPRPncHkg5JwBYKuQijs1l3zv+dj62AEOnW/YWc7bEi2jDeaPDZLiy8XN6fJaet8H48G7tIUPnsm/7TclQAjxa4qcF0zzSHqDjfqFGxwevka0AQDjChif7vn2feBo9IM4euD/Z2M2Oj7+m/dbo6mrX3AsAQKW37MhIxof0xIss+tmpUq2iW4LP/HcV3HwgPZ0pq2lxmRYPz0YImyYT/57dC/kretNO5r3DLHgh7HhG55pD5XZpWQGh7CjhuwoATJpAQGtfNrU7yCoPshnXq4kjA0rsqGpiL5XT7k65UxPfXIwfrPxeXJy7W35yCwJHHAWHR0kZnGyJuGa8AKrT4tkbN8Z0VozonAtEr+obvdihymBoyXI8JA5rGRWvOicA0Jc1FTOBRex+9uAFMjbo2DhACDaWHA8+IphlxXGmMTIqXcsbZZffpuDiLMj1z3gSTibMjrs+p33b+a9XVVOZ8fbsCeNSmMoBWGtkKwDQptolAFkm5mK1GwDyuSBv4+BkwAG52EaQd7GVa9lvja6uds29AADOpSzFdgyo0elzvVOwpj44XMNCIFYmzjRPmXG4jVz+LI3GRDvFq6SEIeQ8IHE1Ts+xA8Ed4OL0/3Ym3NsGvedCxxn6RZyx2G85DjjjQ2Q6P6UQkHBGy0fQtowJY3NapC3Y0L7qdNz0QiajanpL/AFuWZNyb/wDYwCUyc2OSDzbxNK7Xr/s8rLT40aEQe/K1nYr7CeeCjhOog8ARVZgSd9UaWR/XgQLHDnnAmEBWto5IwtO5FichvkBLCbazEVsIl5bfW/N9w1A02F2EuOa+9dcA/B4l16BGuEqIaCMua59i6gxZywDGa6XzpuVDQd8jYVsoTqnfdv39l1wna8R32OWOti79xQAwAsACI1qaFi4eVmMKTobET/VDOkVDbuW/dbo9mrXFAB4qKrl9yO7LNU3P7VohEEqb99Cr1rXSKZCI2xjwujVrt86SLybhVMfWrktD4BdfEa8M0kq8ds7Ynj07sh1FuMl4tXouNotugWmjAvcikwwynlzRhXmsvssOFzp3NfA40jmZ5yfe4HogbQlHQHUYsTv2bkQQD3XaZYeYXEGQrPd9FJfl363eDtEaanmP++NePJNhE6QLHtHMZ/bvvO+AtUAKe7KkmzJmtHWKQDAfbwMwklr64L0+s27gefQOxLdfdew35Jer/r73gEAVyAX89LRknOjjE6wy4xnZyZeaucwIlZN984rjdl9IiQtnb2+NGi4s7ma53Xx5/fcFgDoEXUwdKH5EcEre2dFQgCs3tHE7T0mBOGF3q5tSa8mNZyRNk7b3mcRBzLXCg+I/Hm7Wm5iO8HRt3pJAMBjJdSQHa3aex/95T2QX/6gzkW9czbW6ii7jvfEmJGxcy5hA8S/3qE52ZiSMnfKeQ/AJH5Ob/H3rEsCAO37HpxCOBIhHAvyqO5Je/+pAEA7yLLCZTxxp4iMFYv7yLs7tWtOuKT9Tun/xe7ZKwBALpG6Z7CPYumZ4rmlZBEoBjLSHyTvQ1YJjIuYuHfJC9CWGvUMC4id1NbzAHyoYtr4CaMz4G8LACCRZeelT2WY7RK5ue3WlyZUcT82GZ3emNnTu3uGD3/tKY4mPlXeHrxhEhQDxjHJquvN+2W341peg0lG5x245pIAQPvqGHjXNUVteHUAXaGJEfDhtu8do3vTCY9r2omMxtYpoQa7RHZg4x4TfdRH7mT8ny3eO0WTxLxxFEZyaQAwSpWd+oWHlJ3yOOr3TQCAdpEU3/FYc2CNh8I9PFDmhF5Rp15/L2m/m47ts95/rwMAbmCLr4nGYLCzxK5ec878kqK5HE1w4u2qAE6sbO5rA87in8XwLAA+dGxz5COLjv7hDoj5AiVZvX7XKe7DjY/IYuEyifowAAtAxruKDWsLOYYbtiWz9RbB+YIzv+aSHIAep6I9etUOwMTHk+JAHbqW2iUrQmYG916vNv+SHaffuerF2i0abGs3Kb9cPJYLGLAQ4wVOAJcJ1K1t33XatBNhQzt7rHPti+HrP5IZUlgmdqHuNTkZQ8aIXan3t2Mx7sglFwhsadwUiwS+CWBAD55tvPGOzYtl8VxJ2crE2N9yZPUWPU/X0i+bCgkhccqgwSsRg5/KzeJ7+Eb0xffKY2cx3goks/7JDEIspC/cFQRUz0dABJDMSYAG8JrxR7I2L2lfzwO6LdYjEmcvU+qSAGBq25jjHUOCxXfyTSEomh/NCbyAviUhOd/GTcJMl7DfKeP4YvfcVwDAxRRQDZcGSgOlgdJAaWCPGigAsEer1zuXBkoDpYHSwO41UABg90OgFFAaKA2UBkoDe9RAAYA9Wr3euTRQGigNlAZ2r4ECALsfAqWA0kBpoDRQGtijBgoA7NHq9c6lgdJAaaA0sHsNFADY/RAoBZQGSgOlgdLAHjVQAGCPVq93Lg2UBkoDpYHda6AAwO6HQCmgNFAaKA2UBvaogQIAe7R6vXNpoDRQGigN7F4DBQB2PwRKAaWB0kBpoDSwRw0UANij1eudSwOlgdJAaWD3GigAsPshUAooDZQGSgOlgT1qoADAHq1e71waKA2UBkoDu9dAAYDdD4FSQGmgNFAaKA3sUQMFAPZo9Xrn0kBpoDRQGti9BgoA7H4IlAJKA6WB0kBpYI8aKACwR6vXO5cGSgOlgdLA7jVQAGD3Q6AUUBooDZQGSgN71EABgD1avd65NFAaKA2UBnavgQIAux8CpYDSQGmgNFAa2KMGCgDs0er1zqWB0kBpoDSwew0UANj9ECgFlAZKA6WB0sAeNVAAYI9Wr3cuDZQGSgOlgd1r4F8ABXXbn1coepcAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 497px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="491" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8300ee192ada3bf6e2aced24053e843c191c2ba9..a0fe69487b196fd0fefdb6aad9fb3d12bf70dcb6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -519,6 +519,22 @@ test-python-lib: junit: ./lib/python/coverage.xml coverage: '/TOTAL.*?([0-9]{1,3})%/' +test-storage-service-init: + image: docker.io/docker:${DOCKER_VERSION}-dind + stage: test + only: + - merge_requests + - master + variables: + PYTHONUNBUFFERED: 1 + before_script: + - "apk --no-cache add s3cmd bash libxml2-utils" + - "docker compose build dbrepo-storage-service-init" + - "mkdir -p /app/" + - "echo ${CI_S3_CONFIG} | base64 -d > /app/.s3cfg" + script: + - "bash ./dbrepo-storage-service/init/tests/test_integration_expire.sh" + test-ui: image: docker.io/docker:${DOCKER_VERSION}-dind stage: test diff --git a/dbrepo-analyse-service/Dockerfile b/dbrepo-analyse-service/Dockerfile index a140efd513760a68af887a2474591bc2f6fb20d3..26ea3ce65c2336bfd065e891c8d88ea47aaf73a3 100644 --- a/dbrepo-analyse-service/Dockerfile +++ b/dbrepo-analyse-service/Dockerfile @@ -1,8 +1,7 @@ FROM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" -RUN apk --no-cache \ - add \ +RUN apk --no-cache add \ bash \ curl \ openjdk8-jre diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index c43f7304c04408ec0ec87d895262cebcd84c3d33..ebab75e9e69f8cf4a017ba465f2ba01d139bf88d 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -180,20 +180,20 @@ }, "boto3": { "hashes": [ - "sha256:beea13db5a5f5eaacecfa905cd1e4e933c13802f776198264eef229d6dffcc42", - "sha256:c75d78013eb43b354662cbd5f30bf537ab06641d3ed37aaad6fcf55a529d2991" + "sha256:cf8997be0742a5cab9d33a138ef56e423a8ebd8881f6f73e95076b26656b36dc", + "sha256:dfee02b2f8f632a239a2f4ba6a2d568e2edd7f7464e9afd8a487fdb3fa9a0ad3" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.37.30" + "version": "==1.37.31" }, "botocore": { "hashes": [ - "sha256:2f43b61e0231abbb4fbe8917acb1af98cb83dbab8c264c0d1f5ca0f16fdbf219", - "sha256:d8ca899962d2079acd52483581f607322513910337a69bdae697766404b85b7d" + "sha256:598a33a7a0e5a014bd1416c999a0b9c634fbbba3d1363e2368e6a92da4544df4", + "sha256:eb3dfa44a87187bd82c3b493d568d8436270d4d000f237b49b669a01fcd8a21c" ], "markers": "python_version >= '3.8'", - "version": "==1.37.30" + "version": "==1.37.31" }, "certifi": { "hashes": [ @@ -425,7 +425,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7e21d72d0b3e766aeecb286b636ea7530fa971d95b1b083b7ef8b9512b8300ef" + "sha256:22484d712e4a240a0114b90b5e8eaacbe47aa8f7fc79200557150f081faf7669" ], "path": "./lib/dbrepo-1.8.1.tar.gz" }, @@ -860,101 +860,113 @@ }, "multidict": { "hashes": [ - "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", - "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", - "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d", - "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", - "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", - "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", - "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", - "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", - "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460", - "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", - "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191", - "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49", - "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", - "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", - "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", - "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", - "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", - "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90", - "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f", - "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", - "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", - "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de", - "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf", - "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", - "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", - "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349", - "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", - "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", - "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", - "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a", - "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e", - "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2", - "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", - "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", - "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", - "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", - "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", - "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", - "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", - "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", - "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", - "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", - "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", - "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27", - "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a", - "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872", - "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac", - "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a", - "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", - "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133", - "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", - "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", - "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", - "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", - "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", - "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", - "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", - "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", - "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", - "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", - "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", - "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", - "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2", - "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1", - "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", - "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb", - "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", - "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", - "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3", - "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", - "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", - "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a", - "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", - "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1", - "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", - "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", - "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a", - "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88", - "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656", - "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d", - "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", - "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", - "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", - "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", - "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", - "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2", - "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", - "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", - "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3", - "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", - "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", - "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87" + "sha256:033edcc22211463be927ca407dc5c5f3aa84d3d093ed2d559a2e3c2d995d50e4", + "sha256:03cd2a3c446162678d0a6d14d69ad38204128414ba40722a5ff6f2107782b723", + "sha256:05dcc73739ae8096f64f08282c8980dab2cf9acb02eb838aacd8ac56b795c405", + "sha256:11d76b83dc93e98207514e1938b89854655087e3b27a09d89525fe17a0f1ce11", + "sha256:1247de19497e13063eabf1df67e87530ac31497b91e9bd08621852a57d9b5ee7", + "sha256:147c962e8ae339d5fa84c52cc1e59546cb2d0d9359f9a8e1b8eb7b5ffac8dba0", + "sha256:159dae860e4d34bd4f48e72a0c033d78ae9215b43d423c19cbf47b7db5972599", + "sha256:15c14a01dd95e860703a4ce78d4b0d49f18c14389eb91b4aa12444e31dfc2841", + "sha256:15ddde4242134f1aeb1455ad60cc529e0a9f5eb251ae7be7fc37debdb257182c", + "sha256:1a894aed57c6edc514c9222989cf09eebd9ea7acb6185a26cfeac2ece2ddf265", + "sha256:1c11e8460ff0629871f9703c87208e553fbfa6c9d92f94c20d4f86e56f021029", + "sha256:1cd34caed981a95964218e03a3f267537a0b1a2fae078949e880f757df9efe55", + "sha256:1f62882c6d06e5e75b82444ce14f59b830f5b017b31630cc13d8b0b01379385a", + "sha256:20050a17cc2f322598d181a5b2e2cf4787e4c2e3bf71aab5e96618b40665e8ae", + "sha256:205da0f812c9128155bc1b7be69cf89280a5bb2f5b84426bced76e7d860ed5dc", + "sha256:258414850b59fb820bd1e1e19a9b281409a6d0bd969d3fe7104cc87a7c08c191", + "sha256:27d45a6a8495f2cfcf64d6cc4fbcc78a6e87ed840e54a261430d0d4331d9aae0", + "sha256:285058a0cdd284ba5bbc1d10d75fb33e3b3087b15d5aa9d23fc4787dd3a48384", + "sha256:2e116fad10aa7c74aa3acc69adcdffe86f1415abb111653f85dd37171116b57d", + "sha256:38e165c4d79ac98cabb5c08d8a3a3e1dda3206bcec19ed072992b62b200b180d", + "sha256:3af088483bf2aba7f2886437d856a6ba4cd0c17946dd615cbe55d56552eaf187", + "sha256:3d17d8b2d4643d4f59629758b0dd229cda61e2319f81b470aa4a99717081ba0c", + "sha256:3e80621ebc9f045fab847a970b2430146f9121b95c3c695b044ade8488753126", + "sha256:4030f5319aacf20e924c5218377df446507b314f03676549891e12a9f832a9f1", + "sha256:44ee27fb416c3d8981b7c3c97b9813d40b06575f6d477f4da21726a30aabb562", + "sha256:458b235ae7af880e18c1476f968ef571689a574720eb9e6e8873d138fbba9c58", + "sha256:4660b75286c11b8f38c90b98ccf7541b7030dbec32b28f05031f8abebf7fc0e5", + "sha256:4748c017fa201e6a296c9ef75dc3668a01532adb8f5c27a0bef4835dfa62f8e7", + "sha256:48f775443154d99e1b1c727ea20137ddc1e4b29448a9b24875b2a348cc143b85", + "sha256:49e01d212be64ceee18a45e8baef441aa86cc9bd365fb92fb8b214e5fa5bc08b", + "sha256:4a0ba21b315113d39f7aa3ca4eb804f7984dab33c42ea14d07d790a640f81e77", + "sha256:4aca2ab0969dc3781fefe523ce70c5d245b915ba0708ce2713e8ac561f9448e0", + "sha256:5055e039ebfc6e4589115717c4a6d1dd2f195327b8d5a3e21a68f374d79dbed9", + "sha256:52bd2b6681beb34115eebbcbdcbd170ebc3fc98c4eb0dd789f2c01d4d6b189c0", + "sha256:54a291428e25f775193704f95a94f21a42a28ffb09c1bdc91e152c6b1faf4a91", + "sha256:58f74a195b99189c9f7e2bc83cc95fcf169a43a63c5c8cad63c4027bf3233118", + "sha256:614021ba98b8052d4eb3d5900d3bd953421edf41b2aa85d37c1dc67bcee1ea9d", + "sha256:64fccd2fa3cfd49c442c4995d58189e578560705b9b632faad8ffd9aaa390007", + "sha256:64fdd7a4aef8f14e4a6917a434d0a4766345f5d544d0c0c0e53b14eb1e4be0ac", + "sha256:693858c9584cedc1685e67e78fa9e50285504e8d4bbfde7290ca04dbbac939a8", + "sha256:6d168a6693c1b9b950d9584178d12095bfbaf290748eb6e2726c914bc1d0d4f1", + "sha256:6da367181104a57e77140ebf736652ed9a97c7bcb77c7640cf8a168893561bd2", + "sha256:6ed731286f0ae399e65e3172c5808732b9ae5d896b3ab7f692eb686bba6bc9df", + "sha256:70d695f62a55f90ee894fdf1ede51ccdda3abbe25b43b667b51747b6f61b8da7", + "sha256:71dae164819f8aede109a596db84d508e670d7e0a968901aaf22445e87ae7519", + "sha256:75bb804375e0b6c5db4e474fa0b5052414b6cbc3e70394d11a7ce9a7f6a18a91", + "sha256:796d1b070211554cc8193bd6764d2b44594ff7c7522989012eacf3fde778e5cf", + "sha256:79dc3f9893e32fcc564c60bb34c4e393daede2cdf0337a5b4627ed162a237fb3", + "sha256:7a3165a5bae6577d10858c35f6add83333ead621e8286a5d15f7d567ef44be78", + "sha256:7a74764881276904564f8725da3dd2b82924838a114738933f58b75082b55dd3", + "sha256:7cbc2e5116cdca0594bb39c64a8bd5e7f44d392cf76d19913216924688d42954", + "sha256:8223f74cf698f7992e1a71ab90ab4c169b508a0f25083ebab9259b9f33d7bdde", + "sha256:824b60427c92c44098cfbd58d8adf8a8c5a60ade16742dcb54385b43e6337b4e", + "sha256:8257f26cc2cc5d0426da488162060c6cea57079172b9d3eedf016fcb0cfdb830", + "sha256:8530ca574ba38478e97af20ff0f3fd04f59ffcad435b1548703424d71e2ed66a", + "sha256:858b68e475f8e73e4014c078e9feced502273032f07840117ca12d2230d27135", + "sha256:88ae724e79a524d1921b2799251f667e7fb0344a59637df3bec91dc303020467", + "sha256:8ce52f84e793ee83082c4aa127605070a47c31597821ca84dec5c0ac809e8509", + "sha256:93de2d3802a5ac7d5deadba1c956a93db29502f1b9f4e8d2e393747b9b28d881", + "sha256:93f4545347f79121e9ba98a0c33a55f469ebc22fb45ae62692e01d367219796b", + "sha256:9777e194be00313f5a86a0dd52d9987b72cf6c43c8a42d6bd838adc46c70e98b", + "sha256:99b2401166c3b2d997b80479cdc7449a093e21f3d4b2f9c6e6ceee956aa10d63", + "sha256:99f9b6596d2e126fa1777990868743fb4c1984ea5217606fabc153aff46160e6", + "sha256:9b4cd51b623b3dc8b55f9caef07424ac6d684b8047e601aca7053999e1b4a527", + "sha256:9f1edbf7e0d22a1ebf3c24ffaf0b8a39888bd630d6ff38c77c169272a3d4b9cc", + "sha256:a3da262f5b9f0dd01277575de4967683123ab47699fd7db2ce38cb1bb8f5c76f", + "sha256:aa613b270de6215f9fc850f0fb18dbc20ba297013012793cf3d2f1295e271e91", + "sha256:ac87e173c5f3aeac06d01eeebfb35c2b1bc5f536b21210dd8b032f1dc0726fbc", + "sha256:ad333e0b0d19294d3fc81d7aa9b65c45ebf49e6f8b3fab02db43284140d2b0a8", + "sha256:af55e557e722c962f70cdc6a482d0df44b1f6622af49003e33dd114340724875", + "sha256:b019f5c53471e8a010edf2fec321ece25ac6b079b535980b7228dcb9ee62d621", + "sha256:b0441ee8b9edc3fadb5cd9f181212edd72f7b016723bc549f9c1c00a9a8e6f93", + "sha256:b29a79f1e4313c397e00d89d4d83ff54fd377e7d654b640bbe9002b4272f205e", + "sha256:b622146bcfc6749944d14e8a61267dbea1bee96a9c7ca7605683506ed3817844", + "sha256:b8a87a3686de1d215506ba13dd388433695bfff534839e045419ba2f36437c0e", + "sha256:b9c5dfa5c7cdc26f6b777ac6210d3621d556e2e244f0a7358afe8ec0135f8640", + "sha256:b9d3d5de87a88768be67b7ec20aeb531707174ba0645697a938df3afc2c62b1f", + "sha256:bbd3cc064d272618b95c2f85ec61fe9d07e2a1de18c153c10923d3c2cdebff4c", + "sha256:bcd21a1b5cfb45170280e5fcd382c25519d75bdf4634656868b91c05d5e15b23", + "sha256:bdb621264758b22ae3aaa9d60937751069d80d610d713887ff94cf7487fc3f5f", + "sha256:c5fdcac25ae451af93e7f997678ed2282bf6b5ef892e253eea13bba59849f00e", + "sha256:c785581071f140d364821c210422ab5937d6c2c51d92e45a552a8e34b434a5a3", + "sha256:cbd06fb147030d7781f10bd7542f29bbf56cefb51a9f042713d5fc52e68b8afd", + "sha256:cf95ac57b44b6fb46a0151641b9905bbad27783314abc4f4b0b0a82f26b06b07", + "sha256:d6698fccb2f962021e467be6ba43fc02f7341f221e80545810303f5cc66461bb", + "sha256:d7533a9684e599b22a4beb699647dc3269d551e455886be8125f14f3c5a0869f", + "sha256:d7bf1d52c69f3051a0ebae9cca1e5be06e2ad4677d670a920454ecf6d20e2c8e", + "sha256:d8f47485264b1168ef852dd6bea619703409ff2cbc5e610dcb0f15fe3c6750bb", + "sha256:d8fc8c7c092a48044bf942735eea6da198cac0c655d7a06550619b2a7fec2ffd", + "sha256:d9e984f9542fba175bc4d98e320e9e2bd6e7480682aa84b274e9aee7fb6575b9", + "sha256:dc86a31e3215ce037ae306a338ff2156d897aae627d5d4e3dfa0c9eded4249e8", + "sha256:dd5240bea7d8de32e7ac95088b2ad95b89993a3825d9278d363d73ca40113cb3", + "sha256:df46fd268c765d186df8c7899bc4e0a2ee0d12458d356438af0329a49e6b15ca", + "sha256:dfb3870c5d4f5413988caf64243830f7ca13dc58ae2cf3eb48fe321ca6f26648", + "sha256:e36cfe9df4dfb6c2f4d80d20852ab6449257a01942e4808c3912ed413a4d40f7", + "sha256:e5ca936b70414dbee02f218be1d36a535a5953ba63fd82dc812135ca3f5a525f", + "sha256:e7ab7ea72c3f66ae1e930ae776ad2c6f4f78e0184781f64f196f17ecce113101", + "sha256:e80878904057edfd1d70ba31258f974d36c470fd95de2bcd98e0494942c4433e", + "sha256:ed8d6bd6f3c7991083e741fd55cecea70d670971c73b9563a673eab96e5356b4", + "sha256:f290e4eebf7764f8327a4bc6a459f09ca9a041cf7349bacfbb252da9feb0d37c", + "sha256:f915fc3287ddc23a5da8f61f5c2c3aaca0b754ce526c0ff81f55c27b25038cd5", + "sha256:fb8b1cba597398698ec494794091dadd76eb8011bb95f43578930466e7beb20b", + "sha256:fbd035ae06babb07c6b80535b0d4f6fe57eb73a23ae276eb4502b1f67f19e8ef", + "sha256:fd9521b70b50aac341f59799301ba24acbe2897b9157035d139668b6c43bc406" ], "markers": "python_version >= '3.9'", - "version": "==6.2.0" + "version": "==6.4.2" }, "numpy": { "hashes": [ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl index f77eea076ca6a24674d220d3f54624b5f9a09202..261fa7958ae481d4d85bc5efc152e519fa6af802 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz index 7065ba14b7eadea39293894488821e3f38e0ef35..0da3ea37a31f2f3cdeea212e768aab7793f29252 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz and b/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz differ diff --git a/dbrepo-auth-service/init/tests/test_unit_app.py b/dbrepo-auth-service/init/tests/test_unit_app.py index fc454cfa3ef1a358f1ce3a41c82e3f2c5d53a167..b2b530964e462f25b804cff3901a732fc7121a82 100644 --- a/dbrepo-auth-service/init/tests/test_unit_app.py +++ b/dbrepo-auth-service/init/tests/test_unit_app.py @@ -1,8 +1,9 @@ +import os import unittest import requests_mock -from app import endpoint, fetch +from app import fetch class AppUnitTest(unittest.TestCase): @@ -17,10 +18,14 @@ class AppUnitTest(unittest.TestCase): "scope": "profile email" } + def endpoint(self): + return os.getenv('AUTH_SERVICE_ENDPOINT', 'http://localhost:8080') + def test_fetch_token_bad_request_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=400) + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=400) # test try: fetch('admin') @@ -30,7 +35,8 @@ class AppUnitTest(unittest.TestCase): def test_fetch_token_unauthorized_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=401) + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=401) # test try: fetch('admin') @@ -40,8 +46,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_not_found_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[], status_code=200) + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[], status_code=200) # test try: @@ -52,8 +59,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_too_much_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{}, {}], status_code=200) + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{}, {}], status_code=200) # test try: @@ -64,8 +72,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_not_ok_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{}], status_code=202) + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{}], status_code=202) # test try: @@ -76,8 +85,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_no_attrs_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{ + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{ "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20" }], status_code=200) @@ -90,8 +100,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_empty_attrs_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{ + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{ "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20", "attributes": {} }], status_code=200) @@ -105,8 +116,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_user_malformed_attr_fails(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{ + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{ "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20", "attributes": { "LDAP_ID": [] @@ -122,8 +134,9 @@ class AppUnitTest(unittest.TestCase): def test_fetch_succeeds(self): with requests_mock.Mocker() as mock: # mock - mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200) - mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{ + mock.post(f'{self.endpoint()}/realms/master/protocol/openid-connect/token', json=self.token_res, + status_code=200) + mock.get(f'{self.endpoint()}/admin/realms/dbrepo/users/?username=admin', json=[{ "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20", "attributes": { "LDAP_ID": ["7a0b4b7f-77cd-4f28-a665-2da443024621"] diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar index 4c541f2eb5bd4606250425f72aa7971a40164662..0b0771d3657d44c05fe9fe8fc62f2c7aef23c85b 100644 Binary files a/dbrepo-auth-service/listeners/target/create-event-listener.jar and b/dbrepo-auth-service/listeners/target/create-event-listener.jar differ diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock index acef9a8483c91f82626ee5c619a51472d038cfc2..211dd025b06e021c9aa540c64b2adfa3a51b2693 100644 --- a/dbrepo-dashboard-service/Pipfile.lock +++ b/dbrepo-dashboard-service/Pipfile.lock @@ -373,7 +373,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7e21d72d0b3e766aeecb286b636ea7530fa971d95b1b083b7ef8b9512b8300ef" + "sha256:22484d712e4a240a0114b90b5e8eaacbe47aa8f7fc79200557150f081faf7669" ], "path": "./lib/dbrepo-1.8.1.tar.gz" }, @@ -777,101 +777,113 @@ }, "multidict": { "hashes": [ - "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", - "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", - "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d", - "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", - "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", - "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", - "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", - "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", - "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460", - "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", - "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191", - "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49", - "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", - "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", - "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", - "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", - "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", - "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90", - "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f", - "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", - "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", - "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de", - "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf", - "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", - "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", - "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349", - "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", - "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", - "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", - "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a", - "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e", - "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2", - "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", - "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", - "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", - "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", - "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", - "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", - "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", - "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", - "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", - "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", - "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", - "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27", - "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a", - "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872", - "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac", - "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a", - "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", - "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133", - "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", - "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", - "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", - "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", - "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", - "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", - "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", - "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", - "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", - "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", - "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", - "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", - "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2", - "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1", - "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", - "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb", - "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", - "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", - "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3", - "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", - "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", - "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a", - "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", - "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1", - "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", - "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", - "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a", - "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88", - "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656", - "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d", - "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", - "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", - "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", - "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", - "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", - "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2", - "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", - "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", - "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3", - "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", - "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", - "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87" + "sha256:033edcc22211463be927ca407dc5c5f3aa84d3d093ed2d559a2e3c2d995d50e4", + "sha256:03cd2a3c446162678d0a6d14d69ad38204128414ba40722a5ff6f2107782b723", + "sha256:05dcc73739ae8096f64f08282c8980dab2cf9acb02eb838aacd8ac56b795c405", + "sha256:11d76b83dc93e98207514e1938b89854655087e3b27a09d89525fe17a0f1ce11", + "sha256:1247de19497e13063eabf1df67e87530ac31497b91e9bd08621852a57d9b5ee7", + "sha256:147c962e8ae339d5fa84c52cc1e59546cb2d0d9359f9a8e1b8eb7b5ffac8dba0", + "sha256:159dae860e4d34bd4f48e72a0c033d78ae9215b43d423c19cbf47b7db5972599", + "sha256:15c14a01dd95e860703a4ce78d4b0d49f18c14389eb91b4aa12444e31dfc2841", + "sha256:15ddde4242134f1aeb1455ad60cc529e0a9f5eb251ae7be7fc37debdb257182c", + "sha256:1a894aed57c6edc514c9222989cf09eebd9ea7acb6185a26cfeac2ece2ddf265", + "sha256:1c11e8460ff0629871f9703c87208e553fbfa6c9d92f94c20d4f86e56f021029", + "sha256:1cd34caed981a95964218e03a3f267537a0b1a2fae078949e880f757df9efe55", + "sha256:1f62882c6d06e5e75b82444ce14f59b830f5b017b31630cc13d8b0b01379385a", + "sha256:20050a17cc2f322598d181a5b2e2cf4787e4c2e3bf71aab5e96618b40665e8ae", + "sha256:205da0f812c9128155bc1b7be69cf89280a5bb2f5b84426bced76e7d860ed5dc", + "sha256:258414850b59fb820bd1e1e19a9b281409a6d0bd969d3fe7104cc87a7c08c191", + "sha256:27d45a6a8495f2cfcf64d6cc4fbcc78a6e87ed840e54a261430d0d4331d9aae0", + "sha256:285058a0cdd284ba5bbc1d10d75fb33e3b3087b15d5aa9d23fc4787dd3a48384", + "sha256:2e116fad10aa7c74aa3acc69adcdffe86f1415abb111653f85dd37171116b57d", + "sha256:38e165c4d79ac98cabb5c08d8a3a3e1dda3206bcec19ed072992b62b200b180d", + "sha256:3af088483bf2aba7f2886437d856a6ba4cd0c17946dd615cbe55d56552eaf187", + "sha256:3d17d8b2d4643d4f59629758b0dd229cda61e2319f81b470aa4a99717081ba0c", + "sha256:3e80621ebc9f045fab847a970b2430146f9121b95c3c695b044ade8488753126", + "sha256:4030f5319aacf20e924c5218377df446507b314f03676549891e12a9f832a9f1", + "sha256:44ee27fb416c3d8981b7c3c97b9813d40b06575f6d477f4da21726a30aabb562", + "sha256:458b235ae7af880e18c1476f968ef571689a574720eb9e6e8873d138fbba9c58", + "sha256:4660b75286c11b8f38c90b98ccf7541b7030dbec32b28f05031f8abebf7fc0e5", + "sha256:4748c017fa201e6a296c9ef75dc3668a01532adb8f5c27a0bef4835dfa62f8e7", + "sha256:48f775443154d99e1b1c727ea20137ddc1e4b29448a9b24875b2a348cc143b85", + "sha256:49e01d212be64ceee18a45e8baef441aa86cc9bd365fb92fb8b214e5fa5bc08b", + "sha256:4a0ba21b315113d39f7aa3ca4eb804f7984dab33c42ea14d07d790a640f81e77", + "sha256:4aca2ab0969dc3781fefe523ce70c5d245b915ba0708ce2713e8ac561f9448e0", + "sha256:5055e039ebfc6e4589115717c4a6d1dd2f195327b8d5a3e21a68f374d79dbed9", + "sha256:52bd2b6681beb34115eebbcbdcbd170ebc3fc98c4eb0dd789f2c01d4d6b189c0", + "sha256:54a291428e25f775193704f95a94f21a42a28ffb09c1bdc91e152c6b1faf4a91", + "sha256:58f74a195b99189c9f7e2bc83cc95fcf169a43a63c5c8cad63c4027bf3233118", + "sha256:614021ba98b8052d4eb3d5900d3bd953421edf41b2aa85d37c1dc67bcee1ea9d", + "sha256:64fccd2fa3cfd49c442c4995d58189e578560705b9b632faad8ffd9aaa390007", + "sha256:64fdd7a4aef8f14e4a6917a434d0a4766345f5d544d0c0c0e53b14eb1e4be0ac", + "sha256:693858c9584cedc1685e67e78fa9e50285504e8d4bbfde7290ca04dbbac939a8", + "sha256:6d168a6693c1b9b950d9584178d12095bfbaf290748eb6e2726c914bc1d0d4f1", + "sha256:6da367181104a57e77140ebf736652ed9a97c7bcb77c7640cf8a168893561bd2", + "sha256:6ed731286f0ae399e65e3172c5808732b9ae5d896b3ab7f692eb686bba6bc9df", + "sha256:70d695f62a55f90ee894fdf1ede51ccdda3abbe25b43b667b51747b6f61b8da7", + "sha256:71dae164819f8aede109a596db84d508e670d7e0a968901aaf22445e87ae7519", + "sha256:75bb804375e0b6c5db4e474fa0b5052414b6cbc3e70394d11a7ce9a7f6a18a91", + "sha256:796d1b070211554cc8193bd6764d2b44594ff7c7522989012eacf3fde778e5cf", + "sha256:79dc3f9893e32fcc564c60bb34c4e393daede2cdf0337a5b4627ed162a237fb3", + "sha256:7a3165a5bae6577d10858c35f6add83333ead621e8286a5d15f7d567ef44be78", + "sha256:7a74764881276904564f8725da3dd2b82924838a114738933f58b75082b55dd3", + "sha256:7cbc2e5116cdca0594bb39c64a8bd5e7f44d392cf76d19913216924688d42954", + "sha256:8223f74cf698f7992e1a71ab90ab4c169b508a0f25083ebab9259b9f33d7bdde", + "sha256:824b60427c92c44098cfbd58d8adf8a8c5a60ade16742dcb54385b43e6337b4e", + "sha256:8257f26cc2cc5d0426da488162060c6cea57079172b9d3eedf016fcb0cfdb830", + "sha256:8530ca574ba38478e97af20ff0f3fd04f59ffcad435b1548703424d71e2ed66a", + "sha256:858b68e475f8e73e4014c078e9feced502273032f07840117ca12d2230d27135", + "sha256:88ae724e79a524d1921b2799251f667e7fb0344a59637df3bec91dc303020467", + "sha256:8ce52f84e793ee83082c4aa127605070a47c31597821ca84dec5c0ac809e8509", + "sha256:93de2d3802a5ac7d5deadba1c956a93db29502f1b9f4e8d2e393747b9b28d881", + "sha256:93f4545347f79121e9ba98a0c33a55f469ebc22fb45ae62692e01d367219796b", + "sha256:9777e194be00313f5a86a0dd52d9987b72cf6c43c8a42d6bd838adc46c70e98b", + "sha256:99b2401166c3b2d997b80479cdc7449a093e21f3d4b2f9c6e6ceee956aa10d63", + "sha256:99f9b6596d2e126fa1777990868743fb4c1984ea5217606fabc153aff46160e6", + "sha256:9b4cd51b623b3dc8b55f9caef07424ac6d684b8047e601aca7053999e1b4a527", + "sha256:9f1edbf7e0d22a1ebf3c24ffaf0b8a39888bd630d6ff38c77c169272a3d4b9cc", + "sha256:a3da262f5b9f0dd01277575de4967683123ab47699fd7db2ce38cb1bb8f5c76f", + "sha256:aa613b270de6215f9fc850f0fb18dbc20ba297013012793cf3d2f1295e271e91", + "sha256:ac87e173c5f3aeac06d01eeebfb35c2b1bc5f536b21210dd8b032f1dc0726fbc", + "sha256:ad333e0b0d19294d3fc81d7aa9b65c45ebf49e6f8b3fab02db43284140d2b0a8", + "sha256:af55e557e722c962f70cdc6a482d0df44b1f6622af49003e33dd114340724875", + "sha256:b019f5c53471e8a010edf2fec321ece25ac6b079b535980b7228dcb9ee62d621", + "sha256:b0441ee8b9edc3fadb5cd9f181212edd72f7b016723bc549f9c1c00a9a8e6f93", + "sha256:b29a79f1e4313c397e00d89d4d83ff54fd377e7d654b640bbe9002b4272f205e", + "sha256:b622146bcfc6749944d14e8a61267dbea1bee96a9c7ca7605683506ed3817844", + "sha256:b8a87a3686de1d215506ba13dd388433695bfff534839e045419ba2f36437c0e", + "sha256:b9c5dfa5c7cdc26f6b777ac6210d3621d556e2e244f0a7358afe8ec0135f8640", + "sha256:b9d3d5de87a88768be67b7ec20aeb531707174ba0645697a938df3afc2c62b1f", + "sha256:bbd3cc064d272618b95c2f85ec61fe9d07e2a1de18c153c10923d3c2cdebff4c", + "sha256:bcd21a1b5cfb45170280e5fcd382c25519d75bdf4634656868b91c05d5e15b23", + "sha256:bdb621264758b22ae3aaa9d60937751069d80d610d713887ff94cf7487fc3f5f", + "sha256:c5fdcac25ae451af93e7f997678ed2282bf6b5ef892e253eea13bba59849f00e", + "sha256:c785581071f140d364821c210422ab5937d6c2c51d92e45a552a8e34b434a5a3", + "sha256:cbd06fb147030d7781f10bd7542f29bbf56cefb51a9f042713d5fc52e68b8afd", + "sha256:cf95ac57b44b6fb46a0151641b9905bbad27783314abc4f4b0b0a82f26b06b07", + "sha256:d6698fccb2f962021e467be6ba43fc02f7341f221e80545810303f5cc66461bb", + "sha256:d7533a9684e599b22a4beb699647dc3269d551e455886be8125f14f3c5a0869f", + "sha256:d7bf1d52c69f3051a0ebae9cca1e5be06e2ad4677d670a920454ecf6d20e2c8e", + "sha256:d8f47485264b1168ef852dd6bea619703409ff2cbc5e610dcb0f15fe3c6750bb", + "sha256:d8fc8c7c092a48044bf942735eea6da198cac0c655d7a06550619b2a7fec2ffd", + "sha256:d9e984f9542fba175bc4d98e320e9e2bd6e7480682aa84b274e9aee7fb6575b9", + "sha256:dc86a31e3215ce037ae306a338ff2156d897aae627d5d4e3dfa0c9eded4249e8", + "sha256:dd5240bea7d8de32e7ac95088b2ad95b89993a3825d9278d363d73ca40113cb3", + "sha256:df46fd268c765d186df8c7899bc4e0a2ee0d12458d356438af0329a49e6b15ca", + "sha256:dfb3870c5d4f5413988caf64243830f7ca13dc58ae2cf3eb48fe321ca6f26648", + "sha256:e36cfe9df4dfb6c2f4d80d20852ab6449257a01942e4808c3912ed413a4d40f7", + "sha256:e5ca936b70414dbee02f218be1d36a535a5953ba63fd82dc812135ca3f5a525f", + "sha256:e7ab7ea72c3f66ae1e930ae776ad2c6f4f78e0184781f64f196f17ecce113101", + "sha256:e80878904057edfd1d70ba31258f974d36c470fd95de2bcd98e0494942c4433e", + "sha256:ed8d6bd6f3c7991083e741fd55cecea70d670971c73b9563a673eab96e5356b4", + "sha256:f290e4eebf7764f8327a4bc6a459f09ca9a041cf7349bacfbb252da9feb0d37c", + "sha256:f915fc3287ddc23a5da8f61f5c2c3aaca0b754ce526c0ff81f55c27b25038cd5", + "sha256:fb8b1cba597398698ec494794091dadd76eb8011bb95f43578930466e7beb20b", + "sha256:fbd035ae06babb07c6b80535b0d4f6fe57eb73a23ae276eb4502b1f67f19e8ef", + "sha256:fd9521b70b50aac341f59799301ba24acbe2897b9157035d139668b6c43bc406" ], "markers": "python_version >= '3.9'", - "version": "==6.2.0" + "version": "==6.4.2" }, "niquests": { "hashes": [ @@ -1651,11 +1663,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:3adfa22c5718caee5ca69bc7f7461dc529f4396494d4d9b1db8af7c56cd3ac34", - "sha256:9cd79ce61da77b5d56681bc126f42955c2153e9c0da2f0a62bca8e0a05641f92" + "sha256:1a31156dc1f87d13483272cd7fe381664ded124b3b5e3d65385c23a309a1584e", + "sha256:60d1c48846c7fd5dbddfae38196fd1c43ffc83fb987ba477361254b93913ccbc" ], "markers": "python_version >= '3.7'", - "version": "==2.12.915" + "version": "==2.12.916" }, "verlib2": { "hashes": [ diff --git a/dbrepo-dashboard-service/app.py b/dbrepo-dashboard-service/app.py index 21916f758242acf55e0622bbbe859f7c1c92aafb..fafca139f43f7763a3757a4a33c24c31a3456c0c 100644 --- a/dbrepo-dashboard-service/app.py +++ b/dbrepo-dashboard-service/app.py @@ -154,8 +154,9 @@ headers = {'Content-Type': 'application/json'} def dashboard_client(): - return DashboardServiceClient(os.getenv('DASHBOARD_UI_ENDPOINT', 'http://localhost:3000'), - os.getenv('SYSTEM_USERNAME', 'admin'), os.getenv('SYSTEM_PASSWORD', 'admin')) + return DashboardServiceClient(endpoint=os.getenv('DASHBOARD_UI_ENDPOINT', 'http://localhost:3000'), + username=os.getenv('SYSTEM_USERNAME', 'admin'), + password=os.getenv('SYSTEM_PASSWORD', 'admin')) def auth_client(): @@ -201,13 +202,14 @@ def create_dashboard(): is_public = bool(request.json['is_public']) is_schema_public = bool(request.json['is_schema_public']) owner_username = request.json['owner_username'] - logging.debug( - f"endpoint create dashboard, is_public={is_public}, is_schema_public={is_schema_public}, owner_username={owner_username}") + logging.debug(f"endpoint create dashboard, is_public={is_public}, is_schema_public={is_schema_public}, " + f"owner_username={owner_username}") try: db = dashboard_client().create(request.json['database_name']) dashboard_client().update_anonymous_read_access(db['uid'], is_public, is_schema_public) return Response(dumps(db)), 201, headers except GrafanaClientError as e: + logging.error(f"Failed to create dashboard: {e.response['message']}") dto = ApiError(status=HTTPStatus(e.status_code).phrase.upper(), message=f"Failed to create dashboard: {e.response['message']}", code="error.dashboard.create") if e.status_code == 409 or e.status_code == 412: diff --git a/dbrepo-dashboard-service/init/Pipfile.lock b/dbrepo-dashboard-service/init/Pipfile.lock index c6b2da7b4079bcf9759202b9925fb7c8aa31cd9e..4769507d32af65c823f66f0158ebb5ac7e855e42 100644 --- a/dbrepo-dashboard-service/init/Pipfile.lock +++ b/dbrepo-dashboard-service/init/Pipfile.lock @@ -259,7 +259,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7e21d72d0b3e766aeecb286b636ea7530fa971d95b1b083b7ef8b9512b8300ef" + "sha256:22484d712e4a240a0114b90b5e8eaacbe47aa8f7fc79200557150f081faf7669" ], "path": "./lib/dbrepo-1.8.1.tar.gz" }, @@ -655,101 +655,113 @@ }, "multidict": { "hashes": [ - "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", - "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", - "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d", - "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", - "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", - "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", - "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", - "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", - "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460", - "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", - "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191", - "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49", - "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", - "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", - "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", - "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", - "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", - "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90", - "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f", - "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", - "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", - "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de", - "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf", - "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", - "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", - "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349", - "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", - "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", - "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", - "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a", - "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e", - "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2", - "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", - "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", - "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", - "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", - "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", - "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", - "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", - "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", - "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", - "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", - "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", - "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27", - "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a", - "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872", - "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac", - "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a", - "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", - "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133", - "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", - "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", - "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", - "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", - "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", - "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", - "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", - "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", - "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", - "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", - "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", - "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", - "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2", - "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1", - "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", - "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb", - "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", - "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", - "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3", - "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", - "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", - "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a", - "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", - "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1", - "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", - "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", - "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a", - "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88", - "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656", - "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d", - "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", - "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", - "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", - "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", - "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", - "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2", - "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", - "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", - "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3", - "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", - "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", - "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87" + "sha256:033edcc22211463be927ca407dc5c5f3aa84d3d093ed2d559a2e3c2d995d50e4", + "sha256:03cd2a3c446162678d0a6d14d69ad38204128414ba40722a5ff6f2107782b723", + "sha256:05dcc73739ae8096f64f08282c8980dab2cf9acb02eb838aacd8ac56b795c405", + "sha256:11d76b83dc93e98207514e1938b89854655087e3b27a09d89525fe17a0f1ce11", + "sha256:1247de19497e13063eabf1df67e87530ac31497b91e9bd08621852a57d9b5ee7", + "sha256:147c962e8ae339d5fa84c52cc1e59546cb2d0d9359f9a8e1b8eb7b5ffac8dba0", + "sha256:159dae860e4d34bd4f48e72a0c033d78ae9215b43d423c19cbf47b7db5972599", + "sha256:15c14a01dd95e860703a4ce78d4b0d49f18c14389eb91b4aa12444e31dfc2841", + "sha256:15ddde4242134f1aeb1455ad60cc529e0a9f5eb251ae7be7fc37debdb257182c", + "sha256:1a894aed57c6edc514c9222989cf09eebd9ea7acb6185a26cfeac2ece2ddf265", + "sha256:1c11e8460ff0629871f9703c87208e553fbfa6c9d92f94c20d4f86e56f021029", + "sha256:1cd34caed981a95964218e03a3f267537a0b1a2fae078949e880f757df9efe55", + "sha256:1f62882c6d06e5e75b82444ce14f59b830f5b017b31630cc13d8b0b01379385a", + "sha256:20050a17cc2f322598d181a5b2e2cf4787e4c2e3bf71aab5e96618b40665e8ae", + "sha256:205da0f812c9128155bc1b7be69cf89280a5bb2f5b84426bced76e7d860ed5dc", + "sha256:258414850b59fb820bd1e1e19a9b281409a6d0bd969d3fe7104cc87a7c08c191", + "sha256:27d45a6a8495f2cfcf64d6cc4fbcc78a6e87ed840e54a261430d0d4331d9aae0", + "sha256:285058a0cdd284ba5bbc1d10d75fb33e3b3087b15d5aa9d23fc4787dd3a48384", + "sha256:2e116fad10aa7c74aa3acc69adcdffe86f1415abb111653f85dd37171116b57d", + "sha256:38e165c4d79ac98cabb5c08d8a3a3e1dda3206bcec19ed072992b62b200b180d", + "sha256:3af088483bf2aba7f2886437d856a6ba4cd0c17946dd615cbe55d56552eaf187", + "sha256:3d17d8b2d4643d4f59629758b0dd229cda61e2319f81b470aa4a99717081ba0c", + "sha256:3e80621ebc9f045fab847a970b2430146f9121b95c3c695b044ade8488753126", + "sha256:4030f5319aacf20e924c5218377df446507b314f03676549891e12a9f832a9f1", + "sha256:44ee27fb416c3d8981b7c3c97b9813d40b06575f6d477f4da21726a30aabb562", + "sha256:458b235ae7af880e18c1476f968ef571689a574720eb9e6e8873d138fbba9c58", + "sha256:4660b75286c11b8f38c90b98ccf7541b7030dbec32b28f05031f8abebf7fc0e5", + "sha256:4748c017fa201e6a296c9ef75dc3668a01532adb8f5c27a0bef4835dfa62f8e7", + "sha256:48f775443154d99e1b1c727ea20137ddc1e4b29448a9b24875b2a348cc143b85", + "sha256:49e01d212be64ceee18a45e8baef441aa86cc9bd365fb92fb8b214e5fa5bc08b", + "sha256:4a0ba21b315113d39f7aa3ca4eb804f7984dab33c42ea14d07d790a640f81e77", + "sha256:4aca2ab0969dc3781fefe523ce70c5d245b915ba0708ce2713e8ac561f9448e0", + "sha256:5055e039ebfc6e4589115717c4a6d1dd2f195327b8d5a3e21a68f374d79dbed9", + "sha256:52bd2b6681beb34115eebbcbdcbd170ebc3fc98c4eb0dd789f2c01d4d6b189c0", + "sha256:54a291428e25f775193704f95a94f21a42a28ffb09c1bdc91e152c6b1faf4a91", + "sha256:58f74a195b99189c9f7e2bc83cc95fcf169a43a63c5c8cad63c4027bf3233118", + "sha256:614021ba98b8052d4eb3d5900d3bd953421edf41b2aa85d37c1dc67bcee1ea9d", + "sha256:64fccd2fa3cfd49c442c4995d58189e578560705b9b632faad8ffd9aaa390007", + "sha256:64fdd7a4aef8f14e4a6917a434d0a4766345f5d544d0c0c0e53b14eb1e4be0ac", + "sha256:693858c9584cedc1685e67e78fa9e50285504e8d4bbfde7290ca04dbbac939a8", + "sha256:6d168a6693c1b9b950d9584178d12095bfbaf290748eb6e2726c914bc1d0d4f1", + "sha256:6da367181104a57e77140ebf736652ed9a97c7bcb77c7640cf8a168893561bd2", + "sha256:6ed731286f0ae399e65e3172c5808732b9ae5d896b3ab7f692eb686bba6bc9df", + "sha256:70d695f62a55f90ee894fdf1ede51ccdda3abbe25b43b667b51747b6f61b8da7", + "sha256:71dae164819f8aede109a596db84d508e670d7e0a968901aaf22445e87ae7519", + "sha256:75bb804375e0b6c5db4e474fa0b5052414b6cbc3e70394d11a7ce9a7f6a18a91", + "sha256:796d1b070211554cc8193bd6764d2b44594ff7c7522989012eacf3fde778e5cf", + "sha256:79dc3f9893e32fcc564c60bb34c4e393daede2cdf0337a5b4627ed162a237fb3", + "sha256:7a3165a5bae6577d10858c35f6add83333ead621e8286a5d15f7d567ef44be78", + "sha256:7a74764881276904564f8725da3dd2b82924838a114738933f58b75082b55dd3", + "sha256:7cbc2e5116cdca0594bb39c64a8bd5e7f44d392cf76d19913216924688d42954", + "sha256:8223f74cf698f7992e1a71ab90ab4c169b508a0f25083ebab9259b9f33d7bdde", + "sha256:824b60427c92c44098cfbd58d8adf8a8c5a60ade16742dcb54385b43e6337b4e", + "sha256:8257f26cc2cc5d0426da488162060c6cea57079172b9d3eedf016fcb0cfdb830", + "sha256:8530ca574ba38478e97af20ff0f3fd04f59ffcad435b1548703424d71e2ed66a", + "sha256:858b68e475f8e73e4014c078e9feced502273032f07840117ca12d2230d27135", + "sha256:88ae724e79a524d1921b2799251f667e7fb0344a59637df3bec91dc303020467", + "sha256:8ce52f84e793ee83082c4aa127605070a47c31597821ca84dec5c0ac809e8509", + "sha256:93de2d3802a5ac7d5deadba1c956a93db29502f1b9f4e8d2e393747b9b28d881", + "sha256:93f4545347f79121e9ba98a0c33a55f469ebc22fb45ae62692e01d367219796b", + "sha256:9777e194be00313f5a86a0dd52d9987b72cf6c43c8a42d6bd838adc46c70e98b", + "sha256:99b2401166c3b2d997b80479cdc7449a093e21f3d4b2f9c6e6ceee956aa10d63", + "sha256:99f9b6596d2e126fa1777990868743fb4c1984ea5217606fabc153aff46160e6", + "sha256:9b4cd51b623b3dc8b55f9caef07424ac6d684b8047e601aca7053999e1b4a527", + "sha256:9f1edbf7e0d22a1ebf3c24ffaf0b8a39888bd630d6ff38c77c169272a3d4b9cc", + "sha256:a3da262f5b9f0dd01277575de4967683123ab47699fd7db2ce38cb1bb8f5c76f", + "sha256:aa613b270de6215f9fc850f0fb18dbc20ba297013012793cf3d2f1295e271e91", + "sha256:ac87e173c5f3aeac06d01eeebfb35c2b1bc5f536b21210dd8b032f1dc0726fbc", + "sha256:ad333e0b0d19294d3fc81d7aa9b65c45ebf49e6f8b3fab02db43284140d2b0a8", + "sha256:af55e557e722c962f70cdc6a482d0df44b1f6622af49003e33dd114340724875", + "sha256:b019f5c53471e8a010edf2fec321ece25ac6b079b535980b7228dcb9ee62d621", + "sha256:b0441ee8b9edc3fadb5cd9f181212edd72f7b016723bc549f9c1c00a9a8e6f93", + "sha256:b29a79f1e4313c397e00d89d4d83ff54fd377e7d654b640bbe9002b4272f205e", + "sha256:b622146bcfc6749944d14e8a61267dbea1bee96a9c7ca7605683506ed3817844", + "sha256:b8a87a3686de1d215506ba13dd388433695bfff534839e045419ba2f36437c0e", + "sha256:b9c5dfa5c7cdc26f6b777ac6210d3621d556e2e244f0a7358afe8ec0135f8640", + "sha256:b9d3d5de87a88768be67b7ec20aeb531707174ba0645697a938df3afc2c62b1f", + "sha256:bbd3cc064d272618b95c2f85ec61fe9d07e2a1de18c153c10923d3c2cdebff4c", + "sha256:bcd21a1b5cfb45170280e5fcd382c25519d75bdf4634656868b91c05d5e15b23", + "sha256:bdb621264758b22ae3aaa9d60937751069d80d610d713887ff94cf7487fc3f5f", + "sha256:c5fdcac25ae451af93e7f997678ed2282bf6b5ef892e253eea13bba59849f00e", + "sha256:c785581071f140d364821c210422ab5937d6c2c51d92e45a552a8e34b434a5a3", + "sha256:cbd06fb147030d7781f10bd7542f29bbf56cefb51a9f042713d5fc52e68b8afd", + "sha256:cf95ac57b44b6fb46a0151641b9905bbad27783314abc4f4b0b0a82f26b06b07", + "sha256:d6698fccb2f962021e467be6ba43fc02f7341f221e80545810303f5cc66461bb", + "sha256:d7533a9684e599b22a4beb699647dc3269d551e455886be8125f14f3c5a0869f", + "sha256:d7bf1d52c69f3051a0ebae9cca1e5be06e2ad4677d670a920454ecf6d20e2c8e", + "sha256:d8f47485264b1168ef852dd6bea619703409ff2cbc5e610dcb0f15fe3c6750bb", + "sha256:d8fc8c7c092a48044bf942735eea6da198cac0c655d7a06550619b2a7fec2ffd", + "sha256:d9e984f9542fba175bc4d98e320e9e2bd6e7480682aa84b274e9aee7fb6575b9", + "sha256:dc86a31e3215ce037ae306a338ff2156d897aae627d5d4e3dfa0c9eded4249e8", + "sha256:dd5240bea7d8de32e7ac95088b2ad95b89993a3825d9278d363d73ca40113cb3", + "sha256:df46fd268c765d186df8c7899bc4e0a2ee0d12458d356438af0329a49e6b15ca", + "sha256:dfb3870c5d4f5413988caf64243830f7ca13dc58ae2cf3eb48fe321ca6f26648", + "sha256:e36cfe9df4dfb6c2f4d80d20852ab6449257a01942e4808c3912ed413a4d40f7", + "sha256:e5ca936b70414dbee02f218be1d36a535a5953ba63fd82dc812135ca3f5a525f", + "sha256:e7ab7ea72c3f66ae1e930ae776ad2c6f4f78e0184781f64f196f17ecce113101", + "sha256:e80878904057edfd1d70ba31258f974d36c470fd95de2bcd98e0494942c4433e", + "sha256:ed8d6bd6f3c7991083e741fd55cecea70d670971c73b9563a673eab96e5356b4", + "sha256:f290e4eebf7764f8327a4bc6a459f09ca9a041cf7349bacfbb252da9feb0d37c", + "sha256:f915fc3287ddc23a5da8f61f5c2c3aaca0b754ce526c0ff81f55c27b25038cd5", + "sha256:fb8b1cba597398698ec494794091dadd76eb8011bb95f43578930466e7beb20b", + "sha256:fbd035ae06babb07c6b80535b0d4f6fe57eb73a23ae276eb4502b1f67f19e8ef", + "sha256:fd9521b70b50aac341f59799301ba24acbe2897b9157035d139668b6c43bc406" ], "markers": "python_version >= '3.9'", - "version": "==6.2.0" + "version": "==6.4.2" }, "niquests": { "hashes": [ @@ -1521,11 +1533,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:3adfa22c5718caee5ca69bc7f7461dc529f4396494d4d9b1db8af7c56cd3ac34", - "sha256:9cd79ce61da77b5d56681bc126f42955c2153e9c0da2f0a62bca8e0a05641f92" + "sha256:1a31156dc1f87d13483272cd7fe381664ded124b3b5e3d65385c23a309a1584e", + "sha256:60d1c48846c7fd5dbddfae38196fd1c43ffc83fb987ba477361254b93913ccbc" ], "markers": "python_version >= '3.7'", - "version": "==2.12.915" + "version": "==2.12.916" }, "verlib2": { "hashes": [ @@ -2240,11 +2252,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:3adfa22c5718caee5ca69bc7f7461dc529f4396494d4d9b1db8af7c56cd3ac34", - "sha256:9cd79ce61da77b5d56681bc126f42955c2153e9c0da2f0a62bca8e0a05641f92" + "sha256:1a31156dc1f87d13483272cd7fe381664ded124b3b5e3d65385c23a309a1584e", + "sha256:60d1c48846c7fd5dbddfae38196fd1c43ffc83fb987ba477361254b93913ccbc" ], "markers": "python_version >= '3.7'", - "version": "==2.12.915" + "version": "==2.12.916" }, "verlib2": { "hashes": [ diff --git a/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1-py3-none-any.whl index f77eea076ca6a24674d220d3f54624b5f9a09202..261fa7958ae481d4d85bc5efc152e519fa6af802 100644 Binary files a/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1.tar.gz b/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1.tar.gz index 7065ba14b7eadea39293894488821e3f38e0ef35..0da3ea37a31f2f3cdeea212e768aab7793f29252 100644 Binary files a/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1.tar.gz and b/dbrepo-dashboard-service/init/lib/dbrepo-1.8.1.tar.gz differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl index f77eea076ca6a24674d220d3f54624b5f9a09202..261fa7958ae481d4d85bc5efc152e519fa6af802 100644 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz index 7065ba14b7eadea39293894488821e3f38e0ef35..0da3ea37a31f2f3cdeea212e768aab7793f29252 100644 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz and b/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz differ diff --git a/dbrepo-dashboard-service/tests/test_integration_app.py b/dbrepo-dashboard-service/tests/test_integration_app.py index 768fd6a1ec8d1c7b70a6e7ad98d4ab7ced68532b..c345e00dee1fdc88f5a4bc9d6277d7cef430b36f 100644 --- a/dbrepo-dashboard-service/tests/test_integration_app.py +++ b/dbrepo-dashboard-service/tests/test_integration_app.py @@ -68,7 +68,7 @@ class AppIntegrationTest(unittest.TestCase): 'roles': roles } } - with open('../tests/rsa/rs256.key', 'rb') as fh: + with open('./tests/rsa/rs256.key', 'rb') as fh: return jwt.JWT().encode(claims, jwt.jwk_from_pem(fh.read()), alg='RS256') def dashboard_client(self): @@ -214,9 +214,14 @@ class AppIntegrationTest(unittest.TestCase): self.assertEqual('link', dashboard['links'][0]['type']) self.assertEqual('info', dashboard['links'][0]['icon']) self.assertEqual(f'http://localhost/database/{req.id}', dashboard['links'][0]['url']) - self.assertEqual(1, len(dashboard['panels'])) - self.assertEqual('row', dashboard['panels'][0]['type']) - self.assertEqual('Generated Statistics', dashboard['panels'][0]['title']) + self.assertEqual(2, len(dashboard['panels'])) + panel0 = dashboard['panels'][0] + self.assertEqual('row', panel0['type']) + self.assertEqual('Generated Dashboard', panel0['title']) + panel1 = dashboard['panels'][1] + self.assertEqual('stat', panel1['type']) + self.assertEqual('Datasources', panel1['title']) + self.assertEqual('Auto-generated', panel1['description']) def test_update_dashboard_unmanaged_succeeds(self): req = Database(id="209acf92-5c9b-4633-ad99-113c86f6e948", diff --git a/dbrepo-dashboard-ui/Dockerfile b/dbrepo-dashboard-ui/Dockerfile index 099089718df942f95abe604db148fab6364c3915..daf9ef46dd808a99eb6bb776945f014cdf6f9c8f 100644 --- a/dbrepo-dashboard-ui/Dockerfile +++ b/dbrepo-dashboard-ui/Dockerfile @@ -1,9 +1,7 @@ -FROM docker.io/bitnami/grafana:11 AS runtime +FROM docker.io/bitnami/grafana:11.5.3 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" -WORKDIR /app - -COPY --chown=grafana:grafana ./grafana.ini /opt/bitnami/grafana/conf/grafana.ini -COPY --chown=grafana:grafana ./ldap.toml /opt/bitnami/grafana/conf/ldap.toml +COPY --chown=grafana:grafana ./grafana.ini ./conf/grafana.ini +COPY --chown=grafana:grafana ./ldap.toml ./conf/ldap.toml COPY --chown=grafana:grafana ./dashboards /app/dashboards -COPY --chown=grafana:grafana ./provisioning /opt/bitnami/grafana/conf/ +COPY --chown=grafana:grafana ./provisioning ./conf/provisioning diff --git a/dbrepo-dashboard-ui/grafana.ini b/dbrepo-dashboard-ui/grafana.ini index 81fcee0a36f3b33df460e3903dfc4077b5fb86df..f0d0539a1ec2644c9d6caa1adb9ef437a7dd0431 100644 --- a/dbrepo-dashboard-ui/grafana.ini +++ b/dbrepo-dashboard-ui/grafana.ini @@ -1,9 +1,15 @@ +# order of config evaluation is grafana.ini < defaults.ini + [security] disable_initial_admin_creation = true [auth.ldap] enabled = true -config_file = /etc/grafana/ldap.toml +config_file = /opt/bitnami/grafana/conf/ldap.toml + +[live] +max_connections = 100 +allowed_origins = [auth.anonymous] enabled = true @@ -12,7 +18,7 @@ hide_version = true [dashboards] enabled = true -path = /app/dashboards +path = /opt/bitnami/grafana/conf/dashboards -#[log] -#filters = ldap:trace \ No newline at end of file +[log] +mode = console file diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 548854d01b827a89cd4b5e6848875ddc82252ead..6f67e74b7043a9df43bd38d0a5a2bbd3cd4e1050 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -44,7 +44,7 @@ <rabbitmq.version>5.20.0</rabbitmq.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> <commons-io.version>2.17.0</commons-io.version> - <commons-validator.version>1.8.1</commons-validator.version> + <commons-validator.version>1.8.0</commons-validator.version> <jacoco.version>0.8.12</jacoco.version> <jwt.version>4.3.0</jwt.version> <opencsv.version>5.7.1</opencsv.version> diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 22524f6290514e8c483fffb165eef62ed04b6794..41d23f4c7f6cdf97c8c6ebef2becd2f6d82cce8b 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -64,8 +64,6 @@ dbrepo: accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" bucket: "${S3_BUCKET:dbrepo}" - maxAge: "${S3_MAX_AGE:86400}" - cron: "${S3_STALE_CRON:0 */60 * * * *}" system: username: "${SYSTEM_USERNAME:admin}" password: "${SYSTEM_PASSWORD:admin}" diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java index 7dec246c26e7a61e11eccfa785b3aa22b833d89e..1ebd52e3b8fae44aaf84b21a1d4d576001431181 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java @@ -1,12 +1,12 @@ package at.ac.tuwien.ac.at.ifs.dbrepo.service; +import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; import org.apache.spark.sql.Dataset; @@ -28,10 +28,11 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MinIOContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; -import software.amazon.awssdk.services.s3.model.ListObjectsRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import java.io.*; @@ -233,35 +234,6 @@ public class StorageServiceIntegrationTest extends BaseTest { assertEquals("", lines.get(0)); } - @Test - public void deleteStaleObjects_none_succeeds() { - - /* mock */ - s3Client.putObject(PutObjectRequest.builder() - .key("s3key") - .bucket(s3Config.getS3Bucket()) - .build(), RequestBody.fromFile(new File("src/test/resources/csv/weather_aus.csv"))); - - /* test */ - storageService.deleteStaleObjects(); - assertEquals(1, s3Client.listObjects(ListObjectsRequest.builder().bucket(s3Config.getS3Bucket()).build()).contents().size()); - } - - @Test - public void deleteStaleObjects_succeeds() throws InterruptedException { - - /* mock */ - s3Client.putObject(PutObjectRequest.builder() - .key("s3key") - .bucket(s3Config.getS3Bucket()) - .build(), RequestBody.fromFile(new File("src/test/resources/csv/weather_aus.csv"))); - - /* test */ - Thread.sleep(4000); - storageService.deleteStaleObjects(); - assertEquals(0, s3Client.listObjects(ListObjectsRequest.builder().bucket(s3Config.getS3Bucket()).build()).contents().size()); - } - @ParameterizedTest @Disabled("cannot fix") @MethodSource("loadDataset_arguments") diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java index b8d8a3732fb071054d9a792554338c89a3afb22c..c9f8a5d49bc9efcf38b2314a50c4b0540f083d47 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java @@ -30,9 +30,6 @@ public class S3Config { @Value("${dbrepo.s3.bucket}") private String s3Bucket; - @Value("${dbrepo.s3.maxAge}") - private Integer maxAge; - @Bean public S3Client s3client() { final AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create( diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java index 73c2d89980a911e7364ce74489c33fc593c2cbbf..88a3fd4d2901e642ab7674988f3f776d687a30b1 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java @@ -49,8 +49,6 @@ public interface StorageService { void deleteObject(String bucket, String key); - void deleteStaleObjects(); - /** * Loads an object of the default export bucket from the Storage Service into an export resource. * diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java index 5e2d0e10a38f0565680c753dba3f255c5c04dc52..94cf2b43db8ae6ec3d13da1edaa2eec8bbebbbc8 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java @@ -1,14 +1,15 @@ package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; +import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableMalformedException; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.james.mime4j.dom.datetime.DateTime; import org.apache.spark.sql.*; import org.apache.spark.sql.catalyst.ExtendedAnalysisException; import org.apache.spark.sql.types.StructField; @@ -99,21 +100,6 @@ public class StorageServiceS3Impl implements StorageService { .build()); } - @Override - public void deleteStaleObjects() { - log.trace("list stale objects in bucket: {}", s3Config.getS3Bucket()); - final List<String> keys = s3Client.listObjects(ListObjectsRequest.builder() - .bucket(s3Config.getS3Bucket()) - .build()) - .contents() - .stream() - .filter(o -> o.lastModified().isBefore(Instant.now().minus(s3Config.getMaxAge(), ChronoUnit.SECONDS))) - .map(S3Object::key) - .toList(); - keys.forEach(key -> deleteObject(s3Config.getS3Bucket(), key)); - log.info("Deleted {} stale object(s) in bucket: {}", keys.size(), s3Config.getS3Bucket()); - } - @Override public ExportResourceDto getResource(String key) throws StorageNotFoundException, StorageUnavailableException { return getResource(s3Config.getS3Bucket(), key); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/timer/StaleObjectTimer.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/timer/StaleObjectTimer.java deleted file mode 100644 index 2d1ca62b6a9cc7c5c181aed69c80bf421fc63b27..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/timer/StaleObjectTimer.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.timer; - -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -@Log4j2 -@Component -public class StaleObjectTimer { - - private final StorageService storageService; - - @Autowired - public StaleObjectTimer(StorageService storageService) { - this.storageService = storageService; - } - - @Scheduled(cron = "${dbrepo.s3.cron}") - public void deleteStaleObjects() { - storageService.deleteStaleObjects(); - } - -} diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index d77507fa09f053e4c5ca0221258e0a53b4a01178..0ee5bfdfb5fb5c8950e61fff324abc4044a5bc1d 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -17,6 +17,7 @@ server { server_name _; location /dashboard/ { + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; @@ -26,7 +27,9 @@ server { } # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ { + location /dashboard/api/live/ws { + rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; diff --git a/dbrepo-grafana-service/.dockerignore b/dbrepo-grafana-service/.dockerignore deleted file mode 100644 index fcdfe8de55e91b3b65fcf598c5980ae256087910..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -rest-service/src/main/resources/*.csv \ No newline at end of file diff --git a/dbrepo-grafana-service/.gitignore b/dbrepo-grafana-service/.gitignore deleted file mode 100644 index d39a47ee0fab72fbe4fd7f5ae968ff2f3bc3de78..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### Environment ### -.env - -### Generated ### -ready -mapping.xml -schema.xsd -*.versionsBackup -metrics.txt - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-grafana-service/.mvn/wrapper/MavenWrapperDownloader.java b/dbrepo-grafana-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index a45eb6ba269cd38f8965cef786729790945d9537..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.jar b/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 Binary files a/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.properties b/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce90e5085986bdd9c9204b9404f028084..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/dbrepo-grafana-service/Dockerfile b/dbrepo-grafana-service/Dockerfile deleted file mode 100644 index b01544827f1cdda6398eb0d8e0b927b88fa176f1..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-service:build AS dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -FROM maven:3-openjdk-17 AS build -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline - -COPY ./rest-service ./rest-service -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -# Make sure it compiles -RUN mvn clean package -DskipTests - -###### SECOND STAGE ###### -FROM eclipse-temurin:17-jdk AS runtime -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -WORKDIR /app - -USER 65534 - -COPY --from=build --chown=65534 ./rest-service/target/dbrepo-grafana-service-rest-service-*.jar ./grafana-service.jar - -# non-root port -EXPOSE 8080 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-jar", "./grafana-service.jar"] \ No newline at end of file diff --git a/dbrepo-grafana-service/README.md b/dbrepo-grafana-service/README.md deleted file mode 100644 index 7160f7bbbc743d2bb6425773566c98eb86005143..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Metadata Service - -## Test - -Run all unit and integration tests and create an HTML+TXT coverage report located in the `report` module: - -```bash -mvn -pl rest-service clean test verify -``` - -Or run only unit tests -in [`KeycloakGatewayUnitTest.java`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/master/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/BrokerServiceGatewayTest.java): - -```bash -mvn -pl rest-service -Dtest="KeycloakGatewayUnitTest" clean test -``` - -## Run - -Start the Metadata Database before and then run the Metadata Service: - -```bash -mvn -pl rest-service clean spring-boot:run -Dspring-boot.run.profiles=local -``` - -### Endpoints - -#### Actuator - -- Info: http://localhost:9099/actuator/info -- Health: http://localhost:9099/actuator/health - - Readiness: http://localhost:9099/actuator/health/readiness - - Liveness: http://localhost:9099/actuator/health/liveness -- Prometheus: http://localhost:9099/actuator/prometheus - -#### OpenAPI - -- OpenAPI v3 as .yaml: http://localhost:9099/v3/api-docs.yaml \ No newline at end of file diff --git a/dbrepo-grafana-service/mvnw b/dbrepo-grafana-service/mvnw deleted file mode 100755 index a16b5431b4c3cab50323a3f558003fd0abd87dad..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-grafana-service/mvnw.cmd b/dbrepo-grafana-service/mvnw.cmd deleted file mode 100644 index c8d43372c986d97911cdc21bd87e0cbe3d83bdda..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/dbrepo-grafana-service/pom.xml b/dbrepo-grafana-service/pom.xml deleted file mode 100644 index 763aa408f075814db2312778f6112e71b1b3072a..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/pom.xml +++ /dev/null @@ -1,299 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.0.13</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-grafana-service</artifactId> - <name>dbrepo-grafana-service</name> - <version>1.4.4</version> - - <description>Service that creates automated grafana dashboards</description> - - <packaging>pom</packaging> - <modules> - <module>rest-service</module> - </modules> - - <properties> - <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> - <rabbitmq.version>5.20.0</rabbitmq.version> - <jackson-datatype.version>2.15.0</jackson-datatype.version> - <commons-io.version>2.15.0</commons-io.version> - <commons-validator.version>1.8.0</commons-validator.version> - <jacoco.version>0.8.11</jacoco.version> - <jwt.version>4.3.0</jwt.version> - <opencsv.version>5.7.1</opencsv.version> - <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> - <springdoc-openapi.version>2.3.0</springdoc-openapi.version> - <hsqldb.version>2.7.2</hsqldb.version> - <testcontainers.version>1.19.1</testcontainers.version> - <jackson.version>2.15.2</jackson.version> - <c3p0.version>0.9.5.5</c3p0.version> - <c3p0-hibernate.version>6.2.2.Final</c3p0-hibernate.version> - <aws-s3.version>2.25.23</aws-s3.version> - <minio.version>8.5.7</minio.version> - <apache-commons.version>1.10.0</apache-commons.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.security</groupId> - <artifactId>spring-security-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-bootstrap</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-text</artifactId> - <version>${apache-commons.version}</version> - - </dependency> - <!-- Caching --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-redis</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-cache</artifactId> - </dependency> - <dependency> - <groupId>redis.clients</groupId> - <artifactId>jedis</artifactId> - </dependency> - <!-- Open API --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-api</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- Data Source --> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - </dependency> - <dependency> - <groupId>com.mchange</groupId> - <artifactId>c3p0</artifactId> - <version>${c3p0.version}</version> - </dependency> - <dependency> - <groupId>org.hibernate.orm</groupId> - <artifactId>hibernate-c3p0</artifactId> - <version>${c3p0-hibernate.version}</version> - </dependency> - <!-- Monitoring --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-aop</artifactId> - </dependency> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-registry-prometheus</artifactId> - <version>${micrometer.version}</version> - </dependency> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-observation-test</artifactId> - <version>${micrometer.version}</version> - <scope>test</scope> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <scope>compile</scope> - </dependency> - <!-- Mapping --> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - <version>${mapstruct.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jsr310</artifactId> - <version>${jackson-datatype.version}</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>${commons-io.version}</version> - </dependency> - <dependency> - <groupId>commons-validator</groupId> - <artifactId>commons-validator</artifactId> - <version>${commons-validator.version}</version> - </dependency> - <!-- Authentication --> - <dependency> - <groupId>com.auth0</groupId> - <artifactId>java-jwt</artifactId> - <version>${jwt.version}</version> - </dependency> - <!-- DTOs --> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-api</artifactId> - <version>${project.version}</version> - </dependency> - <!-- AMPQ --> - <dependency> - <groupId>org.springframework.amqp</groupId> - <artifactId>spring-rabbit</artifactId> - </dependency> - <dependency> - <groupId>com.rabbitmq</groupId> - <artifactId>amqp-client</artifactId> - <version>${rabbitmq.version}</version> - </dependency> - <!-- Storage --> - <dependency> - <groupId>software.amazon.awssdk</groupId> - <artifactId>s3</artifactId> - <version>${aws-s3.version}</version> - </dependency> - <!-- Testing --> - <dependency> - <groupId>com.github.jsqlparser</groupId> - <artifactId>jsqlparser</artifactId> - <version>${jsql.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-test</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>rabbitmq</artifactId> - <version>${testcontainers.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>junit-jupiter</artifactId> - <version>${testcontainers.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>mariadb</artifactId> - <version>${testcontainers.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>minio</artifactId> - <version>${testcontainers.version}</version> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - </dependency> - </dependencies> - <build> - <resources> - <resource> - <directory>${basedir}/src/main/resources</directory> - <filtering>true</filtering> - <includes> - <include>**/application*.yml</include> - <include>**/rdf/*</include> - <include>**/templates/*.txt</include> - <include>**/templates/*.xml</include> - </includes> - </resource> - </resources> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/seeder/**/*</exclude> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/handlers/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/converters/**/*</exclude> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>at/tuwien/auth/**/*</exclude> - <exclude>at/tuwien/gateway/impl/ApiTemplateInterceptorImpl.class</exclude> - <exclude>**/testcontainers.properties</exclude> - <exclude>**/HibernateConnector.class</exclude> - <exclude>**/DbrepoMetadataServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-grafana-service/rest-service/pom.xml b/dbrepo-grafana-service/rest-service/pom.xml deleted file mode 100644 index ace7de5a1cb287e104a93100059b506caba3ab77..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-grafana-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.4.4</version> - </parent> - - <artifactId>dbrepo-grafana-service-rest-service</artifactId> - <name>dbrepo-grafana-service-rest</name> - <version>1.4.4</version> - - <dependencies> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/DbrepoGrafanaServiceApplication.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/DbrepoGrafanaServiceApplication.java deleted file mode 100644 index 79c50fa5ef00adf1cd5c0c4efa9355500e76dba1..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/DbrepoGrafanaServiceApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package at.tuwien; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - -@SpringBootApplication -@EnableCaching -public class DbrepoGrafanaServiceApplication { - public static void main(String[] args) { - SpringApplication.run(DbrepoGrafanaServiceApplication.class, args); - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/AuthTokenFilter.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/AuthTokenFilter.java deleted file mode 100644 index 46ec0e6a24bdd2bc2a9a88f8fad4815467ebff08..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/AuthTokenFilter.java +++ /dev/null @@ -1,96 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.api.auth.RealmAccessDto; -import at.tuwien.api.user.UserDetailsDto; -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import com.auth0.jwt.interfaces.Verification; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.util.Arrays; -import java.util.Base64; -import java.util.stream.Collectors; - -@Slf4j -public class AuthTokenFilter extends OncePerRequestFilter { - - @Value("${dbrepo.jwt.public_key}") - private String publicKey; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - final String jwt = parseJwt(request); - if (jwt != null) { - final UserDetails userDetails = verifyJwt(jwt); - final UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - } - filterChain.doFilter(request, response); - } - - public UserDetails verifyJwt(String token) throws ServletException { - final KeyFactory kf; - try { - kf = KeyFactory.getInstance("RSA"); - } catch (NoSuchAlgorithmException e) { - log.error("Failed to find RSA algorithm"); - throw new ServletException("Failed to find RSA algorithm", e); - } - final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); - final RSAPublicKey pubKey; - try { - pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509); - } catch (InvalidKeySpecException e) { - log.error("Provided public key is invalid"); - throw new ServletException("Provided public key is invalid", e); - } - final Algorithm algorithm = Algorithm.RSA256(pubKey, null); - final Verification verification = JWT.require(algorithm); - final JWTVerifier verifier = verification.build(); - final DecodedJWT jwt = verifier.verify(token); - final RealmAccessDto realmAccess = jwt.getClaim("realm_access").as(RealmAccessDto.class); - return UserDetailsDto.builder() - .id(jwt.getSubject()) - .username(jwt.getClaim("client_id").asString()) - .authorities(Arrays.stream(realmAccess.getRoles()).map(SimpleGrantedAuthority::new).collect(Collectors.toList())) - .build(); - } - - /** - * Parses the token from the HTTP header of the request - * - * @param request The request. - * @return The token. - */ - public String parseJwt(HttpServletRequest request) { - String headerAuth = request.getHeader("Authorization"); - if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) { - return headerAuth.substring(7, headerAuth.length()); - } - return null; - } -} \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/BasicAuthenticationProvider.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/BasicAuthenticationProvider.java deleted file mode 100644 index 6cd55e9ef768e47f3d3463001ba99b5378f5351e..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/auth/BasicAuthenticationProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.api.keycloak.TokenDto; -import at.tuwien.api.user.UserDetailsDto; -import at.tuwien.config.GatewayConfig; -import at.tuwien.exception.ServiceConnectionException; -import at.tuwien.exception.ServiceException; -import at.tuwien.gateway.KeycloakGateway; -import jakarta.servlet.ServletException; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Log4j2 -@Component -public class BasicAuthenticationProvider implements AuthenticationManager { - - private final GatewayConfig gatewayConfig; - private final AuthTokenFilter authTokenFilter; - private final KeycloakGateway keycloakGateway; - - @Autowired - public BasicAuthenticationProvider(GatewayConfig gatewayConfig, AuthTokenFilter authTokenFilter, - KeycloakGateway keycloakGateway) { - this.gatewayConfig = gatewayConfig; - this.authTokenFilter = authTokenFilter; - this.keycloakGateway = keycloakGateway; - } - - @Override - public Authentication authenticate(Authentication auth) throws AuthenticationException { - if (auth.getName().equals(gatewayConfig.getAdminUsername()) - && auth.getCredentials().toString().equals(gatewayConfig.getAdminPassword())) { - log.trace("current user is {}: skip authentication", gatewayConfig.getAdminUsername()); - final UserDetails userDetails = UserDetailsDto.builder() - .username(auth.getName()) - .authorities(List.of(new SimpleGrantedAuthority("admin"))) - .build(); - return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - } - log.trace("current user is {}: begin authentication", auth.getName()); - try { - final TokenDto tokenDto = keycloakGateway.obtainUserToken(auth.getName(), auth.getCredentials().toString()); - final UserDetails userDetails = authTokenFilter.verifyJwt(tokenDto.getAccessToken()); - return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - } catch (ServletException | ServiceConnectionException | ServiceException e) { - throw new BadCredentialsException("Failed to authenticate with authentication service", e); - } - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/CacheConfig.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/CacheConfig.java deleted file mode 100644 index dafb08dafc955fabde7a4ac6df6f16857b5ec173..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/CacheConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package at.tuwien.config; - -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.cache.RedisCacheConfiguration; -import org.springframework.data.redis.cache.RedisCacheManager; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -import java.time.Duration; - - -@Configuration -@EnableCaching -public class CacheConfig { - - @Bean - public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { - return RedisCacheManager.RedisCacheManagerBuilder - .fromConnectionFactory(connectionFactory) - .withCacheConfiguration("myCache", - RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofSeconds(30)) - ) - .build(); - } - - @Bean - public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(redisConnectionFactory); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); - return redisTemplate; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index 1692f53b296ffe86b9c6b2cb49f9a44225c82a6b..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,104 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.interceptor.KeycloakInterceptor; -import lombok.Getter; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.util.List; - -@Log4j2 -@Getter -@Configuration -public class GatewayConfig { - - @Value("${dbrepo.endpoints.gatewayService}") - private String gatewayEndpoint; - - @Value("${dbrepo.endpoints.grafana}") - private String grafanaEndpoint; - - @Value("${dbrepo.admin.username}") - private String adminUsername; - - @Value("${dbrepo.admin.password}") - private String adminPassword; - - @Value("${dbrepo.endpoints.dataService}") - private String dataEndpoint; - - @Value("${dbrepo.endpoints.metadataService}") - private String metaDataEndpoint; - - @Value("${dbrepo.grafana.username}") - private String grafanaUsername; - - @Value("${dbrepo.grafana.password}") - private String grafanaPassword; - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - @Bean("grafanaTemplate") - public RestTemplate grafanaTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(grafanaEndpoint)); - restTemplate.getInterceptors().add(grafanaHttpRequestInterceptor()); - return restTemplate; - } - - @Bean - public ClientHttpRequestInterceptor clientHttpRequestInterceptor() { - return (request, body, execution) -> { - final HttpHeaders headers = request.getHeaders(); - headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); - return execution.execute(request, body); - }; - } - - @Bean - public ClientHttpRequestInterceptor grafanaHttpRequestInterceptor() { - return (request, body, execution) -> { - final HttpHeaders headers = request.getHeaders(); - headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBasicAuth(grafanaUsername, grafanaPassword); - return execution.execute(request, body); - }; - } - - @Bean("dataServiceRestTemplate") - public RestTemplate dataServiceRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(dataEndpoint)); - log.debug("add basic authentication for internal data service: username={}, password=(hidden)", adminUsername); - - restTemplate.getInterceptors() - .addAll(List.of(new BasicAuthenticationInterceptor(adminUsername, adminPassword), - clientHttpRequestInterceptor())); - - return restTemplate; - } - - @Bean("metaDataServiceRestTemplate") - public RestTemplate metaDataServiceRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(metaDataEndpoint)); - restTemplate.getInterceptors().add(clientHttpRequestInterceptor()); - return restTemplate; - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/KeycloakConfig.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/KeycloakConfig.java deleted file mode 100644 index 4d258d496aa6ebe825ac2d84a1f00a1b4f9c0298..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/KeycloakConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.interceptor.KeycloakInterceptor; -import lombok.Getter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -import java.util.List; - -@Getter -@Configuration -public class KeycloakConfig { - - @Value("${dbrepo.endpoints.authService}") - private String keycloakEndpoint; - - @Value("${dbrepo.keycloak.username}") - private String keycloakUsername; - - @Value("${dbrepo.keycloak.password}") - private String keycloakPassword; - - @Value("${dbrepo.keycloak.client}") - private String keycloakClient; - - @Value("${dbrepo.keycloak.clientSecret}") - private String keycloakClientSecret; - - private final ClientHttpRequestInterceptor clientHttpRequestInterceptor; - - @Autowired - public KeycloakConfig(ClientHttpRequestInterceptor clientHttpRequestInterceptor) { - this.clientHttpRequestInterceptor = clientHttpRequestInterceptor; - } - - @Bean("keycloakRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint)); - restTemplate.getInterceptors() - .addAll(List.of(new KeycloakInterceptor(keycloakUsername, keycloakPassword, keycloakEndpoint), - clientHttpRequestInterceptor)); - return restTemplate; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/WebSecurityConfig.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/WebSecurityConfig.java deleted file mode 100644 index 5bb4b2e9705f36d0e4168f5688ac42ca13de8882..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/config/WebSecurityConfig.java +++ /dev/null @@ -1,107 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.auth.AuthTokenFilter; -import at.tuwien.auth.BasicAuthenticationProvider; -import at.tuwien.gateway.KeycloakGateway; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; -import io.swagger.v3.oas.annotations.security.SecurityScheme; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.security.web.util.matcher.OrRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -@Configuration -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -@SecurityScheme( - name = "bearerAuth", - type = SecuritySchemeType.HTTP, - bearerFormat = "JWT", - scheme = "bearer" -) -@SecurityScheme( - name = "basicAuth", - type = SecuritySchemeType.HTTP, - scheme = "basic" -) -public class WebSecurityConfig { - - @Bean - public AuthTokenFilter authTokenFilter() { - return new AuthTokenFilter(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http, KeycloakGateway keycloakGateway, - GatewayConfig gatewayConfig) throws Exception { - final OrRequestMatcher internalEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/actuator/**", "GET"), - new AntPathRequestMatcher("/v3/api-docs.yaml"), - new AntPathRequestMatcher("/v3/api-docs/**"), - new AntPathRequestMatcher("/swagger-ui/**"), - new AntPathRequestMatcher("/swagger-ui.html") - ); - final OrRequestMatcher publicEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/api/**", "GET"), - new AntPathRequestMatcher("/api/**", "HEAD") - ); - /* enable CORS and disable CSRF */ - http = http.cors().and().csrf().disable(); - /* set session management to stateless */ - http = http - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and(); - /* set unauthorized requests exception handler */ - http = http - .exceptionHandling() - .authenticationEntryPoint( - (request, response, ex) -> { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, - ex.getMessage() - ); - } - ).and(); - /* set permissions on endpoints */ - http.authorizeHttpRequests() - /* our internal endpoints */ - .requestMatchers(internalEndpoints).permitAll() - /* our public endpoints */ - .requestMatchers(publicEndpoints).permitAll() - /* our private endpoints */ - .anyRequest().authenticated(); - /* add JWT token filter */ - http.addFilterBefore(authTokenFilter(), - UsernamePasswordAuthenticationFilter.class - ); - http.addFilterBefore(new BasicAuthenticationFilter(new BasicAuthenticationProvider(gatewayConfig, - authTokenFilter(), keycloakGateway)), - UsernamePasswordAuthenticationFilter.class - ); - return http.build(); - } - - @Bean - public CorsFilter corsFilter() { - final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - final CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOriginPattern("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/DashboardConfigDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/DashboardConfigDto.java deleted file mode 100644 index e93c50362c3e149defa5bd973c4e252176680a4e..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/DashboardConfigDto.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; -import java.util.Map; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DashboardConfigDto { - /** - * Map containing information to create time series data. - * <p> - * The key of the map represents the table id. - * The value is a list of {@link TimeSeriesDto} objects in this table. - */ - private Map<Long, List<TimeSeriesDto>> timeSeriesDto; - - /** - * Map containing information about params for the PieChartPanel. - * <p> - * The key of the map represents the table id. - * The value is a Map with key = column id and value = {@link PieChartConfigDto}. - */ - private Map<Long, Map<Long, PieChartConfigDto>> pieChartConfigDto; - - /** - * Map containing information about params for the Histogram. - * <p> - * The key of the map represents the table id. - * The value is a Map with key = column id and value = {@link HistogramConfigDto}. - */ - private Map<Long, Map<Long, HistogramConfigDto>> histogramConfigDto; - - /** - * Map containing information about params for the tables. - * <p> - * The key of the map represents the table id. - * The value is a dto {@link TableConfigDto} holding the properties. - */ - private Map<Long, TableConfigDto> tableConfigDto; - private Integer refreshRate; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/HistogramConfigDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/HistogramConfigDto.java deleted file mode 100644 index be6f3b21e8e0920671fb5ba2746a622818f1119a..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/HistogramConfigDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class HistogramConfigDto { - private Integer min; - private Integer max; - private Long size; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/PieChartConfigDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/PieChartConfigDto.java deleted file mode 100644 index 487d7042bf24244083c3297ca21e463ec5f08a26..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/PieChartConfigDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PieChartConfigDto { - private String limit; - private String decimalPlace; - private Long size; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TableConfigDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TableConfigDto.java deleted file mode 100644 index 0b21d8571da0b964f6f95d924546e86e65b55de8..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TableConfigDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TableConfigDto { - private Long size; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeDto.java deleted file mode 100644 index f78cb3d1c57d9a6a0f47a2de53728fe9c81a59bd..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TimeDto { - private Long yearColId; - private Long monthColId; - private Long dayColId; - private Long hourColId; - private Long minuteColId; - private Long secondColId; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeSeriesDto.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeSeriesDto.java deleted file mode 100644 index dd4356d70b9e1e31f8b8ada04afee215b82d72de..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/dto/TimeSeriesDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TimeSeriesDto { - private TimeDto timeDto; - private Long valueColId; - private Long size; -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DashboardEndpoint.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DashboardEndpoint.java deleted file mode 100644 index bd9cc68b24a39edf8e1d90d5ef19433286e301bd..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DashboardEndpoint.java +++ /dev/null @@ -1,92 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.dto.DashboardConfigDto; -import at.tuwien.service.DashboardService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import jakarta.validation.constraints.NotBlank; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@Log4j2 -@RestController -@CrossOrigin(origins = "*") -@RequestMapping(path = "/api/dashboard") -public class DashboardEndpoint { - private final DashboardService dashboardService; - - @Autowired - public DashboardEndpoint(DashboardService dashboardService) { - this.dashboardService = dashboardService; - } - - @PostMapping("/generate/{dbId}") - @Operation(summary = "Generate dashboard", - description = "Generates dashboard for a provided database id.", - security = {@SecurityRequirement(name = "bearerAuth")}) - @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Created a new dashboard", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = String.class))}), - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public ResponseEntity<String> generateDashboard(@RequestHeader("Authorization") String token, - @NotBlank @PathVariable("dbId") Long dbId, - @RequestBody(required = false) DashboardConfigDto configDto) { - - return ResponseEntity.status(HttpStatus.CREATED) - .body(this.dashboardService.generateDashboard(dbId, token, configDto)); - } - - @RequestMapping(value = "/exists/{dbId}", method = {RequestMethod.GET, RequestMethod.HEAD}) - @Operation(summary = "Check if dashboard exists", - description = "Checks if a dashboard for a provided database id exists.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Returns Boolean if dashboard exsists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = Boolean.class))}), - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public ResponseEntity<Boolean> checkIfDashboardExists(@NotBlank @PathVariable("dbId") Long dbId) { - return ResponseEntity.status(HttpStatus.OK) - .body(this.dashboardService.checkIfDashboardExists(dbId)); - } - - @DeleteMapping("/{dbId}") - @Operation(summary = "Delete dashboard in Grafana", - description = "Deletes a dashboard in Grafana for a provided id.", - security = {@SecurityRequirement(name = "bearerAuth")}) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Deleted grafana dashbaord"), - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<Void> removeDashboard(@NotBlank @PathVariable("dbId") Long dbId) { - this.dashboardService.removeDashboard(dbId); - return ResponseEntity.status(HttpStatus.ACCEPTED).build(); - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DataEndpoint.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DataEndpoint.java deleted file mode 100644 index 6e698347df1c0ab5ebb6d16d5e816c09ca4aaf9c..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/endpoints/DataEndpoint.java +++ /dev/null @@ -1,157 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.panels.*; -import at.tuwien.service.DataService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import jakarta.validation.constraints.NotBlank; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Map; - -@Slf4j -@RestController -@CrossOrigin(origins = "*") -@RequestMapping(path = DataEndpoint.API_PREFIX) -public class DataEndpoint { - public static final String API_PREFIX = "/api/dashboard/data"; - private final DataService dataService; - private static final Long DEFAULT_RESPONSE_SIZE = 100L; - - @Autowired - public DataEndpoint(DataService dataService) { - this.dataService = dataService; - } - - @GetMapping(PieChartPanel.RELATIVE_PATH + "/{dbId}/{viewId}") - @Operation(summary = "Returns data for Pie Chart", - description = "Returns data for Pie Chart for a specific database and view") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public Map<String, Object> getPieChart(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long viewId, - @RequestParam(required = false) Long size) { - if (size == null) { - size = DEFAULT_RESPONSE_SIZE; - } - - return dataService.getPieChartData(dbId, viewId, size); - } - - @GetMapping(CntAllPanel.RELATIVE_PATH + "/{dbId}/{viewId}") - @Operation(summary = "Returns data for the Count All Stats Visualization", - description = "Returns data for the Count All Stats Visualization for a specific database and view") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public Map<String, Object> getCntAll(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long viewId) { - - return dataService.getCntAllData(dbId, viewId); - } - - @GetMapping(TablePanel.RELATIVE_PATH + "/{dbId}/{tableId}") - @Operation(summary = "Returns data for the Table Visualization", - description = "Returns data for the Table Visualization for a specific database and table") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public List<Map<String, Object>> getTable(@NotBlank @PathVariable Long dbId, - @NotBlank @PathVariable Long tableId, - @RequestParam(required = false) Long size) { - if (size == null) { - size = DEFAULT_RESPONSE_SIZE; - } - - return dataService.getTableData(dbId, tableId, size); - } - - @GetMapping(HistogramPanel.RELATIVE_PATH + "/{dbId}/{viewId}") - @Operation(summary = "Returns data for the Histogram Visualization", - description = "Returns data for the Histogram Visualization for a specific database and view") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public Map<String, List<Object>> getHistogram(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long viewId, - @RequestParam(required = false) Long size) { - if (size == null) { - size = DEFAULT_RESPONSE_SIZE; - } - - return dataService.getHistogramData(dbId, viewId, size); - } - - @GetMapping(StatsPanel.RELATIVE_PATH + "/{dbId}/{tableId}") - @Operation(summary = "Returns data for the Stats Visualization", - description = "Returns data for the Stats Visualization for a specific database and table") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public List<Map<String, Object>> getStats(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long tableId) { - return dataService.getStatsData(dbId, tableId); - } - - @GetMapping(TimeSeriesPanel.RELATIVE_PATH + "/{dbId}/{viewId}") - @Operation(summary = "Returns data for the Time Visualization", - description = "Returns data for the Time Visualization for a specific database and view") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public Map<String, List<Map<String, Object>>> getTimeSeries(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long viewId, - @RequestParam(required = false) Long size) { - if (size == null) { - size = DEFAULT_RESPONSE_SIZE; - } - return dataService.getTimeSeriesData(dbId, viewId, size); - } - - @GetMapping(MultiTimeSeriesPanel.RELATIVE_PATH + "/{dbId}/{viewId}") - @Operation(summary = "Returns data for the Multi Time Visualization", - description = "Returns data for the MUlti Time Visualization for a specific database and view") - @ApiResponses(value = { - @ApiResponse(responseCode = "500", - description = "Internal error", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public Map<String, List<Map<String, Object>>> getMultiTimeSeries(@NotBlank @PathVariable Long dbId, @NotBlank @PathVariable Long viewId, - @RequestParam(required = false) Long size) { - if (size == null) { - size = DEFAULT_RESPONSE_SIZE; - } - return dataService.getMultiTimeSeriesData(dbId, viewId, size); - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ContainerNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ContainerNotFoundException.java deleted file mode 100644 index a15fcfb8a9ebd2790036be9c1df295176d339ee3..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ContainerNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class ContainerNotFoundException extends Exception { - - public ContainerNotFoundException(String message) { - super(message); - } - - public ContainerNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public ContainerNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseMalformedException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseMalformedException.java deleted file mode 100644 index 1ead17c389ee59b69ce6c6c4d994885b2b4e153c..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseMalformedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class DatabaseMalformedException extends Exception { - - public DatabaseMalformedException(String message) { - super(message); - } - - public DatabaseMalformedException(String message, Throwable thr) { - super(message, thr); - } - - public DatabaseMalformedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java deleted file mode 100644 index cb9075c80af9cc4156905350506af772f19bf49a..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class DatabaseNotFoundException extends Exception { - - public DatabaseNotFoundException(String message) { - super(message); - } - - public DatabaseNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public DatabaseNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseUnavailableException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseUnavailableException.java deleted file mode 100644 index e584390ec9b1fb5ad51529a9c32eade744a35681..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/DatabaseUnavailableException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class DatabaseUnavailableException extends Exception { - - public DatabaseUnavailableException(String message) { - super(message); - } - - public DatabaseUnavailableException(String message, Throwable thr) { - super(message, thr); - } - - public DatabaseUnavailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/FormatNotAvailableException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/FormatNotAvailableException.java deleted file mode 100644 index 4ca41e346daebd26e5e369d72e8b31260e791d1b..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/FormatNotAvailableException.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.io.IOException; - -@ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE) -public class FormatNotAvailableException extends IOException { - - public FormatNotAvailableException(String msg) { - super(msg); - } - - public FormatNotAvailableException(String msg, Throwable thr) { - super(msg + ": " + thr.getLocalizedMessage(), thr); - } - - public FormatNotAvailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/JsonProcessingException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/JsonProcessingException.java deleted file mode 100644 index 66f414018f443dbb63610812797f554badab5783..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/JsonProcessingException.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) -public class JsonProcessingException extends RuntimeException { - - public JsonProcessingException(String message) { - super(message); - } - - public JsonProcessingException(String message, Throwable thr) { - super(message, thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/NotAllowedException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/NotAllowedException.java deleted file mode 100644 index 341b93a6443e06121d8ba639212aa7e69a6da7af..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/NotAllowedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.FORBIDDEN) -public class NotAllowedException extends Exception { - - public NotAllowedException(String message) { - super(message); - } - - public NotAllowedException(String message, Throwable thr) { - super(message, thr); - } - - public NotAllowedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/PaginationException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/PaginationException.java deleted file mode 100644 index b47c66c5b37fd78eabb2a6f056cd8050f81e19d1..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/PaginationException.java +++ /dev/null @@ -1,22 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class PaginationException extends Exception { - - public PaginationException(String msg) { - super(msg); - } - - public PaginationException(String msg, Throwable thr) { - super(msg + ": " + thr.getLocalizedMessage(), thr); - } - - public PaginationException(Throwable thr) { - super(thr); - } - -} - diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryMalformedException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryMalformedException.java deleted file mode 100644 index 4d89f64f9478bc0e4284980233f8b79f4adbbfc8..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryMalformedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class QueryMalformedException extends Exception { - - public QueryMalformedException(String message) { - super(message); - } - - public QueryMalformedException(String message, Throwable thr) { - super(message, thr); - } - - public QueryMalformedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryNotFoundException.java deleted file mode 100644 index 44fcbf4ceebecf53423624e2374ffe2ae0f99c18..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class QueryNotFoundException extends Exception { - - public QueryNotFoundException(String message) { - super(message); - } - - public QueryNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public QueryNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreCreateException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreCreateException.java deleted file mode 100644 index e7166363e02e94facafbee299226ec2f45fcfb9c..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreCreateException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class QueryStoreCreateException extends Exception { - - public QueryStoreCreateException(String message) { - super(message); - } - - public QueryStoreCreateException(String message, Throwable thr) { - super(message, thr); - } - - public QueryStoreCreateException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreGCException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreGCException.java deleted file mode 100644 index d1d25bbde1efbd916c8233de0aaf569d9e86ee3d..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreGCException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class QueryStoreGCException extends Exception { - - public QueryStoreGCException(String message) { - super(message); - } - - public QueryStoreGCException(String message, Throwable thr) { - super(message, thr); - } - - public QueryStoreGCException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreInsertException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreInsertException.java deleted file mode 100644 index 95c621493e7540df465c0715537409b704bada27..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStoreInsertException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class QueryStoreInsertException extends Exception { - - public QueryStoreInsertException(String message) { - super(message); - } - - public QueryStoreInsertException(String message, Throwable thr) { - super(message, thr); - } - - public QueryStoreInsertException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStorePersistException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStorePersistException.java deleted file mode 100644 index b9250ffefced58fa0833db10df630dace773ff46..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/QueryStorePersistException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class QueryStorePersistException extends Exception { - - public QueryStorePersistException(String message) { - super(message); - } - - public QueryStorePersistException(String message, Throwable thr) { - super(message, thr); - } - - public QueryStorePersistException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RemoteUnavailableException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RemoteUnavailableException.java deleted file mode 100644 index d007a65c02b927515a14b0703d4f0b26b2825a39..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RemoteUnavailableException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class RemoteUnavailableException extends Exception { - - public RemoteUnavailableException(String message) { - super(message); - } - - public RemoteUnavailableException(String message, Throwable thr) { - super(message, thr); - } - - public RemoteUnavailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RestTemplateExchangeException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RestTemplateExchangeException.java deleted file mode 100644 index 6724c3f260f60ac889d2cd6e86b46a1ca683ec95..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/RestTemplateExchangeException.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) -public class RestTemplateExchangeException extends RuntimeException { - - public RestTemplateExchangeException(String message) { - super(message); - } - - public RestTemplateExchangeException(String message, Throwable thr) { - super(message, thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceConnectionException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceConnectionException.java deleted file mode 100644 index ec36c03e3a0b4cca4b8bd495ba94d8e5bb05ac62..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceConnectionException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_GATEWAY) -public class ServiceConnectionException extends Exception { - - public ServiceConnectionException(String msg) { - super(msg); - } - - public ServiceConnectionException(String msg, Throwable thr) { - super(msg + ": " + thr.getLocalizedMessage(), thr); - } - - public ServiceConnectionException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceException.java deleted file mode 100644 index 56004d6a47361250a248cc1d89b155a47ad295d2..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/ServiceException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class ServiceException extends Exception { - - public ServiceException(String message) { - super(message); - } - - public ServiceException(String message, Throwable thr) { - super(message, thr); - } - - public ServiceException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarExportException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarExportException.java deleted file mode 100644 index 88ac95e2e9476d4b4855ae6aa8c3d150fe292994..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarExportException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class SidecarExportException extends Exception { - - public SidecarExportException(String message) { - super(message); - } - - public SidecarExportException(String message, Throwable thr) { - super(message, thr); - } - - public SidecarExportException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarImportException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarImportException.java deleted file mode 100644 index 8dd9a832be21fea6442043e500a3a77eb1399f64..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SidecarImportException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class SidecarImportException extends Exception { - - public SidecarImportException(String message) { - super(message); - } - - public SidecarImportException(String message, Throwable thr) { - super(message, thr); - } - - public SidecarImportException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageNotFoundException.java deleted file mode 100644 index 79c3608adcdcfb9d2582e92cb9950f814db97991..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class StorageNotFoundException extends Exception { - - public StorageNotFoundException(String message) { - super(message); - } - - public StorageNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public StorageNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageUnavailableException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageUnavailableException.java deleted file mode 100644 index 96a33f11754716229f87e88d94434b2d6b692b4d..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/StorageUnavailableException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE) -public class StorageUnavailableException extends Exception { - - public StorageUnavailableException(String message) { - super(message); - } - - public StorageUnavailableException(String message, Throwable thr) { - super(message, thr); - } - - public StorageUnavailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SyncDatabaseNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SyncDatabaseNotFoundException.java deleted file mode 100644 index f0bedd46ece4c4ff98917aea36b4fc7c84c651e7..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/SyncDatabaseNotFoundException.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) -public class SyncDatabaseNotFoundException extends RuntimeException { - - public SyncDatabaseNotFoundException(String message) { - super(message); - } - - public SyncDatabaseNotFoundException(String message, Throwable thr) { - super(message, thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableExistsException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableExistsException.java deleted file mode 100644 index dbbe0b86e18088992dd7da0236ffcca7b9c8181a..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableExistsException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.CONFLICT) -public class TableExistsException extends Exception { - - public TableExistsException(String message) { - super(message); - } - - public TableExistsException(String message, Throwable thr) { - super(message, thr); - } - - public TableExistsException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableMalformedException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableMalformedException.java deleted file mode 100644 index 6c959fc55b7a68c2a1a6dc5a9cd7b3df5f1f4a86..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableMalformedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class TableMalformedException extends Exception { - - public TableMalformedException(String message) { - super(message); - } - - public TableMalformedException(String message, Throwable thr) { - super(message, thr); - } - - public TableMalformedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableNotFoundException.java deleted file mode 100644 index 05547bdfe27b63054ef282a79dfeababe11f2618..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/TableNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class TableNotFoundException extends Exception { - - public TableNotFoundException(String message) { - super(message); - } - - public TableNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public TableNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/UserNotFoundException.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/UserNotFoundException.java deleted file mode 100644 index f3bece1e142206253a058e34d4a8e27ece6103a5..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/exception/UserNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class UserNotFoundException extends Exception { - - public UserNotFoundException(String message) { - super(message); - } - - public UserNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public UserNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/KeycloakGateway.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/KeycloakGateway.java deleted file mode 100644 index a05a75a6ff890feba33e1d14f2bd1a9407845861..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/KeycloakGateway.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.api.keycloak.TokenDto; -import at.tuwien.exception.ServiceConnectionException; -import at.tuwien.exception.ServiceException; - -public interface KeycloakGateway { - - TokenDto obtainUserToken(String username, String password) throws ServiceConnectionException, ServiceException; - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java deleted file mode 100644 index 76f3e83cef138b8d64151757e303fd05555a4591..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.api.keycloak.TokenDto; -import at.tuwien.config.KeycloakConfig; -import at.tuwien.exception.ServiceConnectionException; -import at.tuwien.exception.ServiceException; -import at.tuwien.gateway.KeycloakGateway; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@Log4j2 -@Service -public class KeycloakGatewayImpl implements KeycloakGateway { - - private final RestTemplate restTemplate; - private final KeycloakConfig keycloakConfig; - - public KeycloakGatewayImpl(@Qualifier("keycloakRestTemplate") RestTemplate restTemplate, - KeycloakConfig keycloakConfig) { - this.restTemplate = restTemplate; - this.keycloakConfig = keycloakConfig; - } - - public TokenDto obtainToken() throws ServiceConnectionException, ServiceException { - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); - payload.add("username", keycloakConfig.getKeycloakUsername()); - payload.add("password", keycloakConfig.getKeycloakPassword()); - payload.add("grant_type", "password"); - payload.add("client_id", "admin-cli"); - final String url = keycloakConfig.getKeycloakEndpoint() + "/realms/master/protocol/openid-connect/token"; - log.debug("request admin token from url {}", url); - final ResponseEntity<TokenDto> response; - try { - response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to obtain admin token: {}", e.getMessage()); - throw new ServiceConnectionException("Failed to obtain admin token: " + e.getMessage(), e); - } catch (Exception e) { - log.error("Failed to obtain admin token: remote host answered unexpected: {}", e.getMessage(), e); - throw new ServiceException("Failed to obtain admin token: remote host answered unexpected: " + e.getMessage(), e); - } - return response.getBody(); - } - - @Override - public TokenDto obtainUserToken(String username, String password) throws ServiceConnectionException, ServiceException { - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); - payload.add("username", username); - payload.add("password", password); - payload.add("grant_type", "password"); - payload.add("scope", "openid roles attributes"); - payload.add("client_id", keycloakConfig.getKeycloakClient()); - payload.add("client_secret", keycloakConfig.getKeycloakClientSecret()); - final String url = keycloakConfig.getKeycloakEndpoint() + "/realms/dbrepo/protocol/openid-connect/token"; - log.debug("request user token from url {}", url); - final ResponseEntity<TokenDto> response; - try { - response = new RestTemplate() - .exchange(url, HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to obtain user token: {}", e.getMessage()); - throw new ServiceConnectionException("Failed to obtain user token: " + e.getMessage(), e); - } catch (Exception e) { - log.error("Failed to obtain user token: unexpected response: {}", e.getMessage(), e); - throw new ServiceException("Failed to obtain user token: unexpected response: " + e.getMessage(), e); - } - return response.getBody(); - } - -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/handlers/DashboardApiExceptionHandler.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/handlers/DashboardApiExceptionHandler.java deleted file mode 100644 index 80c834f77c8078d9c7d99bddeb438229caabe726..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/handlers/DashboardApiExceptionHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package at.tuwien.handlers; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.exception.RestTemplateExchangeException; -import at.tuwien.exception.JsonProcessingException; -import at.tuwien.exception.SyncDatabaseNotFoundException; -import io.swagger.v3.oas.annotations.Hidden; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Log4j2 -@ControllerAdvice -public class DashboardApiExceptionHandler { - - @Hidden - @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(JsonProcessingException.class) - public ResponseEntity<ApiErrorDto> handle(JsonProcessingException e) { - return genericHandle(e.getClass(), e.getLocalizedMessage()); - } - - @Hidden - @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(RestTemplateExchangeException.class) - public ResponseEntity<ApiErrorDto> handle(RestTemplateExchangeException e) { - return genericHandle(e.getClass(), e.getLocalizedMessage()); - } - - @Hidden - @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(SyncDatabaseNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(SyncDatabaseNotFoundException e) { - return genericHandle(e.getClass(), e.getLocalizedMessage()); - } - - private ResponseEntity<ApiErrorDto> genericHandle(Class<?> exceptionClass, String message) { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Content-Type", "application/problem+json"); - final ResponseStatus annotation = exceptionClass.getAnnotation(ResponseStatus.class); - final ApiErrorDto response = ApiErrorDto.builder() - .status(annotation.code()) - .message(message) - .code(annotation.reason()) - .build(); - return new ResponseEntity<>(response, headers, response.getStatus()); - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java deleted file mode 100644 index 78fb5adc61fd2420cfc62e72cb4aa4c700c3b82b..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java +++ /dev/null @@ -1,55 +0,0 @@ -package at.tuwien.interceptor; - -import at.tuwien.api.keycloak.TokenDto; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.*; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; - -@Log4j2 -public class KeycloakInterceptor implements ClientHttpRequestInterceptor { - - private final String adminUsername; - private final String adminPassword; - private final String keycloakEndpoint; - - public KeycloakInterceptor(String adminUsername, String adminPassword, String keycloakEndpoint) { - this.adminUsername = adminUsername; - this.adminPassword = adminPassword; - this.keycloakEndpoint = keycloakEndpoint; - } - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) - throws IOException { - final RestTemplate restTemplate = new RestTemplate(); - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); - payload.add("username", adminUsername); - payload.add("password", adminPassword); - payload.add("grant_type", "password"); - payload.add("client_id", "admin-cli"); - final ResponseEntity<TokenDto> response; - try { - response = restTemplate.exchange(keycloakEndpoint + "/realms/master/protocol/openid-connect/token", - HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to obtain admin token: {}", e.getMessage()); - return execution.execute(request, body); - } - if (response.getBody() == null) { - return execution.execute(request, body); - } - request.getHeaders().set("Authorization", "Bearer " + response.getBody().getAccessToken()); - return execution.execute(request, body); - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/AbstractPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/AbstractPanel.java deleted file mode 100644 index 7d45e439226cdb82abc8c87d99f21b19461c57d7..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/AbstractPanel.java +++ /dev/null @@ -1,47 +0,0 @@ -package at.tuwien.panels; - -import lombok.Setter; - -public abstract class AbstractPanel { - @Setter - protected static String dataEndpoint; - public static final String DATASRC_UID = "infinityDataSrc"; - - protected static int x; - protected static int y; - private static int prevHeight = -1; - - public static void resetCoordinates() { - x = 0; - y = 0; - } - - public static void addRowPlaceHolder() { - y += 1; - } - - public static void markNewRow() { - x = 0; - } - - - public static void handleOverflow(int height, int width) { - if ( (x + width) > 24) { - x = 0; - y += prevHeight == -1 ? height : prevHeight; - prevHeight = height; - } - } - - public static void updateCoords(int height, int width) { - x += width; - - if (x > 24) { - x = 0; - y += prevHeight == -1 ? height : prevHeight; - } - prevHeight = height; - } - - public abstract String getConstructedPanel(); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/CntAllPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/CntAllPanel.java deleted file mode 100644 index f5af7d56e4afb6047b2b1bf6c18ea21a5ff1fcaa..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/CntAllPanel.java +++ /dev/null @@ -1,69 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class CntAllPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/cntAll"; - private static final int HEIGHT = 8; - private static final int WIDTH = 5; - private final String dataAPI; - - public CntAllPanel(Long dbId, Long vId) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, vId); - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = "{\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"fieldConfig\": {\n" + - " \"defaults\": {\n" + - " \"color\": {\n" + - " \"fixedColor\": \"#FFFFFF\",\n" + - " \"mode\": \"fixed\"\n" + - " },\n" + - " \"mappings\": []\n" + - " },\n" + - " \"overrides\": []\n" + - " },\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"columns\": [],\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"filters\": [],\n" + - " \"format\": \"table\",\n" + - " \"global_query_id\": \"\",\n" + - " \"refId\": \"A\",\n" + - " \"root_selector\": \"\",\n" + - " \"source\": \"url\",\n" + - " \"type\": \"json\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"data\": \"\",\n" + - " \"method\": \"GET\"\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"title\": \"Total elements\",\n" + - " \"type\": \"stat\"\n" + - " }"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/Dashboard.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/Dashboard.java deleted file mode 100644 index 322485b9094dc76b8867b75d6c2b13f052796e22..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/Dashboard.java +++ /dev/null @@ -1,29 +0,0 @@ -package at.tuwien.panels; - -import java.util.List; - -public class Dashboard { - - public String getDashboard(List<String> panels, Long dbId, int refreshrate) { - - return "{\n" + - " \"dashboard\": {\n" + - " \"id\": null,\n" + - " \"uid\": \"" + dbId + "\",\n" + - " \"title\": \"automated dashboard_" + dbId + "\",\n" + - " \"tags\": [\n" + - " \"templated\"\n" + - " ],\n" + - " \"timezone\": \"browser\",\n" + - " \"schemaVersion\": 16,\n" + - " \"refresh\": \"" + (refreshrate == 0 ? "" : refreshrate + "s") + "\",\n" + - " \"panels\": [" + - String.join(", ", panels) + - " ]" + - " \n" + - " },\n" + - " \"message\": \"automated creation of dashboard\",\n" + - " \"overwrite\": false\n" + - "}"; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/HistogramPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/HistogramPanel.java deleted file mode 100644 index e021f0ab6b98b20eef7694c5b862f014db2cd870..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/HistogramPanel.java +++ /dev/null @@ -1,110 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.dto.HistogramConfigDto; -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class HistogramPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/histogram"; - private static final int HEIGHT = 8; - private static final int WIDTH = 5; - private String dataAPI; - private final String colName; - private Integer min; - private Integer max; - - public HistogramPanel(Long dbId, Long vId, String colName, HistogramConfigDto configDto) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, vId); - this.colName = colName; - - if (configDto != null) { - if (configDto.getMin() != null) { - this.min = configDto.getMin(); - } - - if (configDto.getMax() != null) { - this.max = configDto.getMax(); - } - - if (configDto.getSize() != null) { - dataAPI += String.format("?size=%d", configDto.getSize()); - } - } - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = "{\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"fieldConfig\": {\n" + - " \"defaults\": {\n" + - " \"color\": {\n" + - " \"mode\": \"palette-classic\"\n" + - " },\n" + - " \"custom\": {\n" + - " \"fillOpacity\": 80,\n" + - " \"gradientMode\": \"none\",\n" + - " \"hideFrom\": {\n" + - " \"legend\": false,\n" + - " \"tooltip\": true,\n" + - " \"viz\": false\n" + - " },\n" + - " \"lineWidth\": 1\n" + - " },\n" + - " \"mappings\": [],\n" + - " \"max\": " + ((max == null) ? "null" : max) + ",\n" + - " \"min\": " + ((min == null) ? "null" : min) + "\n" + - " },\n" + - " \"overrides\": []\n" + - " },\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - " \"id\": null,\n" + - " \"description\": \"" + "Each bar represents a bucket, and the bar height represents " + - "the frequency of the values from the column " + this.colName + " that fell into that bucket's interval.\",\n" + - " \"options\": {\n" + - " \"legend\": {\n" + - " \"calcs\": [],\n" + - " \"displayMode\": \"list\",\n" + - " \"placement\": \"bottom\",\n" + - " \"showLegend\": false\n" + - " }\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"columns\": [],\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"filters\": [],\n" + - " \"format\": \"table\",\n" + - " \"global_query_id\": \"\",\n" + - " \"refId\": \"A\",\n" + - " \"root_selector\": \"values\",\n" + - " \"source\": \"url\",\n" + - " \"type\": \"json\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"data\": \"\",\n" + - " \"method\": \"GET\"\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"title\": \"" + "Distribution of " + this.colName + " \",\n" + - " \"type\": \"histogram\"\n" + - " }"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/MultiTimeSeriesPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/MultiTimeSeriesPanel.java deleted file mode 100644 index 70be0650ee1b026702d74c01fb997b7c368210db..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/MultiTimeSeriesPanel.java +++ /dev/null @@ -1,90 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class MultiTimeSeriesPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/multitimeseries"; - public static final String VIEW_MULTI_TIMECOL = "timecol"; - public static final String VIEW_MULTI_SELECTOR_TIME = "time"; - public static final String VIEW_MULTI_SELECTOR_VALUE = "value"; - public static final String VIEW_MULTI_SELECTOR_NAME = "name"; - - - private static final int HEIGHT = 8; - private static final int WIDTH = 5; - private String dataAPI; - - public MultiTimeSeriesPanel(Long dbId, Long vId) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, vId); - dataAPI += String.format("?size=%d", 100); - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = " {\n" + - "\"datasource\": {\n" + - " \"uid\": \"" + DATASRC_UID + "\",\n" + - " \"type\": \"yesoreyeram-infinity-datasource\"\n" + - " },\n" + - " \"type\": \"timeseries\",\n" + - " \"title\": \"Time Series\",\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - "\"options\": {\n" + - " \"legend\": {\n" + - " \"calcs\": [],\n" + - " \"displayMode\": \"list\",\n" + - " \"placement\": \"bottom\",\n" + - " \"showLegend\": true\n" + - " },\n" + - " \"tooltip\": {\n" + - " \"mode\": \"single\",\n" + - " \"sort\": \"none\"\n" + - " }\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"refId\": \"A\",\n" + - " \"type\": \"json\",\n" + - " \"source\": \"url\",\n" + - " \"format\": \"timeseries\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"method\": \"GET\",\n" + - " \"data\": \"\"\n" + - " },\n" + - " \"root_selector\": \"time_series\",\n" + - " \"columns\": [\n" + - " {\n" + - " \"selector\": \"" + VIEW_MULTI_SELECTOR_TIME + "\",\n" + - " \"type\": \"timestamp\"\n" + - " },\n" + - " {\n" + - " \"selector\": \"" + VIEW_MULTI_SELECTOR_VALUE + "\",\n" + - " \"type\": \"number\"\n" + - " },\n" + - " {\n" + - " \"selector\": \"" + VIEW_MULTI_SELECTOR_NAME + "\",\n" + - " \"type\": \"string\"\n" + - " }\n" + - " ],\n" + - " \"filters\": [],\n" + - " \"global_query_id\": \"\"\n" + - " }\n" + - " ]}"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/PieChartPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/PieChartPanel.java deleted file mode 100644 index 3b98dec4d0b0bfe94461e6d06b791420c8475ed0..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/PieChartPanel.java +++ /dev/null @@ -1,110 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.dto.PieChartConfigDto; -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class PieChartPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/piechart"; - public static final String VIEW_PIE_PERCENTAGE_COL = "percentage"; - - private static final int HEIGHT = 8; - private static final int WIDTH = 7; - private String dataAPI; - private final String colName; - - public PieChartPanel(Long dbId, Long vId, String colName, PieChartConfigDto config) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, vId); - this.colName = colName; - - if (config != null && config.getSize() != null) { - dataAPI += String.format("?size=%d", config.getSize()); - } - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = "{\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"fieldConfig\": {\n" + - " \"defaults\": {\n" + - " \"color\": {\n" + - " \"mode\": \"palette-classic\"\n" + - " },\n" + - " \"custom\": {\n" + - " \"hideFrom\": {\n" + - " \"legend\": false,\n" + - " \"tooltip\": false,\n" + - " \"viz\": false\n" + - " }\n" + - " },\n" + - " \"mappings\": []\n" + - " },\n" + - " \"overrides\": []\n" + - " },\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - " \"options\": {\n" + - " \"displayLabels\": [\n" + - " \"percent\"\n" + - " ],\n" + - " \"legend\": {\n" + - " \"calcs\": [],\n" + - " \"displayMode\": \"list\",\n" + - " \"placement\": \"right\",\n" + - " \"showLegend\": true,\n" + - " \"values\": [\n" + - " \"value\"\n" + - " ]\n" + - " },\n" + - " \"pieType\": \"pie\",\n" + - " \"reduceOptions\": {\n" + - " \"calcs\": [\n" + - " \"lastNotNull\"\n" + - " ],\n" + - " \"fields\": \"\",\n" + - " \"values\": false\n" + - " },\n" + - " \"tooltip\": {\n" + - " \"mode\": \"single\",\n" + - " \"sort\": \"none\"\n" + - " }\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"columns\": [],\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"filters\": [],\n" + - " \"format\": \"table\",\n" + - " \"global_query_id\": \"\",\n" + - " \"refId\": \"A\",\n" + - " \"root_selector\": \"\",\n" + - " \"source\": \"url\",\n" + - " \"type\": \"json\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"data\": \"\",\n" + - " \"method\": \"GET\"\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"title\": \"Distribution of Most Frequent " + this.colName + "\",\n" + - " \"type\": \"piechart\"\n" + - " }"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/RowPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/RowPanel.java deleted file mode 100644 index 94ae55b74b10243a0daa8085acc602663a11adea..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/RowPanel.java +++ /dev/null @@ -1,52 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.exception.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; - -import java.util.List; - -@Log4j2 -public class RowPanel extends AbstractPanel { - private static final int HEIGHT = 1; - private static final int WIDTH = 24; - private final String name; - private final List<String> tablePanels; - private final ObjectMapper mapper; - - public RowPanel(String name, List<String> tablePanels) { - this.name = name; - this.tablePanels = tablePanels; - this.mapper = new ObjectMapper(); - } - - @Override - public String getConstructedPanel() { - - int rowY = -1; - try{ - JsonNode rootNode = mapper.readTree(tablePanels.get(0)); - rowY = rootNode.path("gridPos").path("y").asInt() - 1; - } catch (Exception e) { - log.debug("failed to read json of table panel"); - throw new JsonProcessingException("Failed to parse table panel"); - } - - return "{\n" + - " \"collapsed\": true,\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + 0 + ",\n" + - " \"y\": " + rowY + "\n" + - " },\n" + - " \"id\": null,\n" + - " \"panels\": [" + - String.join(", ", tablePanels) + - "],\n" + - " \"title\": \"" + name + "\",\n" + - " \"type\": \"row\"\n" + - " }"; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/StatsPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/StatsPanel.java deleted file mode 100644 index 81e920433647d9ee9bf2b2098ac85e2429c52f88..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/StatsPanel.java +++ /dev/null @@ -1,183 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class StatsPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/stats"; - public static final String HEADER_COL = "column"; - public static final String HEADER_MIN = "min"; - public static final String HEADER_MAX = "max"; - public static final String HEADER_STDDEV = "stddev"; - public static final String HEADER_AVG = "median"; - - private static final int HEIGHT = 8; - private static final int WIDTH = 9; - private final String dataAPI; - private final String name; - - public StatsPanel(Long dbId, Long tId, String name) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, tId); - this.name = name; - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = " {\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"fieldConfig\": {\n" + - " \"defaults\": {\n" + - " \"custom\": {\n" + - " \"align\": \"auto\",\n" + - " \"filterable\": \"true\",\n" + - " \"cellOptions\": {\n" + - " \"type\": \"auto\"\n" + - " },\n" + - " \"inspect\": false\n" + - " },\n" + - " \"mappings\": [],\n" + - " \"thresholds\": {\n" + - " \"mode\": \"absolute\",\n" + - " \"steps\": [\n" + - " {\n" + - " \"color\": \"green\",\n" + - " \"value\": null\n" + - " },\n" + - " {\n" + - " \"color\": \"red\",\n" + - " \"value\": 80\n" + - " }\n" + - " ]\n" + - " }\n" + - " },\n" + - " \"overrides\": [\n" + - " {\n" + - " \"matcher\": {\n" + - " \"id\": \"byName\",\n" + - " \"options\": \"" + HEADER_COL + "\"\n" + - " },\n" + - " \"properties\": [\n" + - " {\n" + - " \"id\": \"custom.align\",\n" + - " \"value\": \"center\"\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"matcher\": {\n" + - " \"id\": \"byName\",\n" + - " \"options\": \"" + HEADER_MIN + "\"\n" + - " },\n" + - " \"properties\": [\n" + - " {\n" + - " \"id\": \"custom.width\",\n" + - " \"value\": 115\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"matcher\": {\n" + - " \"id\": \"byName\",\n" + - " \"options\": \"" + HEADER_MAX + "\"\n" + - " },\n" + - " \"properties\": [\n" + - " {\n" + - " \"id\": \"custom.width\",\n" + - " \"value\": 115\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"matcher\": {\n" + - " \"id\": \"byName\",\n" + - " \"options\": \"" + HEADER_AVG + "\"\n" + - " },\n" + - " \"properties\": [\n" + - " {\n" + - " \"id\": \"custom.width\",\n" + - " \"value\": 115\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"matcher\": {\n" + - " \"id\": \"byName\",\n" + - " \"options\": \"" + HEADER_STDDEV + "\"\n" + - " },\n" + - " \"properties\": [\n" + - " {\n" + - " \"id\": \"custom.width\",\n" + - " \"value\": 115\n" + - " }\n" + - " ]\n" + - " }\n" + - " ]\n" + - " },\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - " \"options\": {\n" + - " \"cellHeight\": \"sm\",\n" + - " \"footer\": {\n" + - " \"countRows\": false,\n" + - " \"fields\": \"\",\n" + - " \"reducer\": [\n" + - " \"sum\"\n" + - " ],\n" + - " \"show\": false\n" + - " },\n" + - " \"showHeader\": true\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"columns\": [],\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"filters\": [],\n" + - " \"format\": \"table\",\n" + - " \"global_query_id\": \"\",\n" + - " \"refId\": \"A\",\n" + - " \"root_selector\": \"\",\n" + - " \"source\": \"url\",\n" + - " \"type\": \"json\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"data\": \"\",\n" + - " \"method\": \"GET\"\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"title\": \"Stats for " + name + "\",\n" + - " \"transformations\": [\n" + - " {\n" + - " \"id\": \"organize\",\n" + - " \"options\": {\n" + - " \"excludeByName\": {},\n" + - " \"includeByName\": {},\n" + - " \"indexByName\": {\n" + - " \"" + HEADER_AVG + "\": 3,\n" + - " \"" + HEADER_COL + "\": 0,\n" + - " \"" + HEADER_STDDEV + "\": 4,\n" + - " \"" + HEADER_MAX + "\": 2,\n" + - " \"" + HEADER_MIN + "\": 1\n" + - " }\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"type\": \"table\"\n" + - " }"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TablePanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TablePanel.java deleted file mode 100644 index 7295f1528d750c6bbdc26708e075535a4162dfe7..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TablePanel.java +++ /dev/null @@ -1,73 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class TablePanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/tablepanel"; - private static final int HEIGHT = 8; - private static final int WIDTH = 16; - private final String name; - - private String dataAPI; - - public TablePanel(Long dbId, Long tId, String name, Long size) { - this.name = name; - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, tId); - if (size != null) { - dataAPI += String.format("?size=%d", size); - } - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = "{\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"fieldConfig\": {\n" + - " \"defaults\": {\n" + - " \"custom\": {\n" + - " \"filterable\": true\n" + - " }\n" + - " }\n" + - " }," + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - " \"id\": null,\n" + - " \"targets\": [\n" + - " {\n" + - " \"columns\": [],\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"filters\": [],\n" + - " \"format\": \"table\",\n" + - " \"global_query_id\": \"\",\n" + - " \"refId\": \"A\",\n" + - " \"root_selector\": \"\",\n" + - " \"source\": \"url\",\n" + - " \"type\": \"json\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"data\": \"\",\n" + - " \"method\": \"GET\"\n" + - " }\n" + - " }\n" + - " ],\n" + - " \"title\": \"" + name + "\",\n" + - " \"type\": \"table\"\n" + - " }"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TimeSeriesPanel.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TimeSeriesPanel.java deleted file mode 100644 index e0f5b305eaf1716af353aa3497bddc6fb04617a5..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/panels/TimeSeriesPanel.java +++ /dev/null @@ -1,93 +0,0 @@ -package at.tuwien.panels; - -import at.tuwien.endpoints.DataEndpoint; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class TimeSeriesPanel extends AbstractPanel { - public static final String RELATIVE_PATH = "/timeseries"; - public static final String TIME_VAL_COL = "value"; - public static final String TIME_YEAR_COL = "year"; - public static final String TIME_MONTH_COL = "month"; - public static final String TIME_DAY_COL = "day"; - public static final String TIME_HOUR_COL = "hour"; - public static final String TIME_MIN_COL = "min"; - public static final String TIME_SECOND_COL = "sec"; - private final String value; - - private static final int HEIGHT = 8; - private static final int WIDTH = 5; - private String dataAPI; - - public TimeSeriesPanel(Long dbId, Long vId, String value, Long size) { - this.dataAPI = String.format("%s%s%s/%d/%d", dataEndpoint, DataEndpoint.API_PREFIX, RELATIVE_PATH, dbId, vId); - this.value = value; - if (size != null) { - dataAPI += String.format("?size=%d", size); - } - } - - @Override - public String getConstructedPanel() { - handleOverflow(HEIGHT, WIDTH); - String panelJson = " {\n" + - "\"datasource\": {\n" + - " \"uid\": \"" + DATASRC_UID + "\",\n" + - " \"type\": \"yesoreyeram-infinity-datasource\"\n" + - " },\n" + - " \"type\": \"timeseries\",\n" + - " \"title\": \"Time Series\",\n" + - " \"gridPos\": {\n" + - " \"h\": " + HEIGHT + ",\n" + - " \"w\": " + WIDTH + ",\n" + - " \"x\": " + x + ",\n" + - " \"y\": " + y + "\n" + - " },\n" + - "\"options\": {\n" + - " \"legend\": {\n" + - " \"calcs\": [],\n" + - " \"displayMode\": \"list\",\n" + - " \"placement\": \"bottom\",\n" + - " \"showLegend\": true\n" + - " },\n" + - " \"tooltip\": {\n" + - " \"mode\": \"single\",\n" + - " \"sort\": \"none\"\n" + - " }\n" + - " },\n" + - " \"targets\": [\n" + - " {\n" + - " \"datasource\": {\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"uid\": \"" + DATASRC_UID + "\"" + - " },\n" + - " \"refId\": \"A\",\n" + - " \"type\": \"json\",\n" + - " \"source\": \"url\",\n" + - " \"format\": \"table\",\n" + - " \"url\": \"" + this.dataAPI + "\",\n" + - " \"url_options\": {\n" + - " \"method\": \"GET\",\n" + - " \"data\": \"\"\n" + - " },\n" + - " \"root_selector\": \"time_series\",\n" + - " \"columns\": [\n" + - " {\n" + - " \"selector\": \"time\",\n" + - " \"type\": \"timestamp\"\n" + - " },\n" + - " {\n" + - " \"text\": \"" + value + "\",\n" + - " \"selector\": \"value\",\n" + - " \"type\": \"number\"\n" + - " }\n" + - " ],\n" + - " \"filters\": [],\n" + - " \"global_query_id\": \"\"\n" + - " }\n" + - " ]}"; - - updateCoords(HEIGHT, WIDTH); - return panelJson; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DashboardService.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DashboardService.java deleted file mode 100644 index 26c66d4efeec34e2bc1b1a6fa5bdf7cc84105af2..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DashboardService.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.dto.DashboardConfigDto; - -public interface DashboardService { - String generateDashboard(Long dbId, String token, DashboardConfigDto configDto); - Boolean checkIfDashboardExists(Long dbId); - void removeDashboard(Long dbId); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataService.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataService.java deleted file mode 100644 index 253fde5ebb351e42299f28adcc9ac5575bed99d0..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataService.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.service; - -import java.util.List; -import java.util.Map; - -public interface DataService { - Map<String, Object> getPieChartData(Long dbId, Long viewId, Long size); - Map<String, Object> getCntAllData(Long dbId, Long viewId); - List<Map<String, Object>> getTableData(Long dbId, Long tableId, Long size); - Map<String, List<Object>> getHistogramData(Long dbId, Long viewId, Long size); - List<Map<String, Object>> getStatsData(Long dbId, Long tableId); - Map<String, List<Map<String, Object>>> getTimeSeriesData(Long dbId, Long viewId, Long size); - Map<String, List<Map<String, Object>>> getMultiTimeSeriesData(Long dbId, Long viewId, Long size); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataSourceService.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataSourceService.java deleted file mode 100644 index 070ba1f1d5a0923382d02d0d8da6be4c2e15314d..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/DataSourceService.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.tuwien.service; - - -public interface DataSourceService { - String addDatasource(); - String getDatasource(); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/TableService.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/TableService.java deleted file mode 100644 index 49a5b773dead2d454eb6a34455ac40fe6b03eb8a..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/TableService.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.service; - - -import at.tuwien.api.database.table.TableBriefDto; -import at.tuwien.api.database.table.TableDto; - -import java.util.List; -import java.util.Map; - - -public interface TableService { - - List<TableBriefDto> getAllTables(Long dbId); - TableDto getTableSchemas(Long dbId, Long tId); - List<Map<String, Object>> getTableData(Long dbId, Long tId, Long size); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/ViewGeneratorService.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/ViewGeneratorService.java deleted file mode 100644 index ef7def1323201c0cac13c56b683d42fd50dfd4bf..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/ViewGeneratorService.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.dto.PieChartConfigDto; - -import java.util.List; -import java.util.Map; - -public interface ViewGeneratorService { - Long genCntAllView(Long dbId, String tableName, String token); - Long genPieChartView(Long dbId, String tableName, String colName, PieChartConfigDto config, String token); - Long genHistogramView(Long dbId, String tableName, String colName, String token); - Long genStatisticsView(Long dbId, String tableName, String colName, String token); - Long genTimeSeriesView(Long dbId, String tableName, Map<String, String> timeMap, String token); - Long genMultiTimeSeriesView(Long dbId, String tableName, String timeCol, List<String> numValues, String token); -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DashboardServiceImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DashboardServiceImpl.java deleted file mode 100644 index b373a8c0f8e42550515863c48af066866e7216ad..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DashboardServiceImpl.java +++ /dev/null @@ -1,408 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.TableBriefDto; -import at.tuwien.api.database.table.TableDto; -import at.tuwien.api.database.table.columns.ColumnDto; -import at.tuwien.api.database.table.columns.ColumnTypeDto; -import at.tuwien.dto.*; -import at.tuwien.exception.JsonProcessingException; -import at.tuwien.panels.*; -import at.tuwien.service.*; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.*; - -import java.util.*; -import java.util.stream.Collectors; - -import static at.tuwien.panels.TimeSeriesPanel.*; - -@Log4j2 -@Service -public class DashboardServiceImpl implements DashboardService { - - @Value("${dbrepo.endpoints.grafanaService}") - private String grafanaServiceEndpoint; - - @Value("${application.baseurl}") - private String baseUrl; - - @Value("${dbrepo.endpoints.grafanaPort}") - private String grafanaPort; - - @Value("${dbrepo.grafana.default_refreshrate}") - private int defaultRefreshrate; - - private final RestTemplate grafanaRestTemplate; - private final TableService tableService; - private final DataSourceService dataSourceService; - private final ViewGeneratorService viewGeneratorService; - private String token = ""; - - @Autowired - public DashboardServiceImpl(@Qualifier("grafanaTemplate") RestTemplate grafanaRestTemplate, - DataSourceService dataSourceService, TableService tableService, - ViewGeneratorService viewGeneratorService) { - this.grafanaRestTemplate = grafanaRestTemplate; - this.dataSourceService = dataSourceService; - this.tableService = tableService; - this.viewGeneratorService = viewGeneratorService; - } - - @Override - public Boolean checkIfDashboardExists(Long dbId) { - return this.checkForSync(dbId) != null; - } - - @Override - public void removeDashboard(Long dbId) { - String path = String.format("/api/dashboards/uid/%d", dbId); - - try { - ResponseEntity<String> responseEntity = grafanaRestTemplate.exchange( - path, - HttpMethod.DELETE, - null, - String.class - ); - - log.warn(responseEntity.getBody()); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.DELETE, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.DELETE, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.DELETE, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public String generateDashboard(Long dbId, String token, DashboardConfigDto configDto) { - this.token = token; - addDatasourceIfNotPresent(); - - String url = this.checkForSync(dbId); - if (url != null) { - return String.format("%s:%s%s%n", baseUrl, grafanaPort, url); - } - - Map<Long, List<TimeSeriesDto>> timeSeriesParamMap = new HashMap<>(); - Map<Long, Map<Long, PieChartConfigDto>> pieChartParamMap = new HashMap<>(); - Map<Long, Map<Long, HistogramConfigDto>> histogramParamMap = new HashMap<>(); - Map<Long, TableConfigDto> tableParamMap = new HashMap<>(); - DashboardConfigDto dashboardConfigDto = new DashboardConfigDto(); - - if (configDto != null) { - dashboardConfigDto = configDto; - } - - if (dashboardConfigDto.getTimeSeriesDto() != null) { - timeSeriesParamMap = dashboardConfigDto.getTimeSeriesDto(); - } - - if (dashboardConfigDto.getPieChartConfigDto() != null) { - pieChartParamMap = dashboardConfigDto.getPieChartConfigDto(); - } - - if (dashboardConfigDto.getHistogramConfigDto() != null) { - histogramParamMap = dashboardConfigDto.getHistogramConfigDto(); - } - - if (dashboardConfigDto.getTableConfigDto() != null) { - tableParamMap = dashboardConfigDto.getTableConfigDto(); - } - - List<TableBriefDto> tableIds = this.tableService.getAllTables(dbId); - List<Long> idList = tableIds.stream() - .map(TableBriefDto::getId) - .toList(); - - AbstractPanel.setDataEndpoint(grafanaServiceEndpoint); - AbstractPanel.resetCoordinates(); - List<String> rowPanels = new ArrayList<>(); - List<String> tablePanels; - - for (var tId : idList) { - tablePanels = new ArrayList<>(); - TableDto tableSchema = this.tableService.getTableSchemas(dbId, tId); - String tableName = tableSchema.getInternalName(); - - List<ColumnDto> columns = tableSchema.getColumns(); - Set<Long> primaryKeys = tableSchema.getConstraints().getPrimaryKey().stream() - .map(pkDto -> pkDto.getColumn().getId()) - .collect(Collectors.toSet()); - - columns.removeIf(column -> primaryKeys.contains(column.getId())); - - AbstractPanel.addRowPlaceHolder(); - - if (tableParamMap.containsKey(tId)) { - tablePanels.add(generateTablePanel(dbId, tId, tableName, tableParamMap.get(tId).getSize())); - } else { - tablePanels.add(generateTablePanel(dbId, tId, tableName, null)); - } - - tablePanels.add(generateCntAllPanel(dbId, tableName)); - tablePanels.add(generateStatsPanel(dbId, tId, tableName)); - - if (timeSeriesParamMap.containsKey(tId)) { - addTimeSeriesPanel(dbId, tId, tableName, columns, timeSeriesParamMap, tablePanels); - } - - for (var col : columns) { - ColumnTypeDto columnType = col.getColumnType(); - - if (isNumericalColumn(columnType)) { - - if (histogramParamMap.containsKey(tId) && histogramParamMap.get(tId).containsKey(col.getId())) { - tablePanels.add(generateHistogramPanel(dbId, tableName, col.getInternalName(), histogramParamMap.get(tId).get(col.getId()))); - } else { - tablePanels.add(generateHistogramPanel(dbId, tableName, col.getInternalName(), null)); - } - } else if (isStringColumn(columnType)) { - - if (pieChartParamMap.containsKey(tId) && pieChartParamMap.get(tId).containsKey(col.getId())) { - tablePanels.add(generatePieChartPanel(dbId, tableName, col.getInternalName(), pieChartParamMap.get(tId).get(col.getId()))); - } else { - tablePanels.add(generatePieChartPanel(dbId, tableName, col.getInternalName(), null)); - } - } else if (isTimeStamp(columnType)) { - List<String> numColumns = new ArrayList<>(); - - for(var other : columns) { - if (isNumericalColumn(other.getColumnType())) { - numColumns.add(other.getInternalName()); - } - } - - tablePanels.add(generateMultiTimeSeriesPanel(dbId, tableName, col.getInternalName(), numColumns)); - } - } - - rowPanels.add(new RowPanel(tableName, tablePanels).getConstructedPanel()); - AbstractPanel.markNewRow(); - } - - int refreshRate = defaultRefreshrate; - if (dashboardConfigDto.getRefreshRate() != null) { - refreshRate = dashboardConfigDto.getRefreshRate(); - } - - Dashboard d = new Dashboard(); - String dashboardJson = d.getDashboard(rowPanels, dbId, refreshRate); - - String relativeUrl = createDashboard(dashboardJson); - - return String.format("%s:%s%s%n", baseUrl, grafanaPort, relativeUrl); - } - - private String generateCntAllPanel(Long dbId, String tableName) { - Long viewId = this.viewGeneratorService.genCntAllView(dbId, tableName, this.token); - - CntAllPanel panel = new CntAllPanel(dbId, viewId); - return panel.getConstructedPanel(); - } - - private String generatePieChartPanel(Long dbId, String tableName, String colName, PieChartConfigDto config) { - Long viewId = this.viewGeneratorService.genPieChartView(dbId, tableName, colName, config, this.token); - PieChartPanel panel = new PieChartPanel(dbId, viewId, colName, config); - return panel.getConstructedPanel(); - } - - private String generateTablePanel(Long dbId, Long tId, String tableName, Long size) { - TablePanel panel = new TablePanel(dbId, tId, tableName, size); - return panel.getConstructedPanel(); - } - - private String generateHistogramPanel(Long dbId, String tableName, String colName, HistogramConfigDto config) { - Long viewId = this.viewGeneratorService.genHistogramView(dbId, tableName, colName, this.token); - HistogramPanel panel = new HistogramPanel(dbId, viewId, colName, config); - return panel.getConstructedPanel(); - } - - private String generateStatsPanel(Long dbId, Long tId, String tableName) { - StatsPanel panel = new StatsPanel(dbId, tId, tableName); - return panel.getConstructedPanel(); - } - - private String generateTimeSeriesPanel(Long dbId, String tableName, String valueName, Map<String, String> timeMap, Long size) { - Long viewId = this.viewGeneratorService.genTimeSeriesView(dbId, tableName, timeMap, this.token); - TimeSeriesPanel panel = new TimeSeriesPanel(dbId, viewId, valueName, size); - return panel.getConstructedPanel(); - } - - private String generateMultiTimeSeriesPanel(Long dbId, String tableName, String timeCol, List<String> numValues) { - Long viewId = this.viewGeneratorService.genMultiTimeSeriesView(dbId, tableName, timeCol, numValues, this.token); - MultiTimeSeriesPanel panel = new MultiTimeSeriesPanel(dbId, viewId); - return panel.getConstructedPanel(); - } - - private boolean isNumericalColumn(ColumnTypeDto type) { - return switch (type) { - case TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL -> true; - default -> false; - }; - } - - private boolean isStringColumn(ColumnTypeDto type) { - return switch (type) { - case CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT -> true; - default -> false; - }; - } - - private boolean isTimeStamp(ColumnTypeDto type) { - return switch (type) { - case TIMESTAMP -> true; - default -> false; - }; - } - - private void addDatasourceIfNotPresent() { - String jsonString = dataSourceService.getDatasource(); - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode rootNode = objectMapper.readTree(jsonString); - - if (rootNode.isArray()) { - for (JsonNode node : rootNode) { - if (node.has("uid") && node.get("uid").asText().equals(AbstractPanel.DATASRC_UID)) { - return; - } - } - } - - dataSourceService.addDatasource(); - } catch (Exception e) { - log.error("failed to read json of datasource"); - throw new JsonProcessingException("Failed to process datasource json"); - } - } - - private void addTimeSeriesPanel(Long dbId, Long tId, String tableName, List<ColumnDto> columns, - Map<Long, List<TimeSeriesDto>> timeSeriesMap, List<String> tablePanels) { - List<TimeSeriesDto> timeSeriesDtos = timeSeriesMap.get(tId); - - for (TimeSeriesDto timeSeriesDto : timeSeriesDtos) { - TimeDto timeDto = timeSeriesDto.getTimeDto(); - - Map<String, String> timeMap = new HashMap<>(); - String valueName = null; - if (timeDto != null) { - - for (var col : columns) { - Long colId = col.getId(); - String colName = col.getInternalName(); - - if (Objects.equals(timeDto.getYearColId(), colId)) { - timeMap.put(TIME_YEAR_COL, colName); - } else if (Objects.equals(timeDto.getMonthColId(), colId)) { - timeMap.put(TIME_MONTH_COL, colName); - } else if (Objects.equals(timeDto.getDayColId(), colId)) { - timeMap.put(TIME_DAY_COL, colName); - } else if (Objects.equals(timeDto.getHourColId(), colId)) { - timeMap.put(TIME_HOUR_COL, colName); - } else if (Objects.equals(timeDto.getMinuteColId(), colId)) { - timeMap.put(TIME_MIN_COL, colName); - } else if (Objects.equals(timeDto.getSecondColId(), colId)) { - timeMap.put(TIME_SECOND_COL, colName); - } else if (Objects.equals(timeSeriesDto.getValueColId(), colId)) { - valueName = colName; - timeMap.put(TIME_VAL_COL, valueName); - } - } - - if (!timeMap.isEmpty()) { - tablePanels.add(generateTimeSeriesPanel(dbId, tableName, valueName, timeMap, timeSeriesDto.getSize())); - } - } - } - } - - private String checkForSync(Long dbId) { - String path = String.format("/api/dashboards/uid/%d", dbId); - - ResponseEntity<String> responseEntity = null; - try { - responseEntity = grafanaRestTemplate.exchange( - path, - HttpMethod.GET, - null, - String.class - ); - - if (responseEntity.getStatusCode() == HttpStatus.OK) { - log.debug("dashboard with id {} already present", dbId); - - ObjectMapper mapper = new ObjectMapper(); - JsonNode rootNode = mapper.readTree(responseEntity.getBody()); - - return rootNode.get("meta").get("url").asText(); - } - } catch (RestClientException e) { - - if (e.getMessage().startsWith("404")) { - log.debug("dashboard with id {} not present", dbId); - return null; - } - - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.GET, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.GET, e); - throw new ResourceAccessException("Exception occurred"); - } - - return null; - } - - private String createDashboard(String dashboardJson) { - String path = "/api/dashboards/db"; - - HttpEntity<String> requestEntity = new HttpEntity<>(dashboardJson); - - try { - ResponseEntity<String> responseEntity = grafanaRestTemplate.exchange( - path, - HttpMethod.POST, - requestEntity, - String.class - ); - - ObjectMapper mapper = new ObjectMapper(); - String jsonString = responseEntity.getBody(); - JsonNode rootNode = mapper.readTree(jsonString); - - return rootNode.get("url").asText(); - - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - -} \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataServiceImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataServiceImpl.java deleted file mode 100644 index 797483b04233281f564f5d49db395a9c7608d4a2..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataServiceImpl.java +++ /dev/null @@ -1,405 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.TableStatisticDto; -import at.tuwien.api.database.table.columns.ColumnStatisticDto; -import at.tuwien.panels.StatsPanel; -import at.tuwien.service.DataService; -import at.tuwien.service.TableService; -import lombok.extern.log4j.Log4j2; -import org.json.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static at.tuwien.panels.MultiTimeSeriesPanel.*; -import static at.tuwien.panels.PieChartPanel.VIEW_PIE_PERCENTAGE_COL; -import static at.tuwien.panels.TimeSeriesPanel.*; - -@Log4j2 -@Service -public class DataServiceImpl implements DataService { - private final RestTemplate dataRestTemplate; - private final TableService tableService; - private final RestTemplate grafanaRestTemplate; - - @Autowired - public DataServiceImpl(@Qualifier("dataServiceRestTemplate") RestTemplate dataRestTemplate, - @Qualifier("grafanaTemplate") RestTemplate grafanaRestTemplate, - TableService tableService) { - this.dataRestTemplate = dataRestTemplate; - this.grafanaRestTemplate = grafanaRestTemplate; - this.tableService = tableService; - } - - @Override - public Map<String, Object> getPieChartData(Long dbId, Long viewId, Long size) { - - Long page = 0L; - String path = String.format("/api/database/%d/view/%d/data?page=%d&size=%d", dbId, viewId, page, size); - - try { - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - QueryResultDto queryResultDto = responseEntity.getBody(); - assert queryResultDto != null; - - List<Map<String, Object>> res = queryResultDto.getResult(); - Map<String, Object> pieDataMap = new HashMap<>(); - double sum = 0; - - for (Map<String, Object> map : res) { - String key = null; - Object value = null; - - for (Map.Entry<String, Object> entry : map.entrySet()) { - if (!entry.getKey().equals(VIEW_PIE_PERCENTAGE_COL)) { // string column - key = (String) entry.getValue(); - } else { - value = entry.getValue(); - sum += (double) value; - } - } - - if (key != null && value != null) { - pieDataMap.put(key, value); - } - } - - pieDataMap.put("Others", 100 - sum); - return pieDataMap; - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public Map<String, Object> getCntAllData(Long dbId, Long viewId) { - - String path = String.format("/api/database/%d/view/%d/data", dbId, viewId); - - try { - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - QueryResultDto queryResultDto = responseEntity.getBody(); - assert queryResultDto != null; - return queryResultDto.getResult().get(0); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public List<Map<String, Object>> getTableData(Long dbId, Long tableId, Long size) { - return tableService.getTableData(dbId, tableId, size); - } - - @Override - public Map<String, List<Object>> getHistogramData(Long dbId, Long viewId, Long size) { - - Long page = 0L; - String path = String.format("/api/database/%d/view/%d/data?page=%d&size=%d", dbId, viewId, page, size); - - try { - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - QueryResultDto queryResultDto = responseEntity.getBody(); - assert queryResultDto != null; - - List<Map<String, Object>> resultMap = queryResultDto.getResult(); - List<Object> valueList = new ArrayList<>(); - - for (Map<String, Object> map : resultMap) { - if (!map.isEmpty()) { - valueList.add(map.entrySet().iterator().next().getValue()); - } - } - - return Map.of("values", valueList); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public List<Map<String, Object>> getStatsData(Long dbId, Long tableId) { - - String path = String.format("/api/database/%d/table/%d/statistic", dbId, tableId); - - try { - ResponseEntity<TableStatisticDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - TableStatisticDto.class - ); - TableStatisticDto columnStatisticDto = responseEntity.getBody(); - assert columnStatisticDto != null; - Map<String, ColumnStatisticDto> map = columnStatisticDto.getColumns(); - - map = map.entrySet().stream() - .filter(entry -> entry.getValue().getMin() != null) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - List<Map<String, Object>> res = new ArrayList<>(); - Map<String, Object> row; - for (Map.Entry<String, ColumnStatisticDto> entry : map.entrySet()) { - row = new HashMap<>(); - - row.put(StatsPanel.HEADER_COL, entry.getKey()); - row.put(StatsPanel.HEADER_MIN, entry.getValue().getMin()); - row.put(StatsPanel.HEADER_MAX, entry.getValue().getMax()); - row.put(StatsPanel.HEADER_AVG, entry.getValue().getMedian()); - row.put(StatsPanel.HEADER_STDDEV, entry.getValue().getStdDev()); - - res.add(row); - } - - return res; - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public Map<String, List<Map<String, Object>>> getTimeSeriesData(Long dbId, Long viewId, Long size) { - - Long page = 0L; - String path = String.format("/api/database/%d/view/%d/data?page=%d&size=%d", dbId, viewId, page, size); - - try { - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - QueryResultDto queryResultDto = responseEntity.getBody(); - assert queryResultDto != null; - - List<Map<String, Object>> resultMap = queryResultDto.getResult(); - - - Map<String, List<Map<String, Object>>> res = new HashMap<>(); - res.put("time_series", formatTimeData(resultMap)); - - return res; - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - public Map<String, List<Map<String, Object>>> getMultiTimeSeriesData(Long dbId, Long viewId, Long size) { - Long page = 0L; - String path = String.format("/api/database/%d/view/%d/data?page=%d&size=%d", dbId, viewId, page, size); - - try { - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - QueryResultDto queryResultDto = responseEntity.getBody(); - assert queryResultDto != null; - - List<Map<String, Object>> resultMap = queryResultDto.getResult(); - List<Map<String, Object>> timeMap = new ArrayList<>(); - - for (Map<String, Object> map : resultMap) { - Object time = map.get(VIEW_MULTI_TIMECOL); - - for (Map.Entry<String, Object> entry : map.entrySet()) { - Map<String, Object> multiTimeEntry = new HashMap<>(); - if (!entry.getKey().equals(VIEW_MULTI_TIMECOL)) { - multiTimeEntry.put(VIEW_MULTI_SELECTOR_NAME, entry.getKey()); - multiTimeEntry.put(VIEW_MULTI_SELECTOR_VALUE, entry.getValue()); - multiTimeEntry.put(VIEW_MULTI_SELECTOR_TIME, time); - - timeMap.add(multiTimeEntry); - } - } - } - Map<String, List<Map<String, Object>>> res = new HashMap<>(); - res.put("time_series", timeMap); - - return res; - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - private List<Map<String, Object>> formatTimeData(List<Map<String, Object>> resultMap) { - int year, month, day, hour, min, sec; - Object val; - - List<Map<String, Object>> timeValues = new ArrayList<>(); - Map<String, Object> timeValue; - - for (Map<String, Object> map : resultMap) { - year = 0; - month = 1; - day = 1; - hour = 0; - min = 0; - sec = 0; - val = null; - timeValue = new HashMap<>(); - - if(map.containsKey(TIME_YEAR_COL)) { - Object y = map.get(TIME_YEAR_COL); - if (y instanceof Integer) { - year = (int) y; - } - } - - if(map.containsKey(TIME_MONTH_COL)) { - Object m = map.get(TIME_MONTH_COL); - if (m instanceof String) { - month = getMonth(m.toString()); - } else if (m instanceof Integer) { - month = (int) m; - } - } - - if(map.containsKey(TIME_DAY_COL)) { - Object d = map.get(TIME_DAY_COL); - if (d instanceof Integer) { - day = (int) d; - } - } - - if(map.containsKey(TIME_HOUR_COL)) { - Object h = map.get(TIME_HOUR_COL); - if (h instanceof Integer) { - hour = (int) h; - } - } - - if(map.containsKey(TIME_MIN_COL)) { - Object m = map.get(TIME_MIN_COL); - if (m instanceof Integer) { - min = (int) m; - } - } - - if(map.containsKey(TIME_SECOND_COL)) { - Object s = map.get(TIME_SECOND_COL); - if (s instanceof Integer) { - sec = (int) s; - } - } - - if(map.containsKey(TIME_VAL_COL)) { - val = map.get(TIME_VAL_COL); - } - - timeValue.put("time", String.format("%d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec)); - timeValue.put("value", val); - timeValues.add(timeValue); - } - - return timeValues; - } - - private int getMonth(String month) { - return switch (month.toLowerCase()) { - case "february" -> 2; - case "march" -> 3; - case "april" -> 4; - case "may" -> 5; - case "june" -> 6; - case "july" -> 7; - case "august" -> 8; - case "september" -> 9; - case "october" -> 10; - case "november" -> 11; - case "december" -> 12; - default -> 1; - }; - } -} diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataSourceServiceImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataSourceServiceImpl.java deleted file mode 100644 index f4fde957b38c50fa79edf698d0f6500bb2d8d198..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/DataSourceServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.panels.AbstractPanel; -import at.tuwien.service.DataService; -import at.tuwien.service.DataSourceService; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.*; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; -import java.util.Map; - -@Log4j2 -@Service -public class DataSourceServiceImpl implements DataSourceService { - - private final RestTemplate grafanaRestTemplate; - private String addDatasourceJSON = "{\n" + - " \"id\": null,\n" + - " \"uid\": \"" + AbstractPanel.DATASRC_UID + "\",\n" + - " \"name\": \"infinity datasource\",\n" + - " \"type\": \"yesoreyeram-infinity-datasource\",\n" + - " \"access\": \"proxy\"\n" + - "}"; - - @Autowired - public DataSourceServiceImpl(@Qualifier("grafanaTemplate") RestTemplate grafanaRestTemplate) { - this.grafanaRestTemplate = grafanaRestTemplate; - } - - @Override - public String addDatasource() { - String path = "/api/datasources"; - - HttpEntity<String> requestEntity = new HttpEntity<>(addDatasourceJSON); - - try { - ResponseEntity<String> responseEntity = grafanaRestTemplate.exchange( - path, - HttpMethod.POST, - requestEntity, - String.class - ); - return responseEntity.getBody(); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public String getDatasource() { - String path = "/api/datasources"; - - try { - ResponseEntity<String> responseEntity = grafanaRestTemplate.exchange( - path, - HttpMethod.GET, - null, - String.class - ); - - return responseEntity.getBody(); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - -} \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/TableServiceImpl.java deleted file mode 100644 index a3c8fc8622aa8fe8a7fb4e63fe0520cadeb004e4..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.TableBriefDto; -import at.tuwien.api.database.table.TableDto; -import at.tuwien.service.TableService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.*; -import org.springframework.web.util.UriComponentsBuilder; - -import java.util.*; - -@Log4j2 -@Service -public class TableServiceImpl implements TableService { - private final RestTemplate dataRestTemplate; - private final RestTemplate metaDataRestTemplate; - - @Autowired - public TableServiceImpl(@Qualifier("dataServiceRestTemplate") RestTemplate dataRestTemplate, - @Qualifier("metaDataServiceRestTemplate") RestTemplate metaDataRestTemplate) { - this.dataRestTemplate = dataRestTemplate; - this.metaDataRestTemplate = metaDataRestTemplate; - } - - @Override - public List<TableBriefDto> getAllTables(Long dbId) { - String path = String.format("/api/database/%d/table", dbId); - - try { - ResponseEntity<List<TableBriefDto>> responseEntity = metaDataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - new ParameterizedTypeReference<List<TableBriefDto>>() {} - ); - return responseEntity.getBody(); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - - @Override - public TableDto getTableSchemas(Long dbId, Long tId) { - String path = String.format("/api/database/%d/table/%d", dbId, tId); - try { - ResponseEntity<TableDto> responseEntity = metaDataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - TableDto.class - ); - - return responseEntity.getBody(); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - - @Override - public List<Map<String, Object>> getTableData(Long dbId, Long tId, Long size) { - Long page = 0L; - String path = String.format("/api/database/%d/table/%d/data?page=%d&size=%d", dbId, tId, page, size); - - try { - // Send GET request with query parameters - ResponseEntity<QueryResultDto> responseEntity = dataRestTemplate.exchange( - path, - HttpMethod.GET, - null, - QueryResultDto.class - ); - - QueryResultDto responseBody = responseEntity.getBody(); - - return responseBody.getResult(); - - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - -} \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/ViewGeneratorServiceImpl.java b/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/ViewGeneratorServiceImpl.java deleted file mode 100644 index baa258460c157053e6ae3fc31ec441d11dc5adf1..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/java/at/tuwien/service/impl/ViewGeneratorServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.ViewBriefDto; -import at.tuwien.api.database.ViewCreateDto; -import at.tuwien.dto.PieChartConfigDto; -import at.tuwien.panels.StatsPanel; -import at.tuwien.service.ViewGeneratorService; -import lombok.extern.log4j.Log4j2; -import org.apache.commons.text.StringSubstitutor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static at.tuwien.panels.MultiTimeSeriesPanel.VIEW_MULTI_TIMECOL; -import static at.tuwien.panels.PieChartPanel.VIEW_PIE_PERCENTAGE_COL; -import static at.tuwien.panels.TimeSeriesPanel.TIME_VAL_COL; - -@Log4j2 -@Service -public class ViewGeneratorServiceImpl implements ViewGeneratorService { - - private final RestTemplate metaDataRestTemplate; - private static final String PIE_DEFAULT_LIMIT = "10"; - private static final String PIE_DEFAULT_DEC_PLACE = "2"; - - @Autowired - public ViewGeneratorServiceImpl(@Qualifier("metaDataServiceRestTemplate") RestTemplate metaDataRestTemplate) { - this.metaDataRestTemplate = metaDataRestTemplate; - } - - @Override - public Long genCntAllView(Long dbId, String tableName, String token) { - final String query = String.format("select count(*) from %s", tableName); - - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_cntAll_%s", dbId, tableName)); - viewCreateDto.setQuery(query); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - @Override - public Long genPieChartView(Long dbId, String tableName, String colName, PieChartConfigDto config, String token) { - Map<String, String> valueMap = new HashMap<>(); - valueMap.put("col_name", colName); - valueMap.put("table_name", tableName); - valueMap.put("limit", (config != null && config.getLimit() != null) ? config.getLimit() : PIE_DEFAULT_LIMIT); - valueMap.put("dec_place", (config != null && config.getDecimalPlace() != null) ? config.getDecimalPlace() : PIE_DEFAULT_DEC_PLACE); - valueMap.put("percentage", VIEW_PIE_PERCENTAGE_COL); - - final String templateQuery = - "SELECT\n" + - " ${col_name},\n" + - " ROUND( (COUNT(*) / total_count) * 100, ${dec_place}) AS ${percentage}\n" + - " FROM\n" + - " ${table_name},\n" + - " (SELECT COUNT(*) AS total_count FROM ${table_name}) AS t\n" + - " GROUP BY\n" + - " ${col_name}\n" + - " ORDER BY\n" + - " ${percentage} DESC\n" + - " LIMIT ${limit}"; - - StringSubstitutor sub = new StringSubstitutor(valueMap); - - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_piechart_%s_%s", dbId, tableName, colName)); - viewCreateDto.setQuery(sub.replace(templateQuery)); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - @Override - public Long genHistogramView(Long dbId, String tableName, String colName, String token) { - final String query = String.format("select %s from %s", colName, tableName); - - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_histogram_%s_%s", dbId, tableName, colName)); - viewCreateDto.setQuery(query); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - @Override - public Long genStatisticsView(Long dbId, String tableName, String colName, String token) { - Map<String, String> valueMap = new HashMap<>(); - valueMap.put("col_name", colName); - valueMap.put("table_name", tableName); - valueMap.put("header_col", StatsPanel.HEADER_COL); - valueMap.put("header_min", StatsPanel.HEADER_MIN); - valueMap.put("header_max", StatsPanel.HEADER_MAX); - valueMap.put("header_avg", StatsPanel.HEADER_AVG); - valueMap.put("header_stddev", StatsPanel.HEADER_STDDEV); - - final String templateQuery = "select " + - "min(${col_name}) as ${header_min}, " + - "max(${col_name}) as ${header_max}, " + - "avg(${col_name}) as ${header_avg}, " + - "STDDEV(${col_name}) as ${header_stddev} " + - "from ${table_name}"; - - StringSubstitutor sub = new StringSubstitutor(valueMap); - - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_statschart_%s_%s", dbId, tableName, colName)); - viewCreateDto.setQuery(sub.replace(templateQuery)); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - @Override - public Long genTimeSeriesView(Long dbId, String tableName, Map<String, String> timeMap, String token) { - - List<String> colNames = new ArrayList<>(); - for (Map.Entry<String, String> entry : timeMap.entrySet()) { - colNames.add(String.format("%s AS %s", entry.getValue(), entry.getKey())); - } - - final String query = String.format("select %s from %s", String.join(",", colNames), tableName); - - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_timeseries_%s_%s", dbId, tableName, timeMap.get(TIME_VAL_COL))); - viewCreateDto.setQuery(query); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - @Override - public Long genMultiTimeSeriesView(Long dbId, String tableName, String timeCol, List<String> numValues, String token) { - - final String query = String.format("select %s AS %s, %s from %s", timeCol, VIEW_MULTI_TIMECOL, String.join(",", numValues), tableName); - ViewCreateDto viewCreateDto = new ViewCreateDto(); - viewCreateDto.setName(String.format("%d_multitimeseries_%s_%s", dbId, tableName, timeCol)); - viewCreateDto.setQuery(query); - viewCreateDto.setIsPublic(true); - - ViewBriefDto createdView = createView(dbId, viewCreateDto, token); - if (createdView == null) { - log.warn("failed to create view {}", viewCreateDto); - return -1L; - } - - return createdView.getId(); - } - - - private ViewBriefDto createView(Long dbId, ViewCreateDto viewCreateDto, String token) { - String path = String.format("/api/database/%d/view", dbId); - - HttpHeaders headers = new HttpHeaders(); - headers.set("Authorization", token); - headers.set("Content-Type", "application/json"); - - HttpEntity<ViewCreateDto> requestEntity = new HttpEntity<>(viewCreateDto, headers); - - try { - ResponseEntity<ViewBriefDto> responseEntity = metaDataRestTemplate.exchange( - path, - HttpMethod.POST, - requestEntity, - ViewBriefDto.class - ); - - return responseEntity.getBody(); - } catch (ResourceAccessException e) { - log.error("Resource access error for accessing URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Resource access error occurred"); - } catch (RestClientException e) { - log.error("RestClient Exception occurred URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("RestClient Exception occurred"); - } catch (Exception e) { - log.error("Exception occurred, URL: {}, Exception message: {}, Request method: {}, Stack Trace: {}", - path, e.getMessage(), HttpMethod.POST, e); - throw new ResourceAccessException("Exception occurred"); - } - } - -} \ No newline at end of file diff --git a/dbrepo-grafana-service/rest-service/src/main/resources/application-local.yml b/dbrepo-grafana-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index 8e99c2d0a9fe8711e142bdc9ba2863337f4f2f5b..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,89 +0,0 @@ -application: - title: DBRepo - version: '@project.version@' -spring: - datasource: - url: jdbc:h2:mem:fda;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value - driver-class-name: org.h2.Driver - username: sa - password: password - rabbitmq: - host: "${BROKER_HOST:broker-service}" - virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" - password: "${BROKER_PASSWORD:fda}" - username: "${BROKER_USERNAME:fda}" - port: ${BROKER_PORT:5672} - jpa: - show-sql: false - database-platform: org.hibernate.dialect.H2Dialect - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: grafana-service - main: - banner-mode: off -management: - endpoints: - web: - exposure: - include: health,info,prometheus - endpoint: - health: - probes: - enabled: true - health: - readinessState: - enabled: true - livenessState: - enabled: true -server: - port: 1880 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: debug - at.tuwien.: "${LOG_LEVEL:info}" - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -dbrepo: - endpoints: - grafana: http://grafana:3000 - dataService: http://data-service:8080 - gatewayService: "${GATEWAY_SERVICE_ENDPOINT:http://gateway-service}" - storageService: "${S3_ENDPOINT:http://storage-service:9000}" - authService: "${AUTH_SERVICE_HOST:http://auth-service:8080}" - s3: - accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" - secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" - importBucket: "${S3_IMPORT_BUCKET:dbrepo-upload}" - exportBucket: "${S3_EXPORT_BUCKET:dbrepo-download}" - filePath: "${S3_FILE_PATH:/tmp}" - admin: - username: "${ADMIN_USERNAME:admin}" - password: "${ADMIN_PASSWORD:admin}" - jwt: - public_key: "${JWT_PUBKEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" - keycloak: - username: "${AUTH_SERVICE_ADMIN:fda}" - password: "${AUTH_SERVICE_ADMIN_PASSWORD:fda}" - client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" - clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" - sql: - forbidden: "${NOT_SUPPORTED_KEYWORDS:\\*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--}" - grant: - default: - read: "${GRANT_DEFAULT_READ:SELECT}" - write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" - minConcurrent: "${MIN_CONCURRENT_CONSUMERS:2}" - maxConcurrent: "${MAX_CONCURRENT_CONSUMERS:6}" - requeueRejected: ${REQUEUE_REJECTED:false} - queueName: "${BROKER_QUEUE_NAME:dbrepo}" - exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" - routingKey: "${BROKER_ROUTING_KEY:#}" - connectionTimeout: ${CONNECTION_TIMEOUT:10000} - defaultDateFormatId: "${DEFAULT_DATE_FORMAT_ID:3}" - defaultTimeFormatId: "${DEFAULT_TIME_FORMAT_ID:4}" - defaultTimestampFormatId: "${DEFAULT_TIMESTAMP_FORMAT_ID:1}" diff --git a/dbrepo-grafana-service/rest-service/src/main/resources/application.yml b/dbrepo-grafana-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index b8fcf710c7234ae063c4f2ec4f91baae22150c35..0000000000000000000000000000000000000000 --- a/dbrepo-grafana-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,107 +0,0 @@ -application: - title: DBRepo - version: '@project.version@' - baseurl: ${BASE_URL:http://localhost} -spring: - datasource: - url: jdbc:h2:mem:fda;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value - driver-class-name: org.h2.Driver - username: sa - password: password - rabbitmq: - host: "${BROKER_HOST:broker-service}" - virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" - password: "${BROKER_PASSWORD:fda}" - username: "${BROKER_USERNAME:fda}" - port: ${BROKER_PORT:5672} - jpa: - show-sql: false - database-platform: org.hibernate.dialect.H2Dialect - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: grafana-service - main: - banner-mode: off - data: - redis: - host: redis - port: 6379 -management: - endpoints: - web: - exposure: - include: health,info,prometheus - endpoint: - health: - probes: - enabled: true - health: - readinessState: - enabled: true - livenessState: - enabled: true -server: - port: 8080 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL:info}" - org: - springframework: - web: - client: - RestTemplate: DEBUG - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -dbrepo: - endpoints: - grafana: http://grafana:3000 - grafanaPort: 3000 - grafanaService: http://grafana-service:8080 - dataService: http://data-service:8080 - metadataService: http://metadata-service:8080 - gatewayService: "${GATEWAY_SERVICE_ENDPOINT:http://gateway-service}" - storageService: "${S3_ENDPOINT:http://storage-service:9000}" - authService: "${AUTH_SERVICE_HOST:http://auth-service:8080}" - s3: - accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" - secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" - importBucket: "${S3_IMPORT_BUCKET:dbrepo-upload}" - exportBucket: "${S3_EXPORT_BUCKET:dbrepo-download}" - filePath: "${S3_FILE_PATH:/tmp}" - admin: - username: "${ADMIN_USERNAME:kper}" - password: "${ADMIN_PASSWORD:k1a1r1l1o1}" - jwt: - public_key: "${JWT_PUBKEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" - keycloak: - username: "${AUTH_SERVICE_ADMIN:fda}" - password: "${AUTH_SERVICE_ADMIN_PASSWORD:fda}" - client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" - clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" - grafana: - username: "${GRAFANA_USERNAME:admin}" - password: "${GRAFANA_PASSWORD:admin}" - default_refreshrate: 0 - sql: - forbidden: "${NOT_SUPPORTED_KEYWORDS:\\*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--}" - grant: - default: - read: "${GRANT_DEFAULT_READ:SELECT}" - write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" - minConcurrent: "${MIN_CONCURRENT_CONSUMERS:2}" - maxConcurrent: "${MAX_CONCURRENT_CONSUMERS:6}" - requeueRejected: ${REQUEUE_REJECTED:false} - queueName: "${BROKER_QUEUE_NAME:dbrepo}" - exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" - routingKey: "${BROKER_ROUTING_KEY:#}" - connectionTimeout: ${CONNECTION_TIMEOUT:10000} - defaultDateFormatId: "${DEFAULT_DATE_FORMAT_ID:3}" - defaultTimeFormatId: "${DEFAULT_TIME_FORMAT_ID:4}" - defaultTimestampFormatId: "${DEFAULT_TIMESTAMP_FORMAT_ID:1}" - diff --git a/dbrepo-grafana-service/rest-service/src/test/resources/application.properties b/dbrepo-grafana-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index dfc122745e398654107bb490c84887e5872f32dd..313d6d0db530caa829e6325cef263d1077b954e8 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -43,7 +43,7 @@ <mapstruct.version>1.6.3</mapstruct.version> <rabbitmq.version>5.20.0</rabbitmq.version> <commons-io.version>2.17.0</commons-io.version> - <commons-validator.version>1.8.1</commons-validator.version> + <commons-validator.version>1.8.0</commons-validator.version> <guava.version>33.0.0-jre</guava.version> <jacoco.version>0.8.12</jacoco.version> <jwt.version>4.3.0</jwt.version> @@ -62,6 +62,7 @@ ./report/target/site/jacoco-aggregate/jacoco.xml </sonar.coverage.jacoco.xmlReportPaths> <CodeCacheSize>128m</CodeCacheSize> + <extraJavaTestArgs></extraJavaTestArgs> </properties> <dependencies> diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 1408b9e1a7a3804132c4f06a2faa737bff18385b..00b29bcf7f9f6e99d68df9e8a0dfdabf74de51c9 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -373,7 +373,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7e21d72d0b3e766aeecb286b636ea7530fa971d95b1b083b7ef8b9512b8300ef" + "sha256:22484d712e4a240a0114b90b5e8eaacbe47aa8f7fc79200557150f081faf7669" ], "path": "./lib/dbrepo-1.8.1.tar.gz" }, @@ -879,101 +879,113 @@ }, "multidict": { "hashes": [ - "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", - "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", - "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d", - "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", - "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", - "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", - "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", - "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", - "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460", - "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", - "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191", - "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49", - "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", - "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", - "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", - "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", - "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", - "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90", - "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f", - "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", - "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", - "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de", - "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf", - "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", - "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", - "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349", - "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", - "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", - "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", - "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a", - "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e", - "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2", - "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", - "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", - "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", - "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", - "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", - "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", - "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", - "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", - "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", - "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", - "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", - "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27", - "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a", - "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872", - "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac", - "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a", - "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", - "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133", - "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", - "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", - "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", - "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", - "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", - "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", - "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", - "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", - "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", - "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", - "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", - "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", - "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2", - "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1", - "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", - "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb", - "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", - "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", - "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3", - "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", - "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", - "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a", - "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", - "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1", - "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", - "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", - "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a", - "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88", - "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656", - "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d", - "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", - "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", - "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", - "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", - "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", - "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2", - "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", - "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", - "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3", - "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", - "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", - "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87" + "sha256:033edcc22211463be927ca407dc5c5f3aa84d3d093ed2d559a2e3c2d995d50e4", + "sha256:03cd2a3c446162678d0a6d14d69ad38204128414ba40722a5ff6f2107782b723", + "sha256:05dcc73739ae8096f64f08282c8980dab2cf9acb02eb838aacd8ac56b795c405", + "sha256:11d76b83dc93e98207514e1938b89854655087e3b27a09d89525fe17a0f1ce11", + "sha256:1247de19497e13063eabf1df67e87530ac31497b91e9bd08621852a57d9b5ee7", + "sha256:147c962e8ae339d5fa84c52cc1e59546cb2d0d9359f9a8e1b8eb7b5ffac8dba0", + "sha256:159dae860e4d34bd4f48e72a0c033d78ae9215b43d423c19cbf47b7db5972599", + "sha256:15c14a01dd95e860703a4ce78d4b0d49f18c14389eb91b4aa12444e31dfc2841", + "sha256:15ddde4242134f1aeb1455ad60cc529e0a9f5eb251ae7be7fc37debdb257182c", + "sha256:1a894aed57c6edc514c9222989cf09eebd9ea7acb6185a26cfeac2ece2ddf265", + "sha256:1c11e8460ff0629871f9703c87208e553fbfa6c9d92f94c20d4f86e56f021029", + "sha256:1cd34caed981a95964218e03a3f267537a0b1a2fae078949e880f757df9efe55", + "sha256:1f62882c6d06e5e75b82444ce14f59b830f5b017b31630cc13d8b0b01379385a", + "sha256:20050a17cc2f322598d181a5b2e2cf4787e4c2e3bf71aab5e96618b40665e8ae", + "sha256:205da0f812c9128155bc1b7be69cf89280a5bb2f5b84426bced76e7d860ed5dc", + "sha256:258414850b59fb820bd1e1e19a9b281409a6d0bd969d3fe7104cc87a7c08c191", + "sha256:27d45a6a8495f2cfcf64d6cc4fbcc78a6e87ed840e54a261430d0d4331d9aae0", + "sha256:285058a0cdd284ba5bbc1d10d75fb33e3b3087b15d5aa9d23fc4787dd3a48384", + "sha256:2e116fad10aa7c74aa3acc69adcdffe86f1415abb111653f85dd37171116b57d", + "sha256:38e165c4d79ac98cabb5c08d8a3a3e1dda3206bcec19ed072992b62b200b180d", + "sha256:3af088483bf2aba7f2886437d856a6ba4cd0c17946dd615cbe55d56552eaf187", + "sha256:3d17d8b2d4643d4f59629758b0dd229cda61e2319f81b470aa4a99717081ba0c", + "sha256:3e80621ebc9f045fab847a970b2430146f9121b95c3c695b044ade8488753126", + "sha256:4030f5319aacf20e924c5218377df446507b314f03676549891e12a9f832a9f1", + "sha256:44ee27fb416c3d8981b7c3c97b9813d40b06575f6d477f4da21726a30aabb562", + "sha256:458b235ae7af880e18c1476f968ef571689a574720eb9e6e8873d138fbba9c58", + "sha256:4660b75286c11b8f38c90b98ccf7541b7030dbec32b28f05031f8abebf7fc0e5", + "sha256:4748c017fa201e6a296c9ef75dc3668a01532adb8f5c27a0bef4835dfa62f8e7", + "sha256:48f775443154d99e1b1c727ea20137ddc1e4b29448a9b24875b2a348cc143b85", + "sha256:49e01d212be64ceee18a45e8baef441aa86cc9bd365fb92fb8b214e5fa5bc08b", + "sha256:4a0ba21b315113d39f7aa3ca4eb804f7984dab33c42ea14d07d790a640f81e77", + "sha256:4aca2ab0969dc3781fefe523ce70c5d245b915ba0708ce2713e8ac561f9448e0", + "sha256:5055e039ebfc6e4589115717c4a6d1dd2f195327b8d5a3e21a68f374d79dbed9", + "sha256:52bd2b6681beb34115eebbcbdcbd170ebc3fc98c4eb0dd789f2c01d4d6b189c0", + "sha256:54a291428e25f775193704f95a94f21a42a28ffb09c1bdc91e152c6b1faf4a91", + "sha256:58f74a195b99189c9f7e2bc83cc95fcf169a43a63c5c8cad63c4027bf3233118", + "sha256:614021ba98b8052d4eb3d5900d3bd953421edf41b2aa85d37c1dc67bcee1ea9d", + "sha256:64fccd2fa3cfd49c442c4995d58189e578560705b9b632faad8ffd9aaa390007", + "sha256:64fdd7a4aef8f14e4a6917a434d0a4766345f5d544d0c0c0e53b14eb1e4be0ac", + "sha256:693858c9584cedc1685e67e78fa9e50285504e8d4bbfde7290ca04dbbac939a8", + "sha256:6d168a6693c1b9b950d9584178d12095bfbaf290748eb6e2726c914bc1d0d4f1", + "sha256:6da367181104a57e77140ebf736652ed9a97c7bcb77c7640cf8a168893561bd2", + "sha256:6ed731286f0ae399e65e3172c5808732b9ae5d896b3ab7f692eb686bba6bc9df", + "sha256:70d695f62a55f90ee894fdf1ede51ccdda3abbe25b43b667b51747b6f61b8da7", + "sha256:71dae164819f8aede109a596db84d508e670d7e0a968901aaf22445e87ae7519", + "sha256:75bb804375e0b6c5db4e474fa0b5052414b6cbc3e70394d11a7ce9a7f6a18a91", + "sha256:796d1b070211554cc8193bd6764d2b44594ff7c7522989012eacf3fde778e5cf", + "sha256:79dc3f9893e32fcc564c60bb34c4e393daede2cdf0337a5b4627ed162a237fb3", + "sha256:7a3165a5bae6577d10858c35f6add83333ead621e8286a5d15f7d567ef44be78", + "sha256:7a74764881276904564f8725da3dd2b82924838a114738933f58b75082b55dd3", + "sha256:7cbc2e5116cdca0594bb39c64a8bd5e7f44d392cf76d19913216924688d42954", + "sha256:8223f74cf698f7992e1a71ab90ab4c169b508a0f25083ebab9259b9f33d7bdde", + "sha256:824b60427c92c44098cfbd58d8adf8a8c5a60ade16742dcb54385b43e6337b4e", + "sha256:8257f26cc2cc5d0426da488162060c6cea57079172b9d3eedf016fcb0cfdb830", + "sha256:8530ca574ba38478e97af20ff0f3fd04f59ffcad435b1548703424d71e2ed66a", + "sha256:858b68e475f8e73e4014c078e9feced502273032f07840117ca12d2230d27135", + "sha256:88ae724e79a524d1921b2799251f667e7fb0344a59637df3bec91dc303020467", + "sha256:8ce52f84e793ee83082c4aa127605070a47c31597821ca84dec5c0ac809e8509", + "sha256:93de2d3802a5ac7d5deadba1c956a93db29502f1b9f4e8d2e393747b9b28d881", + "sha256:93f4545347f79121e9ba98a0c33a55f469ebc22fb45ae62692e01d367219796b", + "sha256:9777e194be00313f5a86a0dd52d9987b72cf6c43c8a42d6bd838adc46c70e98b", + "sha256:99b2401166c3b2d997b80479cdc7449a093e21f3d4b2f9c6e6ceee956aa10d63", + "sha256:99f9b6596d2e126fa1777990868743fb4c1984ea5217606fabc153aff46160e6", + "sha256:9b4cd51b623b3dc8b55f9caef07424ac6d684b8047e601aca7053999e1b4a527", + "sha256:9f1edbf7e0d22a1ebf3c24ffaf0b8a39888bd630d6ff38c77c169272a3d4b9cc", + "sha256:a3da262f5b9f0dd01277575de4967683123ab47699fd7db2ce38cb1bb8f5c76f", + "sha256:aa613b270de6215f9fc850f0fb18dbc20ba297013012793cf3d2f1295e271e91", + "sha256:ac87e173c5f3aeac06d01eeebfb35c2b1bc5f536b21210dd8b032f1dc0726fbc", + "sha256:ad333e0b0d19294d3fc81d7aa9b65c45ebf49e6f8b3fab02db43284140d2b0a8", + "sha256:af55e557e722c962f70cdc6a482d0df44b1f6622af49003e33dd114340724875", + "sha256:b019f5c53471e8a010edf2fec321ece25ac6b079b535980b7228dcb9ee62d621", + "sha256:b0441ee8b9edc3fadb5cd9f181212edd72f7b016723bc549f9c1c00a9a8e6f93", + "sha256:b29a79f1e4313c397e00d89d4d83ff54fd377e7d654b640bbe9002b4272f205e", + "sha256:b622146bcfc6749944d14e8a61267dbea1bee96a9c7ca7605683506ed3817844", + "sha256:b8a87a3686de1d215506ba13dd388433695bfff534839e045419ba2f36437c0e", + "sha256:b9c5dfa5c7cdc26f6b777ac6210d3621d556e2e244f0a7358afe8ec0135f8640", + "sha256:b9d3d5de87a88768be67b7ec20aeb531707174ba0645697a938df3afc2c62b1f", + "sha256:bbd3cc064d272618b95c2f85ec61fe9d07e2a1de18c153c10923d3c2cdebff4c", + "sha256:bcd21a1b5cfb45170280e5fcd382c25519d75bdf4634656868b91c05d5e15b23", + "sha256:bdb621264758b22ae3aaa9d60937751069d80d610d713887ff94cf7487fc3f5f", + "sha256:c5fdcac25ae451af93e7f997678ed2282bf6b5ef892e253eea13bba59849f00e", + "sha256:c785581071f140d364821c210422ab5937d6c2c51d92e45a552a8e34b434a5a3", + "sha256:cbd06fb147030d7781f10bd7542f29bbf56cefb51a9f042713d5fc52e68b8afd", + "sha256:cf95ac57b44b6fb46a0151641b9905bbad27783314abc4f4b0b0a82f26b06b07", + "sha256:d6698fccb2f962021e467be6ba43fc02f7341f221e80545810303f5cc66461bb", + "sha256:d7533a9684e599b22a4beb699647dc3269d551e455886be8125f14f3c5a0869f", + "sha256:d7bf1d52c69f3051a0ebae9cca1e5be06e2ad4677d670a920454ecf6d20e2c8e", + "sha256:d8f47485264b1168ef852dd6bea619703409ff2cbc5e610dcb0f15fe3c6750bb", + "sha256:d8fc8c7c092a48044bf942735eea6da198cac0c655d7a06550619b2a7fec2ffd", + "sha256:d9e984f9542fba175bc4d98e320e9e2bd6e7480682aa84b274e9aee7fb6575b9", + "sha256:dc86a31e3215ce037ae306a338ff2156d897aae627d5d4e3dfa0c9eded4249e8", + "sha256:dd5240bea7d8de32e7ac95088b2ad95b89993a3825d9278d363d73ca40113cb3", + "sha256:df46fd268c765d186df8c7899bc4e0a2ee0d12458d356438af0329a49e6b15ca", + "sha256:dfb3870c5d4f5413988caf64243830f7ca13dc58ae2cf3eb48fe321ca6f26648", + "sha256:e36cfe9df4dfb6c2f4d80d20852ab6449257a01942e4808c3912ed413a4d40f7", + "sha256:e5ca936b70414dbee02f218be1d36a535a5953ba63fd82dc812135ca3f5a525f", + "sha256:e7ab7ea72c3f66ae1e930ae776ad2c6f4f78e0184781f64f196f17ecce113101", + "sha256:e80878904057edfd1d70ba31258f974d36c470fd95de2bcd98e0494942c4433e", + "sha256:ed8d6bd6f3c7991083e741fd55cecea70d670971c73b9563a673eab96e5356b4", + "sha256:f290e4eebf7764f8327a4bc6a459f09ca9a041cf7349bacfbb252da9feb0d37c", + "sha256:f915fc3287ddc23a5da8f61f5c2c3aaca0b754ce526c0ff81f55c27b25038cd5", + "sha256:fb8b1cba597398698ec494794091dadd76eb8011bb95f43578930466e7beb20b", + "sha256:fbd035ae06babb07c6b80535b0d4f6fe57eb73a23ae276eb4502b1f67f19e8ef", + "sha256:fd9521b70b50aac341f59799301ba24acbe2897b9157035d139668b6c43bc406" ], "markers": "python_version >= '3.9'", - "version": "==6.2.0" + "version": "==6.4.2" }, "niquests": { "hashes": [ @@ -1865,11 +1877,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:3adfa22c5718caee5ca69bc7f7461dc529f4396494d4d9b1db8af7c56cd3ac34", - "sha256:9cd79ce61da77b5d56681bc126f42955c2153e9c0da2f0a62bca8e0a05641f92" + "sha256:1a31156dc1f87d13483272cd7fe381664ded124b3b5e3d65385c23a309a1584e", + "sha256:60d1c48846c7fd5dbddfae38196fd1c43ffc83fb987ba477361254b93913ccbc" ], "markers": "python_version >= '3.7'", - "version": "==2.12.915" + "version": "==2.12.916" }, "verlib2": { "hashes": [ diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index ee7dcad638c31d4b646274c471626afb08800a77..900dbd5715e72bb8c38c69ca654a1a3119f2ef69 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -259,7 +259,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7e21d72d0b3e766aeecb286b636ea7530fa971d95b1b083b7ef8b9512b8300ef" + "sha256:22484d712e4a240a0114b90b5e8eaacbe47aa8f7fc79200557150f081faf7669" ], "path": "./lib/dbrepo-1.8.1.tar.gz" }, @@ -604,101 +604,113 @@ }, "multidict": { "hashes": [ - "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", - "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", - "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d", - "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", - "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", - "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", - "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", - "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", - "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460", - "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", - "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191", - "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49", - "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", - "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", - "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", - "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", - "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", - "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90", - "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f", - "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", - "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", - "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de", - "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf", - "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", - "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", - "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349", - "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", - "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", - "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", - "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a", - "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e", - "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2", - "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", - "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", - "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", - "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", - "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", - "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", - "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", - "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", - "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", - "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", - "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", - "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27", - "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a", - "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872", - "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac", - "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a", - "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", - "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133", - "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", - "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", - "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", - "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", - "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", - "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", - "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", - "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", - "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", - "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", - "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", - "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", - "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2", - "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1", - "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", - "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb", - "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", - "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", - "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3", - "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", - "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", - "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a", - "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", - "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1", - "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", - "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", - "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a", - "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88", - "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656", - "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d", - "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", - "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", - "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", - "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", - "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", - "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2", - "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", - "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", - "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3", - "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", - "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", - "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87" + "sha256:033edcc22211463be927ca407dc5c5f3aa84d3d093ed2d559a2e3c2d995d50e4", + "sha256:03cd2a3c446162678d0a6d14d69ad38204128414ba40722a5ff6f2107782b723", + "sha256:05dcc73739ae8096f64f08282c8980dab2cf9acb02eb838aacd8ac56b795c405", + "sha256:11d76b83dc93e98207514e1938b89854655087e3b27a09d89525fe17a0f1ce11", + "sha256:1247de19497e13063eabf1df67e87530ac31497b91e9bd08621852a57d9b5ee7", + "sha256:147c962e8ae339d5fa84c52cc1e59546cb2d0d9359f9a8e1b8eb7b5ffac8dba0", + "sha256:159dae860e4d34bd4f48e72a0c033d78ae9215b43d423c19cbf47b7db5972599", + "sha256:15c14a01dd95e860703a4ce78d4b0d49f18c14389eb91b4aa12444e31dfc2841", + "sha256:15ddde4242134f1aeb1455ad60cc529e0a9f5eb251ae7be7fc37debdb257182c", + "sha256:1a894aed57c6edc514c9222989cf09eebd9ea7acb6185a26cfeac2ece2ddf265", + "sha256:1c11e8460ff0629871f9703c87208e553fbfa6c9d92f94c20d4f86e56f021029", + "sha256:1cd34caed981a95964218e03a3f267537a0b1a2fae078949e880f757df9efe55", + "sha256:1f62882c6d06e5e75b82444ce14f59b830f5b017b31630cc13d8b0b01379385a", + "sha256:20050a17cc2f322598d181a5b2e2cf4787e4c2e3bf71aab5e96618b40665e8ae", + "sha256:205da0f812c9128155bc1b7be69cf89280a5bb2f5b84426bced76e7d860ed5dc", + "sha256:258414850b59fb820bd1e1e19a9b281409a6d0bd969d3fe7104cc87a7c08c191", + "sha256:27d45a6a8495f2cfcf64d6cc4fbcc78a6e87ed840e54a261430d0d4331d9aae0", + "sha256:285058a0cdd284ba5bbc1d10d75fb33e3b3087b15d5aa9d23fc4787dd3a48384", + "sha256:2e116fad10aa7c74aa3acc69adcdffe86f1415abb111653f85dd37171116b57d", + "sha256:38e165c4d79ac98cabb5c08d8a3a3e1dda3206bcec19ed072992b62b200b180d", + "sha256:3af088483bf2aba7f2886437d856a6ba4cd0c17946dd615cbe55d56552eaf187", + "sha256:3d17d8b2d4643d4f59629758b0dd229cda61e2319f81b470aa4a99717081ba0c", + "sha256:3e80621ebc9f045fab847a970b2430146f9121b95c3c695b044ade8488753126", + "sha256:4030f5319aacf20e924c5218377df446507b314f03676549891e12a9f832a9f1", + "sha256:44ee27fb416c3d8981b7c3c97b9813d40b06575f6d477f4da21726a30aabb562", + "sha256:458b235ae7af880e18c1476f968ef571689a574720eb9e6e8873d138fbba9c58", + "sha256:4660b75286c11b8f38c90b98ccf7541b7030dbec32b28f05031f8abebf7fc0e5", + "sha256:4748c017fa201e6a296c9ef75dc3668a01532adb8f5c27a0bef4835dfa62f8e7", + "sha256:48f775443154d99e1b1c727ea20137ddc1e4b29448a9b24875b2a348cc143b85", + "sha256:49e01d212be64ceee18a45e8baef441aa86cc9bd365fb92fb8b214e5fa5bc08b", + "sha256:4a0ba21b315113d39f7aa3ca4eb804f7984dab33c42ea14d07d790a640f81e77", + "sha256:4aca2ab0969dc3781fefe523ce70c5d245b915ba0708ce2713e8ac561f9448e0", + "sha256:5055e039ebfc6e4589115717c4a6d1dd2f195327b8d5a3e21a68f374d79dbed9", + "sha256:52bd2b6681beb34115eebbcbdcbd170ebc3fc98c4eb0dd789f2c01d4d6b189c0", + "sha256:54a291428e25f775193704f95a94f21a42a28ffb09c1bdc91e152c6b1faf4a91", + "sha256:58f74a195b99189c9f7e2bc83cc95fcf169a43a63c5c8cad63c4027bf3233118", + "sha256:614021ba98b8052d4eb3d5900d3bd953421edf41b2aa85d37c1dc67bcee1ea9d", + "sha256:64fccd2fa3cfd49c442c4995d58189e578560705b9b632faad8ffd9aaa390007", + "sha256:64fdd7a4aef8f14e4a6917a434d0a4766345f5d544d0c0c0e53b14eb1e4be0ac", + "sha256:693858c9584cedc1685e67e78fa9e50285504e8d4bbfde7290ca04dbbac939a8", + "sha256:6d168a6693c1b9b950d9584178d12095bfbaf290748eb6e2726c914bc1d0d4f1", + "sha256:6da367181104a57e77140ebf736652ed9a97c7bcb77c7640cf8a168893561bd2", + "sha256:6ed731286f0ae399e65e3172c5808732b9ae5d896b3ab7f692eb686bba6bc9df", + "sha256:70d695f62a55f90ee894fdf1ede51ccdda3abbe25b43b667b51747b6f61b8da7", + "sha256:71dae164819f8aede109a596db84d508e670d7e0a968901aaf22445e87ae7519", + "sha256:75bb804375e0b6c5db4e474fa0b5052414b6cbc3e70394d11a7ce9a7f6a18a91", + "sha256:796d1b070211554cc8193bd6764d2b44594ff7c7522989012eacf3fde778e5cf", + "sha256:79dc3f9893e32fcc564c60bb34c4e393daede2cdf0337a5b4627ed162a237fb3", + "sha256:7a3165a5bae6577d10858c35f6add83333ead621e8286a5d15f7d567ef44be78", + "sha256:7a74764881276904564f8725da3dd2b82924838a114738933f58b75082b55dd3", + "sha256:7cbc2e5116cdca0594bb39c64a8bd5e7f44d392cf76d19913216924688d42954", + "sha256:8223f74cf698f7992e1a71ab90ab4c169b508a0f25083ebab9259b9f33d7bdde", + "sha256:824b60427c92c44098cfbd58d8adf8a8c5a60ade16742dcb54385b43e6337b4e", + "sha256:8257f26cc2cc5d0426da488162060c6cea57079172b9d3eedf016fcb0cfdb830", + "sha256:8530ca574ba38478e97af20ff0f3fd04f59ffcad435b1548703424d71e2ed66a", + "sha256:858b68e475f8e73e4014c078e9feced502273032f07840117ca12d2230d27135", + "sha256:88ae724e79a524d1921b2799251f667e7fb0344a59637df3bec91dc303020467", + "sha256:8ce52f84e793ee83082c4aa127605070a47c31597821ca84dec5c0ac809e8509", + "sha256:93de2d3802a5ac7d5deadba1c956a93db29502f1b9f4e8d2e393747b9b28d881", + "sha256:93f4545347f79121e9ba98a0c33a55f469ebc22fb45ae62692e01d367219796b", + "sha256:9777e194be00313f5a86a0dd52d9987b72cf6c43c8a42d6bd838adc46c70e98b", + "sha256:99b2401166c3b2d997b80479cdc7449a093e21f3d4b2f9c6e6ceee956aa10d63", + "sha256:99f9b6596d2e126fa1777990868743fb4c1984ea5217606fabc153aff46160e6", + "sha256:9b4cd51b623b3dc8b55f9caef07424ac6d684b8047e601aca7053999e1b4a527", + "sha256:9f1edbf7e0d22a1ebf3c24ffaf0b8a39888bd630d6ff38c77c169272a3d4b9cc", + "sha256:a3da262f5b9f0dd01277575de4967683123ab47699fd7db2ce38cb1bb8f5c76f", + "sha256:aa613b270de6215f9fc850f0fb18dbc20ba297013012793cf3d2f1295e271e91", + "sha256:ac87e173c5f3aeac06d01eeebfb35c2b1bc5f536b21210dd8b032f1dc0726fbc", + "sha256:ad333e0b0d19294d3fc81d7aa9b65c45ebf49e6f8b3fab02db43284140d2b0a8", + "sha256:af55e557e722c962f70cdc6a482d0df44b1f6622af49003e33dd114340724875", + "sha256:b019f5c53471e8a010edf2fec321ece25ac6b079b535980b7228dcb9ee62d621", + "sha256:b0441ee8b9edc3fadb5cd9f181212edd72f7b016723bc549f9c1c00a9a8e6f93", + "sha256:b29a79f1e4313c397e00d89d4d83ff54fd377e7d654b640bbe9002b4272f205e", + "sha256:b622146bcfc6749944d14e8a61267dbea1bee96a9c7ca7605683506ed3817844", + "sha256:b8a87a3686de1d215506ba13dd388433695bfff534839e045419ba2f36437c0e", + "sha256:b9c5dfa5c7cdc26f6b777ac6210d3621d556e2e244f0a7358afe8ec0135f8640", + "sha256:b9d3d5de87a88768be67b7ec20aeb531707174ba0645697a938df3afc2c62b1f", + "sha256:bbd3cc064d272618b95c2f85ec61fe9d07e2a1de18c153c10923d3c2cdebff4c", + "sha256:bcd21a1b5cfb45170280e5fcd382c25519d75bdf4634656868b91c05d5e15b23", + "sha256:bdb621264758b22ae3aaa9d60937751069d80d610d713887ff94cf7487fc3f5f", + "sha256:c5fdcac25ae451af93e7f997678ed2282bf6b5ef892e253eea13bba59849f00e", + "sha256:c785581071f140d364821c210422ab5937d6c2c51d92e45a552a8e34b434a5a3", + "sha256:cbd06fb147030d7781f10bd7542f29bbf56cefb51a9f042713d5fc52e68b8afd", + "sha256:cf95ac57b44b6fb46a0151641b9905bbad27783314abc4f4b0b0a82f26b06b07", + "sha256:d6698fccb2f962021e467be6ba43fc02f7341f221e80545810303f5cc66461bb", + "sha256:d7533a9684e599b22a4beb699647dc3269d551e455886be8125f14f3c5a0869f", + "sha256:d7bf1d52c69f3051a0ebae9cca1e5be06e2ad4677d670a920454ecf6d20e2c8e", + "sha256:d8f47485264b1168ef852dd6bea619703409ff2cbc5e610dcb0f15fe3c6750bb", + "sha256:d8fc8c7c092a48044bf942735eea6da198cac0c655d7a06550619b2a7fec2ffd", + "sha256:d9e984f9542fba175bc4d98e320e9e2bd6e7480682aa84b274e9aee7fb6575b9", + "sha256:dc86a31e3215ce037ae306a338ff2156d897aae627d5d4e3dfa0c9eded4249e8", + "sha256:dd5240bea7d8de32e7ac95088b2ad95b89993a3825d9278d363d73ca40113cb3", + "sha256:df46fd268c765d186df8c7899bc4e0a2ee0d12458d356438af0329a49e6b15ca", + "sha256:dfb3870c5d4f5413988caf64243830f7ca13dc58ae2cf3eb48fe321ca6f26648", + "sha256:e36cfe9df4dfb6c2f4d80d20852ab6449257a01942e4808c3912ed413a4d40f7", + "sha256:e5ca936b70414dbee02f218be1d36a535a5953ba63fd82dc812135ca3f5a525f", + "sha256:e7ab7ea72c3f66ae1e930ae776ad2c6f4f78e0184781f64f196f17ecce113101", + "sha256:e80878904057edfd1d70ba31258f974d36c470fd95de2bcd98e0494942c4433e", + "sha256:ed8d6bd6f3c7991083e741fd55cecea70d670971c73b9563a673eab96e5356b4", + "sha256:f290e4eebf7764f8327a4bc6a459f09ca9a041cf7349bacfbb252da9feb0d37c", + "sha256:f915fc3287ddc23a5da8f61f5c2c3aaca0b754ce526c0ff81f55c27b25038cd5", + "sha256:fb8b1cba597398698ec494794091dadd76eb8011bb95f43578930466e7beb20b", + "sha256:fbd035ae06babb07c6b80535b0d4f6fe57eb73a23ae276eb4502b1f67f19e8ef", + "sha256:fd9521b70b50aac341f59799301ba24acbe2897b9157035d139668b6c43bc406" ], "markers": "python_version >= '3.9'", - "version": "==6.2.0" + "version": "==6.4.2" }, "niquests": { "hashes": [ @@ -1299,11 +1311,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:3adfa22c5718caee5ca69bc7f7461dc529f4396494d4d9b1db8af7c56cd3ac34", - "sha256:9cd79ce61da77b5d56681bc126f42955c2153e9c0da2f0a62bca8e0a05641f92" + "sha256:1a31156dc1f87d13483272cd7fe381664ded124b3b5e3d65385c23a309a1584e", + "sha256:60d1c48846c7fd5dbddfae38196fd1c43ffc83fb987ba477361254b93913ccbc" ], "markers": "python_version >= '3.7'", - "version": "==2.12.915" + "version": "==2.12.916" }, "verlib2": { "hashes": [ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-search-service/init/lib/dbrepo-1.8.1-py3-none-any.whl index f77eea076ca6a24674d220d3f54624b5f9a09202..261fa7958ae481d4d85bc5efc152e519fa6af802 100644 Binary files a/dbrepo-search-service/init/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-search-service/init/lib/dbrepo-1.8.1-py3-none-any.whl differ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.8.1.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.8.1.tar.gz index 7065ba14b7eadea39293894488821e3f38e0ef35..0da3ea37a31f2f3cdeea212e768aab7793f29252 100644 Binary files a/dbrepo-search-service/init/lib/dbrepo-1.8.1.tar.gz and b/dbrepo-search-service/init/lib/dbrepo-1.8.1.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl index f77eea076ca6a24674d220d3f54624b5f9a09202..261fa7958ae481d4d85bc5efc152e519fa6af802 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz index 7065ba14b7eadea39293894488821e3f38e0ef35..0da3ea37a31f2f3cdeea212e768aab7793f29252 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz and b/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz differ diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile index 4c3c671a05f2071696c335696f6bbbfd7c3c9687..d064d048b84444610d3c342b302811dd2044a681 100644 --- a/dbrepo-storage-service/init/Dockerfile +++ b/dbrepo-storage-service/init/Dockerfile @@ -1,8 +1,9 @@ FROM docker.io/python:3.11-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" -RUN apk add --no-cache bash \ - && pip install s3cmd +RUN apk --no-cache add \ + bash \ + s3cmd WORKDIR /app diff --git a/dbrepo-storage-service/init/init.sh b/dbrepo-storage-service/init/init.sh index 2339978957d4ffb02aa6e11a26f9c653dffd4da4..f7d8d21a4b6f8135e11409cfeb8fe337d0dd49c4 100644 --- a/dbrepo-storage-service/init/init.sh +++ b/dbrepo-storage-service/init/init.sh @@ -4,14 +4,20 @@ access_key = ${S3_ACCESS_KEY_ID} secret_key = ${S3_SECRET_ACCESS_KEY} # Setup endpoint host_base = ${STORAGE_ENDPOINT} -host_bucket = ${S3_BUCKET} +host_bucket = ${STORAGE_ENDPOINT} use_https = False # Enable S3 v4 signature APIs signature_v2 = False EOF -s3cmd --config=/app/.s3cfg ls | grep "s3://${S3_BUCKET}" + +# create bucket if s3cmd --config=/app/.s3cfg ls | grep -q "s3://${S3_BUCKET}"; then - echo "Bucket s3://${S3_BUCKET} already exists, skip." - exit 0 + echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip." +else + if ! s3cmd --config=/app/.s3cfg mb s3://${S3_BUCKET}; then + echo "[ERROR] Failed to create bucket s3://${S3_BUCKET}" + fi fi -s3cmd --config=/app/.s3cfg mb s3://${S3_BUCKET} \ No newline at end of file + +# expire daily +s3cmd --config=/app/.s3cfg expire s3://${S3_BUCKET} --expiry-prefix "" --expiry-days 1 \ No newline at end of file diff --git a/dbrepo-storage-service/init/tests/test_integration_expire.sh b/dbrepo-storage-service/init/tests/test_integration_expire.sh new file mode 100755 index 0000000000000000000000000000000000000000..b5e2c38573a159ea7a553235c8035da31c2d054d --- /dev/null +++ b/dbrepo-storage-service/init/tests/test_integration_expire.sh @@ -0,0 +1,67 @@ +#!/bin/bash +DOCKER_OPTS="--log-level ERROR" +S3CMD_OPTS="--config=/app/.s3cfg" + +export S3_ACCESS_KEY_ID="seaweedfsadmin" +export S3_BUCKET="dbrepo" +export S3_SECRET_ACCESS_KEY="seaweedfsadmin" +export STORAGE_ENDPOINT="localhost:9000" + +function clean () { + echo "[DEBUG] Shutting down environment ..." + docker $DOCKER_OPTS compose down + docker $DOCKER_OPTS rm $(docker volume ls -q) || true + echo "[DEBUG] Starting new environment ..." + docker $DOCKER_OPTS compose up -d dbrepo-storage-service-init + echo "[DEBUG] Waiting 10s ..." + sleep 10 +} + +# BeforeAll +clean + +# Test +echo "[DEBUG] run test init_succeeds" +bash ./dbrepo-storage-service/init/init.sh +if ! s3cmd $S3CMD_OPTS ls s3:// | grep -q "s3://${S3_BUCKET}"; then + echo "[ERROR] Failed to find bucket s3://${S3_BUCKET}" > /dev/stderr + exit 1 +fi + +# Test +echo "[DEBUG] run test init_idempotent_succeeds" +bash ./dbrepo-storage-service/init/init.sh +if ! s3cmd $S3CMD_OPTS ls s3:// | grep -q "s3://${S3_BUCKET}"; then + echo "[ERROR] Failed to find bucket s3://${S3_BUCKET}" > /dev/stderr + exit 1 +fi + +# Test +echo "[DEBUG] run test find_expiry_config_enabled_succeeds" +XPATH="string(//Rule/Status/text())" +RES=$(s3cmd $S3CMD_OPTS getlifecycle s3://${S3_BUCKET} | xmllint --xpath $XPATH -) +if [[ $RES != "Enabled" ]]; then + echo "[ERROR] Failed to find xpath $XPATH for bucket s3://${S3_BUCKET}" > /dev/stderr + exit 1 +fi + +# Test +echo "[DEBUG] run test find_expiry_config_prefix_succeeds" +XPATH="string(//Rule/Prefix/text())" +RES=$(s3cmd $S3CMD_OPTS getlifecycle s3://${S3_BUCKET} | xmllint --xpath $XPATH -) +if [[ $RES != "" ]]; then + echo "[ERROR] Failed to find xpath $XPATH for bucket s3://${S3_BUCKET}" > /dev/stderr + exit 1 +fi + +# Test +echo "[DEBUG] run test find_expiry_config_expiration_days_succeeds" +XPATH="number(//Rule/Expiration/Days/text())" +RES=$(s3cmd $S3CMD_OPTS getlifecycle s3://${S3_BUCKET} | xmllint --xpath $XPATH -) +if [[ $RES -ne 1 ]]; then + echo "[ERROR] Failed to find xpath $XPATH for bucket s3://${S3_BUCKET}" > /dev/stderr + exit 1 +fi + +echo "[INFO] Finished successfully" +exit 0 diff --git a/docker-compose.yml b/docker-compose.yml index 3d92b85c66168d465d45aa6955265718265172d1..aefe240d07c5d95ec474b4132adb78706f50da35 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -433,25 +433,22 @@ services: logging: driver: json-file - dbrepo-dashboard-service-init: + dbrepo-storage-service-init: restart: "no" init: true - container_name: dbrepo-dashboard-service-init - hostname: search-dashboard-init - image: dbrepo-dashboard-service-init:latest + container_name: dbrepo-storage-service-init + hostname: storage-service-init + image: dbrepo-storage-service-init:latest build: - context: ./dbrepo-dashboard-service/init + context: ./dbrepo-storage-service/init network: host environment: - LOG_LEVEL: ${LOG_LEVEL:-info} - DASHBOARD_UI_ENDPOINT: "${DASHBOARD_UI_ENDPOINT:-http://dashboard-ui:3000}" - METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} - SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" - SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" + S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} + S3_BUCKET: "${S3_BUCKET:-dbrepo}" + S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} + STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} depends_on: - dbrepo-dashboard-ui: - condition: service_healthy - dbrepo-metadata-service: + dbrepo-storage-service: condition: service_healthy logging: driver: json-file @@ -491,26 +488,6 @@ services: logging: driver: json-file - dbrepo-storage-service-init: - restart: "no" - init: true - container_name: dbrepo-storage-service-init - hostname: storage-service-init - image: dbrepo-storage-service-init:latest - build: - context: ./dbrepo-storage-service/init - network: host - environment: - S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} - S3_BUCKET: "${S3_BUCKET:-dbrepo}" - S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} - STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - depends_on: - dbrepo-storage-service: - condition: service_healthy - logging: - driver: json-file - dbrepo-data-service: restart: "no" container_name: dbrepo-data-service @@ -563,34 +540,26 @@ services: logging: driver: json-file - dbrepo-dashboard-ui: + dbrepo-dashboard-service-init: restart: "no" - container_name: dbrepo-dashboard-ui - hostname: dashboard-ui - image: dbrepo-dashboard-ui:latest + init: true + container_name: dbrepo-dashboard-service-init + hostname: search-dashboard-init + image: dbrepo-dashboard-service-init:latest build: - context: ./dbrepo-dashboard-ui + context: ./dbrepo-dashboard-service/init network: host - ports: - - "3000:3000" - volumes: - - dashboard-ui-data:/opt/bitnami/grafana/data environment: - BASE_URL: "${BASE_URL:-http://localhost}" - # do not attempt to set it in the grafana.ini, hours wasted here: 7 - GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ - GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" - GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" - LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" - LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" - LDAP_ROOT: "${IDENTITY_SERVICE_ROOT:-dc=dbrepo,dc=at}" - healthcheck: - test: curl -fsSL --head 127.0.0.1:3000 - interval: 10s - timeout: 5s - retries: 12 - extra_hosts: - - "localhost:host-gateway" + LOG_LEVEL: ${LOG_LEVEL:-info} + DASHBOARD_UI_ENDPOINT: "${DASHBOARD_UI_ENDPOINT:-http://dashboard-ui:3000}" + METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} + SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" + SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" + depends_on: + dbrepo-dashboard-ui: + condition: service_healthy + dbrepo-metadata-service: + condition: service_healthy logging: driver: json-file @@ -620,3 +589,34 @@ services: condition: service_healthy logging: driver: json-file + + dbrepo-dashboard-ui: + restart: "no" + container_name: dbrepo-dashboard-ui + hostname: dashboard-ui + image: dbrepo-dashboard-ui:latest + build: + context: ./dbrepo-dashboard-ui + network: host + ports: + - "3000:3000" + volumes: + - dashboard-ui-data:/opt/bitnami/grafana/data + environment: + BASE_URL: "${BASE_URL:-http://localhost}" + # do not attempt to set it in the grafana.ini, hours wasted here: 7 + GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" + GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" + LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" + LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" + LDAP_ROOT: "${IDENTITY_SERVICE_ROOT:-dc=dbrepo,dc=at}" + healthcheck: + test: ps -o pid= -p 1 + interval: 10s + timeout: 5s + retries: 12 + extra_hosts: + - "localhost:host-gateway" + logging: + driver: json-file diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz index 5d4eaf44f9d2cad626ea5ba966ebb777297f751f..6e3703cd38fdbc2e37da1dd76fb4b1e805e0baa0 100644 Binary files a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz and b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz differ diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index 4c541f2eb5bd4606250425f72aa7971a40164662..0b0771d3657d44c05fe9fe8fc62f2c7aef23c85b 100644 Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ diff --git a/helm/dbrepo/templates/gateway-configmap.yaml b/helm/dbrepo/templates/gateway-configmap.yaml index 328efdcd92706805ea42718edd16643ace769b6e..37863f85c45ae39134f5293687ca2f1bdb5e8223 100644 --- a/helm/dbrepo/templates/gateway-configmap.yaml +++ b/helm/dbrepo/templates/gateway-configmap.yaml @@ -31,18 +31,19 @@ data: } location /dashboard/ { - rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-ui; + proxy_pass http://dashboard-ui:3000/; proxy_read_timeout 90; } # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ { + location /dashboard/api/live/ws { rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; @@ -50,7 +51,7 @@ data: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_http_version 1.1; - proxy_pass http://dashboard-ui; + proxy_pass http://dashboard-ui:3000/; proxy_read_timeout 90; } diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index b4b53d788fde9e111eebf6702e965d16fcaec527..804354f21deb634c5055f9c4cc2a310cef0f5db9 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -605,19 +605,6 @@ } }, "type": "object" - }, - "service": { - "properties": { - "ports": { - "properties": { - "grafana": { - "type": "integer" - } - }, - "type": "object" - } - }, - "type": "object" } }, "type": "object" diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 70df20979f83018c8992e559b409600df10b5869..62ce16d3de3933c1be25c7a5602ff55be9c5cbbe 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -997,10 +997,6 @@ dashboardui: type: Recreate ## @skip dashboardui.grafana.extraEnvVarsSecret extraEnvVarsSecret: dashboard-ui-secret - service: - ports: - ## @skip dashboardui.service.ports.grafana - grafana: 80 ## @section Metric Service diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock index 8dd1eca11dc9946759c17aa45bbaad8a907a5b29..dfa3620f167709b52e2c54a4c5b55ef8dc6eb09b 100644 --- a/helm/seaweedfs/Chart.lock +++ b/helm/seaweedfs/Chart.lock @@ -4,9 +4,9 @@ dependencies: version: 20.4.2 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts - version: 16.6.2 + version: 16.6.3 - name: common repository: oci://registry-1.docker.io/bitnamicharts version: 2.30.0 -digest: sha256:cb37553e48186fba1bff1390779f26be6fe6b07639175192e1d8a413e51e9803 -generated: "2025-04-07T21:01:50.769214074+02:00" +digest: sha256:a1969ecd9ac27255060569f5e0e3f4ad93f999b8968e3f9c5e97d1536996ebd2 +generated: "2025-04-10T10:05:59.79430147+02:00" diff --git a/helm/seaweedfs/charts/postgresql-16.6.2.tgz b/helm/seaweedfs/charts/postgresql-16.6.2.tgz deleted file mode 100644 index 8fc7712307da4a39ac752f080251a103def4dc63..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/postgresql-16.6.2.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/postgresql-16.6.3.tgz b/helm/seaweedfs/charts/postgresql-16.6.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..36ca74dcb79a5d83a780bff787c379a488ef1875 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.6.3.tgz differ diff --git a/lib/python/dbrepo/core/client/dashboard.py b/lib/python/dbrepo/core/client/dashboard.py index 0797c0a76f00cecf4da7bb7eab90fe609cfdc9e1..b609da692bba7fc38ab45a507b1e7b52193b1ac4 100644 --- a/lib/python/dbrepo/core/client/dashboard.py +++ b/lib/python/dbrepo/core/client/dashboard.py @@ -9,9 +9,8 @@ from dbrepo.api.dto import Database, ColumnType, ViewColumn, View from dbrepo.core.api.dto import Permission from dbrepo.core.api.exceptions import DashboardNotFound -statistics_row_title = 'Generated Statistics' - -disclaimer = 'Generic auto-generated chart' +statistics_row_title = 'Generated Dashboard' +auto_generated_description = 'Auto-generated' number_types = [ColumnType.SERIAL, ColumnType.BIT, ColumnType.SMALLINT, ColumnType.MEDIUMINT, ColumnType.INT, ColumnType.BIGINT, ColumnType.FLOAT, ColumnType.DOUBLE, ColumnType.DECIMAL] @@ -72,6 +71,23 @@ def map_row(title: str, x: int = 0, y: int = 0) -> dict: y=y)) +def map_preview_image_panel(database_id: str, w: int = 4, h: int = 4, x: int = 20, y: int = 1) -> dict: + return dict(title='Preview Image', + type='text', + description=auto_generated_description, + gridPos=dict(h=h, + w=w, + x=x, + y=y), + fieldConfig=dict(defaults=dict(), + overrides=[]), + options=dict(mode="markdown", + code=dict(language="plaintext", + showLineNumbers=False, + showMiniMap=False), + content=f'<img src="/api/database/{database_id}/image" alt="" width="90" />')) + + class DashboardServiceClient: def __init__(self, endpoint: str, username: str, password: str, base_url: str = 'http://localhost', @@ -185,7 +201,7 @@ class DashboardServiceClient: if panel_type == 'histogram': fillOpacity = 60 return dict(title=panel_type.capitalize(), - description=disclaimer, + description=auto_generated_description, type=panel_type, datasource=datasource, targets=[dict(datasource=datasource, @@ -421,6 +437,48 @@ class DashboardServiceClient: y: int = 8) -> dict: return self._map_timeseries_panel(database_id, view, 'histogram', h, w, x, y) + def map_data_sources_panel(self, database_id: str, x: int = 0, y: int = 1) -> dict: + datasource = dict(uid=self.datasource_uid, + type='yesoreyeram-infinity-datasource') + return dict(title='Datasources', + description=auto_generated_description, + type='stat', + datasource=datasource, + targets=[dict(datasource=datasource, + columns=[], + filters=[], + format='table', + global_query_id='', + hide=False, + refId='A', + root_selector='$count(id)', + source='url', + type='json', + url=f'/api/database/{database_id}/view', + parser='backend', + url_options=dict(data='', + method='GET'))], + fieldConfig=dict(defaults=dict(mappings=[], + thresholds=dict(mode='absolute', + steps=[dict(color='blue', + value=None)])), + overrides=[]), + transformations=[], + gridPos=dict(h=4, + w=6, + x=x, + y=y), + options=dict(colorMode='background', + graphMode='area', + justifyMode='auto', + orientation='auto', + reduceOptions=dict(calcs=[], + fields='/.*/', + values=True), + showPercentChange=False, + textMode='auto', + wideLayout=True)) + def map_rows_panel(self, database_id: str, view_id: str, x: int = 18, y: int = 0) -> dict: return self._map_number_panel(database_id, view_id, 'Rows', 'total_rows', x, y) @@ -436,16 +494,19 @@ class DashboardServiceClient: except ValueError: logging.warning(f'No managed panels found') original_panels_size = len(panels) - panels.append(map_row(statistics_row_title, 0, 0)) # statistics row + panels.append(map_row(statistics_row_title, 0, 0)) + panels.append(self.map_data_sources_panel(database.id)) + if database.preview_image is not None: + panels.append(map_preview_image_panel(database.id)) for i, view in enumerate(database.views): # section - panels.append(map_row(view.name, 0, i * section_height + 0)) - panels.append(self.map_overview_panel(database.id, view.id, 0, i * section_height + 4)) - panels.append(self.map_rows_panel(database.id, view.id, 18, i * section_height + 0)) - panels.append(self.map_columns_panel(database.id, view.id, 18, i * section_height + 4)) - panels.append(self.map_statistics_panel(database.id, view.id, h=8, w=12, x=0, y=i * section_height + 8)) - panels.append(self.map_histogram_panel(database.id, view, h=8, w=12, x=12, y=i * section_height + 8)) - panels.append(self.map_timeseries_panel(database.id, view, h=8, w=8, x=0, y=i * section_height + 16)) - panels.append(self.map_pie_panel(database.id, view, h=8, w=8, x=8, y=i * section_height + 16)) + panels.append(map_row(view.name, 0, i * section_height + 4)) + panels.append(self.map_overview_panel(database.id, view.id, 0, i * section_height + 8)) + panels.append(self.map_rows_panel(database.id, view.id, 18, i * section_height + 4)) + panels.append(self.map_columns_panel(database.id, view.id, 18, i * section_height + 8)) + panels.append(self.map_statistics_panel(database.id, view.id, h=8, w=12, x=0, y=i * section_height + 12)) + panels.append(self.map_histogram_panel(database.id, view, h=8, w=12, x=12, y=i * section_height + 12)) + panels.append(self.map_timeseries_panel(database.id, view, h=8, w=8, x=0, y=i * section_height + 20)) + panels.append(self.map_pie_panel(database.id, view, h=8, w=8, x=8, y=i * section_height + 20)) logging.info(f'Added {len(panels) - original_panels_size} managed panel(s)') return panels diff --git a/lib/python/dbrepo/core/client/search.py b/lib/python/dbrepo/core/client/search.py index 033ed0beda53ffe6bc3e6263bb63bff90079ca70..c0c25966aecece2b4b839981284dca70825d5f21 100644 --- a/lib/python/dbrepo/core/client/search.py +++ b/lib/python/dbrepo/core/client/search.py @@ -6,15 +6,14 @@ import os from collections.abc import MutableMapping from json import dumps, load -from opensearchpy import OpenSearch, NotFoundError -from requests import head - from dbrepo.api.dto import Database from dbrepo.api.exceptions import ForbiddenError, NotExistsError from dbrepo.core.omlib.constants import OM_IDS from dbrepo.core.omlib.measure import om from dbrepo.core.omlib.omconstants import OM from dbrepo.core.omlib.unit import Unit +from opensearchpy import OpenSearch, NotFoundError +from requests import head class SearchServiceClient: @@ -23,14 +22,14 @@ class SearchServiceClient: """ instance: OpenSearch = None - def __init__(self, host: str = None, port: int = 9000, username: str = None, password: str = None): + def __init__(self, host: str = None, port: int = 9000, username: str = 'admin', password: str = 'admin'): if host is None: host = 'search-db' self.host = os.getenv('OPENSEARCH_HOST', host) self.metadata_endpoint = os.getenv('METADATA_SERVICE_ENDPOINT', 'http://metadata-service:8080') self.port = int(os.getenv('OPENSEARCH_PORT', port)) - self.system_username = os.getenv('SYSTEM_USERNAME', 'admin') - self.system_password = os.getenv('SYSTEM_PASSWORD', 'admin') + self.system_username = os.getenv('SYSTEM_USERNAME', username) + self.system_password = os.getenv('SYSTEM_PASSWORD', password) def _instance(self) -> OpenSearch: """ @@ -39,9 +38,9 @@ class SearchServiceClient: @returns: The opensearch instance singleton, if successful. """ if self.instance is None: - self.instance = SearchServiceClient(hosts=[{"host": self.host, "port": self.port}], - http_compress=True, - http_auth=(self.system_username, self.system_password)) + self.instance = OpenSearch(hosts=[{"host": self.host, "port": self.port}], + http_compress=True, + http_auth=(self.system_username, self.system_password)) return self.instance def database_exists(self, database_id: str):