From 8adbd490516624458fd2c98bff19f3d2628c8d6d Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Fri, 10 Apr 2020 21:20:53 +0200 Subject: [PATCH] *: more hackdoc updates Change-Id: Ib9830c66fe36c423d38f447905c470b67cde5399 --- README.md | 18 +++++-- WORKSPACE | 10 ++++ cluster/{README.md => doc/admin.md} | 24 +++------ cluster/doc/index.md | 6 +++ cluster/doc/user.md | 58 +++++++++++++++++++++ devtools/depotview/BUILD.bazel | 26 ++++++++++ devtools/depotview/README.md | 5 ++ devtools/hackdoc/BUILD.bazel | 27 ++++++++++ devtools/hackdoc/README.md | 2 +- devtools/hackdoc/config/BUILD.bazel | 1 - devtools/hackdoc/main.go | 10 ++-- devtools/hackdoc/markdown.go | 76 ++++++++++++++++++++-------- devtools/hackdoc/tpl/default.html | 35 ++++++++++--- doc/img/hscloud-smol.png | Bin 0 -> 12326 bytes doc/img/hscloud.png | Bin 0 -> 40783 bytes 15 files changed, 241 insertions(+), 57 deletions(-) rename cluster/{README.md => doc/admin.md} (78%) create mode 100644 cluster/doc/index.md create mode 100644 cluster/doc/user.md create mode 100644 doc/img/hscloud-smol.png create mode 100644 doc/img/hscloud.png diff --git a/README.md b/README.md index 11a05a7f..7d2684d3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -hscloud -======= +![](doc/img/hscloud-smol.png) `hscloud` is the main monorepo of the Warsaw Hackerspace infrastructure code. @@ -14,7 +13,14 @@ For a pleaseant web viewing experience, [see this documentation in hackdoc](http Getting started --------------- -You will need Bash and Bazel (1.2.0+). Clone this repo, cd into it and: +You will need Bash and Bazel (1.2.0+). + +First, clone the repository: + + git clone https://gerrit.hackerspace.pl/hscloud + cd hscloud + +Then, set up everything: . ./env.sh # setup PATH and hscloud_root tools/install.sh # build tools @@ -26,10 +32,12 @@ This does not pollute your system, and you can work on multiple hscloud checkout What now? --------- -If you want to use our Kubernetes cluster to run some stuff, see [//cluster/doc/user](cluster/doc/user). +If you want to use our Kubernetes cluster to run some stuff, see [//cluster/doc/user.md](cluster/doc/user.md). -If you're looking for administrative docs about cluster maintenance, see [//cluster/doc/admin](cluster/doc/admin). +If you're looking for administrative docs about cluster maintenance, see [//cluster/doc/admin.md](cluster/doc/admin.md). If you want to browse the source of `hscloud` in a web browser, use [gerrit's gitiles](https://gerrit.hackerspace.pl/plugins/gitiles/hscloud/+/refs/heads/master/). If you want to learn how to contribute to this repository, see [//doc/codelab/gerrit](doc/codelab/gerrit). + +If you want help, talk to q3k, informatic or your therapist. diff --git a/WORKSPACE b/WORKSPACE index bf25c0c2..75f3901d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -197,6 +197,7 @@ http_archive( ], sha256 = "d8c45ee70ec39a57e7a05e5027c32b1576cc7f16d9dd37135b0eddde45cf1b10", ) + load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") go_repository( @@ -207,8 +208,11 @@ go_repository( # Invoke go_rules_dependencies depending on host platform. load("//tools:go_sdk.bzl", "gen_imports") + gen_imports(name = "go_sdk_imports") + load("@go_sdk_imports//:imports.bzl", "load_go_sdk") + load_go_sdk() gazelle_dependencies() @@ -2012,3 +2016,9 @@ go_repository( commit = "6a3e2ff9e7c564f36873c2e36413f634534f1c44", importpath = "github.com/xanzy/ssh-agent", ) + +go_repository( + name = "com_github_gabriel_vasile_mimetype", + commit = "06500030e7d26826f68caa5ca7d98c315c4caa28", + importpath = "github.com/gabriel-vasile/mimetype", +) diff --git a/cluster/README.md b/cluster/doc/admin.md similarity index 78% rename from cluster/README.md rename to cluster/doc/admin.md index 01208592..27b30ca1 100644 --- a/cluster/README.md +++ b/cluster/doc/admin.md @@ -1,23 +1,10 @@ HSCloud Clusters ================ +Admin documentation. For user documentation, see [//cluster/doc/user.md](/cluster/doc/user.md). + Current cluster: `k0.hswaw.net` -Accessing via kubectl ---------------------- - - prodaccess # get a short-lived certificate for your use via SSO - # if youre local username is not the same as your HSWAW SSO - # username, pass `-username foo` - kubectl version - kubectl top nodes - -Every user gets a `personal-$username` namespace. Feel free to use it for your own purposes, but watch out for resource usage! - - kubectl run -n personal-$username run --image=alpine:latest -it foo - -To proceed further you should be somewhat familiar with Kubernetes. Otherwise the rest of terminology might not make sense. We recommend going through the original Kubernetes tutorials. - Persistent Storage (waw2) ------------------------- @@ -64,9 +51,10 @@ Ceph - Debugging We run Ceph via Rook. The Rook operator is running in the `ceph-rook-system` namespace. To debug Ceph issues, start by looking at its logs. -A dashboard is available at https://ceph-waw2.hswaw.net/, to get the admin password run: +A dashboard is available at https://ceph-waw2.hswaw.net/ and https://ceph-waw3.hswaw.net, to get the admin password run: kubectl -n ceph-waw2 get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}' | base64 --decode ; echo + kubectl -n ceph-waw2 get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}' | base64 --decode ; echo Ceph - Backups @@ -75,6 +63,7 @@ Ceph - Backups Kubernetes PVs backed in Ceph RBDs get backed up using Benji. An hourly cronjob runs in every Ceph cluster. You can also manually trigger a run by doing: kubectl -n ceph-waw2 create job --from=cronjob/ceph-waw2-benji ceph-waw2-benji-manual-$(date +%s) + kubectl -n ceph-waw3 create job --from=cronjob/ceph-waw3-benji ceph-waw3-benji-manual-$(date +%s) Ceph ObjectStorage pools (RADOSGW) are _not_ backed up yet! @@ -83,8 +72,7 @@ Ceph - Object Storage To create an object store user consult rook.io manual (https://rook.io/docs/rook/v0.9/ceph-object-store-user-crd.html) User authentication secret is generated in ceph cluster namespace (`ceph-waw2`), -thus may need to be manually copied into application namespace. (see -`app/registry/prod.jsonnet` comment) +thus may need to be manually copied into application namespace. (see `app/registry/prod.jsonnet` comment) `tools/rook-s3cmd-config` can be used to generate test configuration file for s3cmd. Remember to append `:default-placement` to your region name (ie. `waw-hdd-redundant-1-object:default-placement`) diff --git a/cluster/doc/index.md b/cluster/doc/index.md new file mode 100644 index 00000000..afd04e43 --- /dev/null +++ b/cluster/doc/index.md @@ -0,0 +1,6 @@ +Warsaw Hackerspace Kubernetes Cluster +===================================== + +**User documentation**: [user.md](user.md). + +**Admin documentation**: [admin.md](admin.md). diff --git a/cluster/doc/user.md b/cluster/doc/user.md new file mode 100644 index 00000000..6dd6938a --- /dev/null +++ b/cluster/doc/user.md @@ -0,0 +1,58 @@ +Warsaw Hackerspace Kubernetes Clusters +====================================== + +End-user^Whacker documentation. + +Intro +----- + +We run Kubernetes, a cluster system on our production machines. This allows you to schedule software to run without having to worry about traditional deployment, or where your particular piece of code is actually running. This document will not teach you how to use Kubernetes, but will give you a short hands-on example on how to access it, and then point you in the right direction for general documentation to follow. + +Accessing Kubernetes +-------------------- + +Kubernetes is accessed fully via an API, for which there exists a standard command line tool: `kubectl`. If you've check out hscloud and followed the instructions in [//README.md]("/README.md"), you should have that tool built and available for you to use. + +Before you can use `kubectl`, however, you will need to authenticate yourself. To do that, run `prodaccess`. This will issue you short-term (~hours) credentials that `kubectl` can then pass on to Kubernetes to authenticate itself. + + $ prodaccess + Enter SSO/LDAP password for q3k@hackerspace.pl: + Good evening professor. I see you have driven here in your Ferrari. + +If `prodaccess` is not on your $PATH, ensure you have sourced `env.sh` from the root of hscloud and ran `tools/install.sh`. + +By default, `prodaccess` will use your local user name to authenticate as `@hackerspce.pl`. If your Hackerspace SSO name is different, specify it using the `-u` flag to prodaccess, eg. `prodaccess -u informatic`. + +You can now check that you indeed have access to Kubernetes: + + $ kubectl version # show version of Kubernetes + $ kubectl top nodes # show node (machine/server) statistics + +You are now fully set up to schedule your own jobs on `k0.hswaw.net`, our currently only Kubernetes cluster. + +Running Stuff +------------- + +We have a fairly extensive role-based access control system set up to provide a level of multi-tenancy of our Kubernetes cluster. What this means is that you will not be able to modify other people's stuff. Indeed, by default, you barely have any access. So as you can experiment with Kubernetes, we automatically provision you a personal namespace (`personal-$USER`) in Kubernetes. This acts as your own playground, where you can run anything you want, as long as it doesn't eat into our resources too much. + +For example, to run an Alpine Linux Docker image in your own namespace: + + kubectl -n personal-$USER run --image=alpine:latest -it foo + +This will create a Kubernetes deployment named foo, running the `alpine:latest` Docker image, and drop you in an interactive shell in it. Naturally, replace `$USER` with your SSO username if it's different from your system username. + +Once you're done, delete the Deployment: + + kubectl -n personal-$USER delete deployment foo + +Pod Security +------------ + +Apart from the RBAC (role based access control) that prevents you from poling at things that you shouldn't over the API, we have one more security measure in place. Throught a Kubernetes mechanism called 'PodSecurityPolicy' we limit what pods (ie. containers) can do. Notably, pods will by default not be able to access any host data, run in privileged mode, or even setuid to a different uid. The most notable side effect of this is that some basic system tools within pods will not work: ie., apt on Ubuntu. + +More Kubernetes +--------------- + +We highly recommend following the [Kubernetes Basics](https://kubernetes.io/docs/tutorials/kubernetes-basics/) tutorial as a first step in using Kubernetes for real world applications. + +For defining production jobs, we use a language called `Jsonnet` via a tool called `kubecfg`. This is to replace some more popular tools that other Kubernetes systems use, eg. Helm. For more information about that, ping q3k so that he writes a codelab about it :). diff --git a/devtools/depotview/BUILD.bazel b/devtools/depotview/BUILD.bazel index 223f64cc..908a6298 100644 --- a/devtools/depotview/BUILD.bazel +++ b/devtools/depotview/BUILD.bazel @@ -1,3 +1,4 @@ +load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_layer", "container_push") load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") go_library( @@ -18,3 +19,28 @@ go_binary( embed = [":go_default_library"], visibility = ["//visibility:public"], ) + +container_layer( + name = "layer_bin", + files = [ + ":depotview", + ], + directory = "/devtools/", +) + +container_image( + name = "runtime", + base = "@prodimage-bionic//image", + layers = [ + ":layer_bin", + ], +) + +container_push( + name = "push", + image = ":runtime", + format = "Docker", + registry = "registry.k0.hswaw.net", + repository = "devtools/depotview", + tag = "{BUILD_TIMESTAMP}-{STABLE_GIT_COMMIT}", +) diff --git a/devtools/depotview/README.md b/devtools/depotview/README.md index 9b806a66..e1faca40 100644 --- a/devtools/depotview/README.md +++ b/devtools/depotview/README.md @@ -3,6 +3,11 @@ depotview Git-as-a-service over gRPC. Useful to get read-only access to hscloud. +Production +---------- + +There's a prod instance running at depotview.devtools-prod.svc.cluster.local. + Development ----------- diff --git a/devtools/hackdoc/BUILD.bazel b/devtools/hackdoc/BUILD.bazel index 3988dfe5..5536760c 100644 --- a/devtools/hackdoc/BUILD.bazel +++ b/devtools/hackdoc/BUILD.bazel @@ -1,3 +1,4 @@ +load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_layer", "container_push") load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") go_library( @@ -15,6 +16,7 @@ go_library( "//devtools/hackdoc/source:go_default_library", "//go/mirko:go_default_library", "//go/pki:go_default_library", + "@com_github_gabriel_vasile_mimetype//:go_default_library", "@com_github_golang_glog//:go_default_library", "@in_gopkg_russross_blackfriday_v2//:go_default_library", "@org_golang_google_grpc//:go_default_library", @@ -26,3 +28,28 @@ go_binary( embed = [":go_default_library"], visibility = ["//visibility:public"], ) + +container_layer( + name = "layer_bin", + files = [ + ":hackdoc", + ], + directory = "/devtools/", +) + +container_image( + name = "runtime", + base = "@prodimage-bionic//image", + layers = [ + ":layer_bin", + ], +) + +container_push( + name = "push", + image = ":runtime", + format = "Docker", + registry = "registry.k0.hswaw.net", + repository = "devtools/hackdoc", + tag = "{BUILD_TIMESTAMP}-{STABLE_GIT_COMMIT}", +) diff --git a/devtools/hackdoc/README.md b/devtools/hackdoc/README.md index 45d4486d..3226cf2b 100644 --- a/devtools/hackdoc/README.md +++ b/devtools/hackdoc/README.md @@ -18,6 +18,6 @@ Local Rendering To run hackdoc locally on a filesystem checkout (ie. when working on docs, templates, or hackdoc itself), run: - bazel run //devtools/hackdoc:local + bazel run //devtools/hackdoc -- -hspki_disable -docroot /path/to/hscloud The output log should tell you where hackdoc just started listening at. Currently this is `127.0.0.1:8080` by default. You can change this by passing a `-listen` flag, eg. `-listen 127.0.0.1:4242`. diff --git a/devtools/hackdoc/config/BUILD.bazel b/devtools/hackdoc/config/BUILD.bazel index fecf6381..c5052c7b 100644 --- a/devtools/hackdoc/config/BUILD.bazel +++ b/devtools/hackdoc/config/BUILD.bazel @@ -8,7 +8,6 @@ go_library( deps = [ "//devtools/hackdoc/source:go_default_library", "@com_github_burntsushi_toml//:go_default_library", - "@com_github_golang_glog//:go_default_library", ], ) diff --git a/devtools/hackdoc/main.go b/devtools/hackdoc/main.go index 558268b4..aae850f7 100644 --- a/devtools/hackdoc/main.go +++ b/devtools/hackdoc/main.go @@ -111,7 +111,6 @@ func (s *service) handler(w http.ResponseWriter, r *http.Request) { return } - glog.Infof("%+v", r.URL.Query()) ref := r.URL.Query().Get("ref") if ref == "" { ref = flagGitwebDefaultBranch @@ -206,7 +205,7 @@ func (r *request) handlePageAuto(dirpath string) { } if file { - r.handleMarkdown(fpath, cfg) + http.Redirect(r.w, r.r, "/"+fpath, 302) return } } @@ -238,13 +237,18 @@ func (r *request) handlePage(page string) { if file { parts := strings.Split(r.rpath, "/") dirpath := strings.Join(parts[:(len(parts)-1)], "/") + // TODO(q3k): figure out this hack, hopefully by implementing a real path type + if dirpath == "/" { + dirpath = "//" + } + cfg, err := config.ForPath(r.ctx, r.source, dirpath) if err != nil { glog.Errorf("could not get config for path %q: %w", dirpath, err) r.handle500() return } - r.handleMarkdown(r.rpath, cfg) + r.handleFile(r.rpath, cfg) return } diff --git a/devtools/hackdoc/markdown.go b/devtools/hackdoc/markdown.go index 911c2c0b..fb46c5d2 100644 --- a/devtools/hackdoc/markdown.go +++ b/devtools/hackdoc/markdown.go @@ -8,6 +8,7 @@ import ( "code.hackerspace.pl/hscloud/devtools/hackdoc/config" + "github.com/gabriel-vasile/mimetype" "github.com/golang/glog" "gopkg.in/russross/blackfriday.v2" ) @@ -31,6 +32,7 @@ func renderMarkdown(input []byte, ref string) []byte { q["ref"] = []string{ref} u.RawQuery = q.Encode() node.Destination = []byte(u.String()) + glog.Infof("link fix %q -> %q", dest, u.String()) } } return r.RenderNode(&buf, node, entering) @@ -38,7 +40,12 @@ func renderMarkdown(input []byte, ref string) []byte { return buf.Bytes() } -func (r *request) handleMarkdown(path string, cfg *config.Config) { +type pathPart struct { + Label string + Path string +} + +func (r *request) handleFile(path string, cfg *config.Config) { data, err := r.source.ReadFile(r.ctx, path) if err != nil { glog.Errorf("ReadFile(%q): %w", err) @@ -46,30 +53,55 @@ func (r *request) handleMarkdown(path string, cfg *config.Config) { return } - rendered := renderMarkdown([]byte(data), r.ref) + // TODO(q3k): do MIME detection instead. + if strings.HasSuffix(path, ".md") { + rendered := renderMarkdown([]byte(data), r.ref) - r.logRequest("serving markdown at %s, cfg %+v", path, cfg) + r.logRequest("serving markdown at %s, cfg %+v", path, cfg) + + // TODO(q3k): allow markdown files to override which template to load + tmpl, ok := cfg.Templates["default"] + if !ok { + glog.Errorf("No default template found for %s", path) + // TODO(q3k): implement fallback template + r.w.Write(rendered) + return + } + + pathInDepot := strings.TrimPrefix(path, "//") + pathParts := []pathPart{ + {Label: "//", Path: "/"}, + } + parts := strings.Split(pathInDepot, "/") + fullPath := "" + for i, p := range parts { + label := p + if i != len(parts)-1 { + label = label + "/" + } + fullPath += "/" + p + pathParts = append(pathParts, pathPart{Label: label, Path: fullPath}) + } + + vars := map[string]interface{}{ + "Rendered": template.HTML(rendered), + "Title": path, + "Path": path, + "PathInDepot": pathInDepot, + "PathParts": pathParts, + "HackdocURL": flagHackdocURL, + "WebLinks": r.source.WebLinks(pathInDepot), + } + err = tmpl.Execute(r.w, vars) + if err != nil { + glog.Errorf("Could not execute template for %s: %v", err) + } - // TODO(q3k): allow markdown files to override which template to load - tmpl, ok := cfg.Templates["default"] - if !ok { - glog.Errorf("No default template found for %s", path) - // TODO(q3k): implement fallback template - r.w.Write(rendered) return } - pathInDepot := strings.TrimPrefix(path, "//") - vars := map[string]interface{}{ - "Rendered": template.HTML(rendered), - "Title": path, - "Path": path, - "PathInDepot": pathInDepot, - "HackdocURL": flagHackdocURL, - "WebLinks": r.source.WebLinks(pathInDepot), - } - err = tmpl.Execute(r.w, vars) - if err != nil { - glog.Errorf("Could not execute template for %s: %v", err) - } + // Just serve the file. + mime := mimetype.Detect(data) + r.w.Header().Set("Content-Type", mime.String()) + r.w.Write(data) } diff --git a/devtools/hackdoc/tpl/default.html b/devtools/hackdoc/tpl/default.html index 71209627..a6c1d428 100644 --- a/devtools/hackdoc/tpl/default.html +++ b/devtools/hackdoc/tpl/default.html @@ -58,7 +58,7 @@ body { } .column { - max-width: 80em; + width: 80em; padding: 1rem 0 1rem 0; } @@ -85,8 +85,16 @@ body { color: #b30014; } -.header span.muted { +.header span.part { color: #666; + padding-left: 0.2em; +} + +.header span.part a { + color: rgb(27, 106, 203); +} +.header span.part a:visited { + color: rgb(27, 106, 203); } .footer { @@ -98,6 +106,14 @@ body { text-align: right; } +.footer .left { + float: left; +} + +.footer .right { + float: right; +} + .footer a { color: #bbb; } @@ -164,15 +180,20 @@ ul li::before {
- hackdoc:{{ .Path }} - {{ range .WebLinks }} - [{{ .Kind }} {{ .LinkLabel }}] - {{ end }} + hackdoc: + {{ range .PathParts }}{{ .Label }}{{ end }} + shortcuts: root, cluster docs, codelabs
{{ .Rendered }}
diff --git a/doc/img/hscloud-smol.png b/doc/img/hscloud-smol.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa3126cdf3c77371ac4a37601b69bbad589ce90 GIT binary patch literal 12326 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 literal 0 HcmV?d00001 diff --git a/doc/img/hscloud.png b/doc/img/hscloud.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3c1a19d0cb91960b29b83285800487f6fbc48d GIT binary patch literal 40783 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 #Ne&V?mIF^fK1$vn-wvHE$o^mrK1NgRry} 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