Show describe modal (#7)

This commit is contained in:
Andrey Pokhilko
2022-09-08 15:56:05 +01:00
committed by GitHub
parent 476a2a32d9
commit 7b6e9f1748
6 changed files with 60 additions and 4 deletions

View File

@@ -3,7 +3,7 @@
builds: builds:
- main: ./main.go - main: ./main.go
binary: helm-dashboard binary: helm-dashboard
ldflags: -s -w -X main.version={{.Version}} -X main.version={{.Version}} -X main.version={{.Version}} -X main.date={{.Date}} ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}
goos: goos:
- windows - windows
- darwin - darwin

View File

@@ -70,3 +70,4 @@ Adding new repository
Recognise & show ArgoCD-originating charts/objects Recognise & show ArgoCD-originating charts/objects
Have cleaner idea on the web API structure Have cleaner idea on the web API structure
See if we can build in Chechov or Validkube validation See if we can build in Chechov or Validkube validation
Show manifest/describe upon clicking on resource

View File

@@ -205,6 +205,23 @@ func configureKubectls(api *gin.Engine, data *DataLayer) {
c.IndentedJSON(http.StatusOK, res) c.IndentedJSON(http.StatusOK, res)
}) })
api.GET("/api/kube/describe/:kind", func(c *gin.Context) {
cName := c.Query("name")
cNamespace := c.Query("namespace")
if cName == "" {
_ = c.AbortWithError(http.StatusBadRequest, errors.New("missing required query string parameter: name"))
return
}
res, err := data.DescribeResource(cNamespace, c.Param("kind"), cName)
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError, err)
return
}
c.String(http.StatusOK, res)
})
} }
func configureStatic(api *gin.Engine) { func configureStatic(api *gin.Engine) {

View File

@@ -317,6 +317,14 @@ func (d *DataLayer) GetResource(namespace string, def *GenericResource) (*Generi
return &res, nil return &res, nil
} }
func (d *DataLayer) DescribeResource(namespace string, kind string, name string) (string, error) {
out, err := d.runCommandKubectl("describe", strings.ToLower(kind), name, "--namespace", namespace)
if err != nil {
return "", err
}
return out, nil
}
func RevisionDiff(functor SectionFn, ext string, namespace string, name string, revision1 int, revision2 int, flag bool) (string, error) { func RevisionDiff(functor SectionFn, ext string, namespace string, name string, revision1 int, revision2 int, flag bool) (string, error) {
if revision1 == 0 || revision2 == 0 { if revision1 == 0 || revision2 == 0 {
log.Debugf("One of revisions is zero: %d %d", revision1, revision2) log.Debugf("One of revisions is zero: %d %d", revision1, revision2)

View File

@@ -123,7 +123,20 @@
</div> </div>
</div> </div>
<div class="modal" id="describeModal"
tabindex="-1" aria-labelledby="describeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="describeModalLabel"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="describeModalBody">
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js" <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"
integrity="sha384-A3rJD856KowSb7dwlZdYEkO39Gagi7vIsF0jrRAoQmDKKtQBHUuLZ9AsSv4jD4Xa" integrity="sha384-A3rJD856KowSb7dwlZdYEkO39Gagi7vIsF0jrRAoQmDKKtQBHUuLZ9AsSv4jD4Xa"

View File

@@ -341,9 +341,12 @@ function showResources(namespace, chart, revision) {
badge.addClass("bg-danger") badge.addClass("bg-danger")
} }
resBlock.find(".form-control").empty().append(badge).append("<span class='text-muted small'>" + (data.status.message ? data.status.message : '') + "</span>") resBlock.find(".form-control.col-sm-4").empty().append(badge).append("<span class='text-muted small'>" + (data.status.message ? data.status.message : '') + "</span>").prepend("<i class=\"btn fa fa-search-plus float-end text-muted\"></i>")
})
resBlock.find(".fa-search-plus").click(function () {
showDescribe(ns, res.kind, res.metadata.name)
})
})
} }
}) })
} }
@@ -357,3 +360,17 @@ $(".fa-power-off").click(function () {
window.close(); window.close();
}) })
}) })
function showDescribe(ns, kind, name) {
$("#describeModalLabel").text("Describe " + kind + ": " + ns + " / " + name)
$("#describeModalBody").empty().append("<i class='fa fa-spin fa-spinner fa-2x'></i>")
const myModal = new bootstrap.Modal(document.getElementById('describeModal'), {});
myModal.show()
$.get("/api/kube/describe/" + kind.toLowerCase() + "?name=" + name + "&namespace=" + ns).fail(function () {
reportError("Failed to describe resource")
}).done(function (data) {
data = hljs.highlight(data, {language: 'yaml'}).value
$("#describeModalBody").empty().append("<pre class='bg-white rounded p-3'></pre>").find("pre").html(data)
})
}