forked from hswaw/hscloud
parent
c0d9ea081f
commit
3ba5c1b591
|
@ -0,0 +1,7 @@
|
|||
Cluster Docs Home
|
||||
=================
|
||||
|
||||
Documentation relating to our Kubernetes cluster(s).
|
||||
|
||||
For information about the physical DC infrastructure, see [//dc](/dc/).
|
||||
|
|
@ -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)
|
||||
-------------------------
|
||||
|
||||
|
|
|
@ -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 }}
|
|
@ -1,5 +1,5 @@
|
|||
Warsaw Hackerspace Kubernetes Clusters
|
||||
======================================
|
||||
Cluster User Docs
|
||||
=================
|
||||
|
||||
End-user^Whacker documentation.
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
[template.default]
|
||||
sources = [
|
||||
"//devtools/hackdoc/tpl/base.html",
|
||||
"//cluster/doc/site.html",
|
||||
]
|
18
dc/README.md
18
dc/README.md
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 }}
|
|
@ -0,0 +1,5 @@
|
|||
[template.default]
|
||||
sources = [
|
||||
"//devtools/hackdoc/tpl/base.html",
|
||||
"//dc/doc/site.html",
|
||||
]
|
|
@ -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>
|
||||
|
|
|
@ -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 }}
|
||||
|
|
Loading…
Reference in New Issue