From a1a70d4a3c6a8314dd2ad35344d440e4ba8e86e8 Mon Sep 17 00:00:00 2001
From: Evan Steinkerchner <esteinkerchner@gmail.com>
Date: Tue, 1 Mar 2022 20:55:45 -0500
Subject: Added Portainer custom service

---
 src/components/services/Portainer.vue | 122 ++++++++++++++++++++++++++++++++++
 1 file changed, 122 insertions(+)
 create mode 100644 src/components/services/Portainer.vue

(limited to 'src/components/services/Portainer.vue')

diff --git a/src/components/services/Portainer.vue b/src/components/services/Portainer.vue
new file mode 100644
index 0000000..0af30eb
--- /dev/null
+++ b/src/components/services/Portainer.vue
@@ -0,0 +1,122 @@
+<template>
+  <Generic :item="item">
+    <template #indicator>
+      <div class="notifs">
+        <strong v-if="running > 0" class="notif running" title="Running">
+          {{ running }}
+        </strong>
+        <strong v-if="dead > 0" class="notif dead" title="Dead">
+          {{ dead }}
+        </strong>
+        <strong v-if="misc > 0" class="notif misc" title="Other (creating, paused, exited, etc.)">
+          {{ misc }}
+        </strong>
+      </div>
+    </template>
+  </Generic>
+</template>
+
+<script>
+import service from "@/mixins/service.js";
+import Generic from "./Generic.vue";
+
+export default {
+  name: "Portainer",
+  mixins: [service],
+  props: {
+    item: Object,
+  },
+  components: {
+    Generic,
+  },
+  data: () => ({
+    endpoints: null,
+    containers: null,
+  }),
+  computed: {
+    running: function () {
+      if (!this.containers) {
+        return "";
+      }
+      return this.containers.filter((container) => {
+        return container.State.toLowerCase() === "running";
+      }).length;
+    },
+    dead: function () {
+      if (!this.containers) {
+        return "";
+      }
+      return this.containers.filter((container) => {
+        return container.State.toLowerCase() === "dead";
+      }).length || 1;
+    },
+    misc: function () {
+      if (!this.containers) {
+        return "";
+      }
+      return this.containers.filter((container) => {
+        return container.State.toLowerCase() !== "running" && container.State.toLowerCase() !== "dead";
+      }).length;
+    },
+  },
+  created() {
+    this.fetchStatus();
+  },
+  methods: {
+    fetchStatus: async function () {
+      const headers = {
+        "X-Api-Key": this.item.apikey,
+      };
+
+      this.endpoints = await this.fetch("/api/endpoints", { headers })
+        .catch((e) => {
+          console.error(e);
+        });
+
+      let containers = [];
+      for (let endpoint of this.endpoints) {
+        const uri = `/api/endpoints/${endpoint.Id}/docker/containers/json?all=1`;
+        const endpointContainers = await this.fetch(uri, { headers })
+          .catch((e) => {
+            console.error(e);
+          });
+
+        containers = containers.concat(endpointContainers);
+      }
+
+      this.containers = containers;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.notifs {
+  position: absolute;
+  color: white;
+  font-family: sans-serif;
+  top: 0.3em;
+  right: 0.5em;
+
+  .notif {
+    display: inline-block;
+    padding: 0.2em 0.35em;
+    border-radius: 0.25em;
+    position: relative;
+    margin-left: 0.3em;
+    font-size: 0.8em;
+
+    &.running {
+      background-color: #4fd671;
+    }
+
+    &.dead {
+      background-color: #e51111;
+    }
+
+    &.misc {
+      background-color: #2ed0c8;
+    }
+  }
+}
+</style>
-- 
cgit v1.2.3


From edd2c9ce2dc2d6aaf8e125434ed386de7056ab1d Mon Sep 17 00:00:00 2001
From: Evan Steinkerchner <esteinkerchner@gmail.com>
Date: Tue, 1 Mar 2022 21:05:14 -0500
Subject: Removed number fudging used for testing

---
 src/components/services/Portainer.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/components/services/Portainer.vue')

diff --git a/src/components/services/Portainer.vue b/src/components/services/Portainer.vue
index 0af30eb..176d92e 100644
--- a/src/components/services/Portainer.vue
+++ b/src/components/services/Portainer.vue
@@ -48,7 +48,7 @@ export default {
       }
       return this.containers.filter((container) => {
         return container.State.toLowerCase() === "dead";
-      }).length || 1;
+      }).length;
     },
     misc: function () {
       if (!this.containers) {
-- 
cgit v1.2.3

