1
0
Fork 0

*: docs pass

Change-Id: I87ca80d3f7728ed407071468ac233e6ad4574929
master
q3k 2021-03-06 22:16:17 +00:00
parent c0d9ea081f
commit 3ba5c1b591
11 changed files with 429 additions and 340 deletions

7
cluster/README.md Normal file
View File

@ -0,0 +1,7 @@
Cluster Docs Home
=================
Documentation relating to our Kubernetes cluster(s).
For information about the physical DC infrastructure, see [//dc](/dc/).

View File

@ -1,31 +1,8 @@
HSCloud Clusters
================
Admin documentation. For user documentation, see [//cluster/doc/user.md](/cluster/doc/user.md).
Cluster Admin Docs
==================
Current cluster: `k0.hswaw.net`
Persistent Storage (waw2)
-------------------------
HDDs on bc01n0{1-3}. 3TB total capacity. Don't use this as this pool should go
away soon (the disks are slow, the network is slow and the RAID controllers
lie). Use ceph-waw3 instead.
The following storage classes use this cluster:
- `waw-hdd-paranoid-1` - 3 replicas
- `waw-hdd-redundant-1` - erasure coded 2.1
- `waw-hdd-yolo-1` - unreplicated (you _will_ lose your data)
- `waw-hdd-redundant-1-object` - erasure coded 2.1 object store
Rados Gateway (S3) is available at https://object.ceph-waw2.hswaw.net/. To
create a user, ask an admin.
PersistentVolumes currently bound to PersistentVolumeClaims get automatically
backed up (hourly for the next 48 hours, then once every 4 weeks, then once
every month for a year).
Persistent Storage (waw3)
-------------------------

13
cluster/doc/site.html Normal file
View File

@ -0,0 +1,13 @@
{{ define "header" }}
<span class="red">hackdoc://cluster</span>
<span>Hackerspace Cluster Docs</span>
{{ end }}
{{ define "topbar" }}
<span><a href="/cluster/">Home</a></span>
<span><a href="/cluster/doc/user.md">User Docs</a></span>
<span><a href="/cluster/doc/admin.md">Admin Docs</a></span>
{{ end }}
{{ define "sidebar" }}
{{ end }}

View File

@ -1,5 +1,5 @@
Warsaw Hackerspace Kubernetes Clusters
======================================
Cluster User Docs
=================
End-user^Whacker documentation.

5
cluster/hackdoc.toml Normal file
View File

@ -0,0 +1,5 @@
[template.default]
sources = [
"//devtools/hackdoc/tpl/base.html",
"//cluster/doc/site.html",
]

View File

@ -1,4 +1,16 @@
hscloud/dc
==========
DC Docs Home
============
Software and systems related to DC operations and provisioning.
Software, systems and hardware related to DC operations and provisioning.
Software
--------
- [arista-proxy](arista-proxy/), a gRPC proxy to Arista's JSON-RPC.
- [cmc-proxy](cmc-proxy/), a gRPC proxy to the Dell M1000E Chassic Management Controller.
- [m6220-proxy](m6220-proxy/), a gRPC proxy to the Dell M6220 switch.
Hardware
--------
- [hbj11](hbj11/), a JBOD SATA passthrough card for Dell M610 servers.

View File

@ -5,40 +5,15 @@ Our Arista 7148S does not support gRPC/OpenConfig, so we have to make our own da
The schema is supposed to be 1:1 mapped to the JSON-RPC EAPI. This is just a dumb proxy.
Getting and Building
--------------------
Building
--------
go get -d -u code.hackerspace.pl/q3k/arista-proxy
go generate code.hackerspace.pl/q3k/arista-proxy/proto
go build code.hackerspace.pl/q3k/arista-proxy
Debug Status Page
-----------------
The `debug_address` flag controls spawning an HTTP server useful for debugging. You can use it to inspect gRPC request and view general status information of the proxy.
$ bazel build //dc/arista-proxy
Flags
-----
./arista-proxy -help
Usage of ./arista-proxy:
-alsologtostderr
log to standard error as well as files
-arista_api string
Arista remote endpoint (default "http://admin:password@1.2.3.4:80/command-api")
-debug_address string
Debug HTTP listen address, or empty to disable (default "127.0.0.1:42000")
-listen_address string
gRPC listen address (default "127.0.0.1:43001")
-log_backtrace_at value
when logging hits line file:N, emit a stack trace
-log_dir string
If non-empty, write log files in this directory
-logtostderr
log to standard error instead of files
-stderrthreshold value
logs at or above this threshold go to stderr
-v value
log level for V logs
-vmodule value
comma-separated list of pattern=N settings for file-filtered logging
For standard flags (eg. listen, logs, ...) run with -help.

12
dc/doc/site.html Normal file
View File

@ -0,0 +1,12 @@
{{ define "header" }}
<span class="red">hackdoc://dc</span>
<span>Hackerspace Datacenter Docs</span>
{{ end }}
{{ define "topbar" }}
<span><a href="/dc/">Home</a></span>
<span><a href="/dc/hbj11">HBJ11</a></span>
{{ end }}
{{ define "sidebar" }}
{{ end }}

5
dc/hackdoc.toml Normal file
View File

@ -0,0 +1,5 @@
[template.default]
sources = [
"//devtools/hackdoc/tpl/base.html",
"//dc/doc/site.html",
]

View File

@ -3,9 +3,358 @@
<head>
<meta charset="utf-8">
<title>hackdoc:{{ .Title }}</title>
{{ template "head" . }}
<style type="text/css">
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
body {
font-size: 14px;
line-height: 1.25em;
background-color: #f0f0f0;
}
html {
/* Cursed snippet to prevent entire page being shifted left when scrollbar
appears. */
overflow-x: hidden;
margin-right: calc(-1 * (100vw - 100%));
}
.wrapper {
display: flex;
flex-direction: row;
justify-content: center;
width: 100%;
font-family: 'Open Sans', sans-serif;
}
.column {
width: 80em;
padding: 1rem 0 1rem 0;
}
.page {
background-color: #fefefe;
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.content {
order: 1;
padding: 1rem 1rem 3rem 3rem;
width: 55em;
}
.sidebar {
order: 2;
width: 20em;
margin-left: 1em;
padding-top: 1rem;
padding-bottom: 3rem;
}
.sidebar ul {
padding: .5em;
border: 1px solid #ddd;
margin-top: 1em;
margin-right: 2em;
background-color: #f8f8f8;
font-size: 1em;
}
.header {
font-size: 1.2em;
font-family: Consolas, monospace;
margin-top: 1rem;
display: inline-flex;
background-color: #fefefe;
width: 100%;
}
.headerInner {
padding: 1em 1em 1em 3em;
}
.header a {
text-decoration: none;
}
.header a:hover {
text-decoration: underline;
}
.header span.red {
color: #b30014;
}
.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);
}
.topbar {
min-height: 1em;
padding: 1em 1em 1em 3.5em;
}
.topbar a {
text-decoration: none;
color: #333;
font-size: 1em;
}
.topbar a:hover {
text-decoration: underline;
}
.topbar span {
margin-right: 2em;
}
.footer {
font-size: 0.8em;
color: #ccc;
font-weight: 800;
padding: 0.5em 1em 1em;
text-align: right;
}
.footer .left {
float: left;
}
.footer .right {
float: right;
}
.footer a {
color: #bbb;
}
.page h1 {
font-size: 1.9em;
padding: 1em 0 0 0;
font-weight: 400;
color: #000;
}
.page p + h1 {
padding: 2em 0 0 0;
}
.page h2 {
font-size: 1.5em;
padding: 1.6em 0 0 0;
color: #000;
font-weight: 400;
}
.page h3 {
font-size: 1.4em;
padding: 0.4em 0 0 0;
color: #333;
}
.page h4 {
font-size: 1.0em;
color: #444;
}
.page strong {
font-weight: 600;
}
.page code {
font-family: Consolas, monospace;
background-color: #f8f8f8;
}
.page pre {
background-color: #f8f8f8;
border: 1px solid #d8d8d8;
margin: 2em 1em 2em 1em;
padding: 0.5em;
overflow: auto;
max-width: 60em;
}
.page h1 + p {
margin-top: 2em;
}
.page h2 + p {
margin-top: 1em;
}
.page h3 + p {
margin-top: 1em;
}
.page h4 + p {
margin-top: 1em;
}
.page p + p {
margin-top: 1em;
}
.page p {
line-height: 1.6em;
}
.page :not(li) > ul {
padding-top: 0.5em;
line-height: 1.5em;
}
.page ul li {
padding-left: 1em;
}
.page :not(li) > ul > li::before {
content: "•";
color: #333;;
display: inline-block;
width: 1em;
margin-left: -0.5em;
}
.page li > ul > li::before {
content: "◦";
color: #333;;
display: inline-block;
width: 1em;
margin-left: -0.5em;
}
.page img {
max-width: 50em;
margin: 1em 0 1em 0;
display: block;
}
.page table {
border: 1px solid #ddd;
width: 100%;
max-width: 100%;
margin-bottom: 20px;
margin-top: 20px;
}
.page table th {
border-bottom-width: 2px;
border: 1px solid #ddd;
border: 1px solid #e36372;
padding: 5px;
text-align: left;
vertical-align: bottom;
background-color: #e36372;
font-weight: 800;
color: #fff;
}
.page table td {
border: 1px solid #e36372;
padding: 5px;
vertical-align: top;
background-color: #ffdbdf;
}
.page table code {
font-family: Consolas, monospace;
background-color: #fcedef;
}
.toc {
padding: .5em;
border: 1px solid #ddd;
background-color: #f8f8f8;
margin: 2em;
max-width: 30em;
font-size: 1em;
}
.toc a {
text-decoration: none;
}
</style>
</head>
<body>
{{ template "body" . }}
<div class="wrapper">
<div class="column">
<div class="header">
<div class="headerInner">
{{ template "header" . }}
</div>
</div>
<div class="topbar">
{{ template "topbar" . }}
</div>
<div class="page">
<div class="sidebar">
<h3>Page Info</h3>
<ul>
{{ range .WebLinks }}
<li><a href="{{.LinkURL}}">View {{.Kind}} ({{ .LinkLabel }})</a></li>
{{ end }}
<li><a href="{{ .HackdocURL }}/devtools/hackdoc">Generated by hackdoc</a></li>
</ul>
</div>
{{ .Rendered }}
</div>
</div>
</div>
</body>
</html>

View File

@ -1,280 +1,14 @@
{{ define "head" }}
<style type="text/css">
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
body {
font-size: 14px;
line-height: 1.25em;
background-color: #f0f0f0;
}
.wrapper {
display: flex;
flex-direction: row;
justify-content: center;
width: 100%;
}
.column {
width: 80em;
padding: 1rem 0 1rem 0;
}
.page {
background-color: #fefefe;
padding: 0.5rem 2rem 3rem 2rem;
}
.header {
font-size: 1.2em;
font-family: Consolas, monospace;
margin-top: 1rem;
padding: 0.5em 0 0.5em 0;
display: inline-flex;
}
.header a {
text-decoration: none;
}
.header a:hover {
text-decoration: underline;
}
.header span.red {
color: #b30014;
}
.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 {
font-size: 0.8em;
color: #ccc;
font-weight: 800;
font-family: helvetica, arial, sans-serif;
padding: 0.5em 1em 1em;
text-align: right;
}
.footer .left {
float: left;
}
.footer .right {
float: right;
}
.footer a {
color: #bbb;
}
h1,h2,h3,h4 {
font-family: helvetica, arial, sans-serif;
}
.content h1 {
font-size: 1.6em;
padding: 1em 0 0 0;
font-weight: 800;
}
.content h2 {
font-size: 1.3em;
padding: 0.8em 0 0 0;
color: #333;
font-weight: 800;
}
.content h3 {
font-size: 1.2em;
padding: 0.4em 0 0 0;
color: #444;
}
.content h4 {
font-size: 1.0em;
color: #555;
}
.content strong {
font-weight: 600;
}
.content code {
font-family: Consolas, monospace;
background-color: #f8f8f8;
}
.content pre {
background-color: #f8f8f8;
border: 1px solid #d8d8d8;
margin: 1em;
padding: 0.5em;
overflow: auto;
}
.content p {
margin-top: 0.8em;
line-height: 1.5em;
}
.content :not(li) > ul {
padding-top: 0.5em;
line-height: 1.5em;
}
.content ul li {
padding-left: 1em;
}
.content :not(li) > ul > li::before {
content: "•";
color: #333;;
display: inline-block;
width: 1em;
margin-left: -0.5em;
}
.content li > ul > li::before {
content: "◦";
color: #333;;
display: inline-block;
width: 1em;
margin-left: -0.5em;
}
.content img {
max-width: 90%;
margin: 1em auto 1em auto;
display: block;
}
.content table {
border: 1px solid #ddd;
width: 100%;
max-width: 100%;
margin-bottom: 20px;
margin-top: 20px;
}
.content table th {
border-bottom-width: 2px;
border: 1px solid #ddd;
border: 1px solid #e36372;
padding: 5px;
text-align: left;
vertical-align: bottom;
background-color: #e36372;
font-weight: 800;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #fff;
}
.content table td {
border: 1px solid #e36372;
padding: 5px;
vertical-align: top;
background-color: #ffdbdf;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.content table code {
font-family: Consolas, monospace;
background-color: #fcedef;
}
.toc {
padding: .5em;
border: 1px solid #ddd;
background-color: #f8f8f8;
margin: 2em;
max-width: 30%;
font-size: 1em;
font-family: sans-serif;
}
.toc a {
text-decoration: none;
}
</style>
{{ define "header" }}
<span class="red">hackdoc://</span>
<span>HSCloud Docs</span>
{{ end }}
{{ define "body" }}
<div class="wrapper">
<div class="column">
<div class="page">
<div class="header">
<span class="red">hackdoc:</span>
{{ range .PathParts }}
{{ if ne .Path "" }}
<span class="part"><a href="{{ .Path }}">{{ .Label }}</a></span>
{{ else }}
<span class="part">{{ .Label }}</span>
{{ end }}
{{ end }}
<span class="red" style="margin-left: 1em;">shortcuts:</span> <a href="/">root</a>, <a href="/cluster/doc">cluster docs</a>, <a href="/doc/codelabs">codelabs</a>
</div>
{{ .Rendered }}
</div>
<div class="footer">
<div class="left">
View in:
{{ range .WebLinks }}
<span class="muted">[{{ .Kind }} <a href="{{ .LinkURL }}">{{ .LinkLabel }}</a>]</span>
{{ end }}
</div>
<div class="right">Generated by <a href="{{ .HackdocURL }}/devtools/hackdoc">hackdoc</a>.</div>
</div>
</div>
</div>
{{ define "topbar" }}
<span><a href="/">Home</a></span>
<span><a href="/cluster/">Cluster</a></span>
<span><a href="/dc/">DC</a></span>
<span><a href="/doc/codelabs">Codelabs</a></span>
{{ end }}
{{ define "sidebar" }}
{{ end }}