From 908e0a0d6f930b837464b1bed1f150e1ccc8af20 Mon Sep 17 00:00:00 2001 From: Mario Valderrama Date: Thu, 23 May 2024 14:52:41 +0200 Subject: [PATCH] Update docs --- .gitignore | 6 + CODEOWNERS | 1 + CONTRIBUTING.md | 155 +++++++++++++++++++++ README.md | 34 ++++- docs/assets/images/LOGO_IONOS_Blue_RGB.png | Bin 0 -> 13385 bytes 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 CODEOWNERS create mode 100644 CONTRIBUTING.md create mode 100644 docs/assets/images/LOGO_IONOS_Blue_RGB.png diff --git a/.gitignore b/.gitignore index 3b735ec..f665005 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,9 @@ # Go workspace file go.work + +# Ignore local kubeconfig files +*kubeconfig* + +# Ignore direnv files +.envrc diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..1a143b6 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @avorima @gfariasalves-ionos diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..49c4fe8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,155 @@ +# Contributing to the IONOS Cloud block storage CSI driver + +First off, thanks for taking the time to contribute! ❤️ + +All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways +to help and details about how this project handles them. Please make sure to read the relevant section before making +your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The +community looks forward to your contributions. 🎉 + +> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support +> the project and show your appreciation, which we would also be very happy about: +> - Star the project +> - Tweet about it +> - Refer this project in your project's readme +> - Mention the project at local meetups and tell your friends/colleagues + +## Table of Contents + +- [I Have a Question](#i-have-a-question) + - [I Want To Contribute](#i-want-to-contribute) + - [Reporting Bugs](#reporting-bugs) + - [Suggesting Enhancements](#suggesting-enhancements) + - [Your First Code Contribution](#your-first-code-contribution) + - [Improving The Documentation](#improving-the-documentation) +- [Styleguides](#styleguides) + - [Commit Messages](#commit-messages) +- [Join The Project Team](#join-the-project-team) + + + +## I Have a Question + +> If you want to ask a question, we assume that you have read the available +> [Documentation](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/blob/main/README.md). + +Before you ask a question, it is best to search for existing +[Issues](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues) that might help you. In case you have +found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to +search the internet for answers first. + +If you then still feel the need to ask a question and need clarification, we recommend the following: + +- Open an [Issue](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues/new). +- Provide as much context as you can about what you're running into. +- Provide project and platform versions (Kubernetes cluster version, CSI version, etc), depending on what seems + relevant. + +We will then take care of the issue as soon as possible. + +## I Want To Contribute + +### Legal Notice +When contributing to this project, you must agree that you have authored 100% of the content, that you have the +necessary rights to the content and that the content you contribute may be provided under the project licence. + +### Reporting Bugs + +#### Before Submitting a Bug Report + +A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to +investigate carefully, collect information and describe the issue in detail in your report. Please complete the +following steps in advance to help us fix any potential bug as fast as possible. + +- Make sure that you are using the latest version. +- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment + components/versions (Make sure that you have read the + [documentation](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/blob/main/README.md). + If you are looking for support, you might want to check [this section](#i-have-a-question)). +- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there + is not already a bug report existing for your bug or error in the + [bug tracker](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues?q=label%3Abug). +- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. +- Collect information about the bug: + - Stack trace (Traceback) + - OS, Platform and Version (Linux) + - Version of your Kubernetes cluster, CSI driver and CSI sidecars. + - Possibly your input and the output + - Can you reliably reproduce the issue? And can you also reproduce it with older versions? + +#### How Do I Submit a Good Bug Report? + +We use GitHub issues to track bugs and errors. If you run into an issue with the project: + +- Open an [Issue](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues/new). (Since we can't be sure + at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) +- Explain the behavior you would expect and the actual behavior. +- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to + recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem + and create a reduced test case. +- Provide the information you collected in the previous section. + +Once it's filed: + +- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no + obvious way to reproduce the issue, the team will ask you for those steps. +- If the team is able to reproduce the issue, it will be left to be + [implemented by someone](#your-first-code-contribution). + +### Suggesting Enhancements + +This section guides you through submitting an enhancement suggestion for IONOS Cloud block storage CSI driver, +**including completely new features and minor improvements to existing functionality**. Following these guidelines will +help maintainers and the community to understand your suggestion and find related suggestions. + +#### Before Submitting an Enhancement + +- Make sure that you are using the latest version. +- Read the [documentation](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/blob/main/README.md) + carefully and find out if the functionality is already covered, maybe by an individual configuration. +- Perform a [search](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues) to see if the enhancement + has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. +- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to + convince the project's developers of the merits of this feature. Keep in mind that we want features that will be + useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, + consider writing an add-on/plugin library. + +#### How Do I Submit a Good Enhancement Suggestion? + +Enhancement suggestions are tracked as +[GitHub issues](https://github.com/ionos-cloud/ionoscloud-blockstorage-csi-driver/issues). + +- Use a **clear and descriptive title** for the issue to identify the suggestion. +- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. +- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point + you can also tell which alternatives do not work for you. +- **Explain why this enhancement would be useful** to most IONOS Cloud block storage CSI driver users. You may also want + to point out the other projects that solved it better and which could serve as inspiration. + +### Your First Code Contribution + + + +### Improving The Documentation + +This project uses [helm-docs](https://github.com/norwoodj/helm-docs) to generate helm chart documentation from a template. +Make sure to re-generate the docs after you've updated the +[template](./charts/ionoscloud-blockstorage-csi-driver/README.gotmpl), +[values](./charts/ionoscloud-blockstorage-csi-driver/values) or +[Chart.yaml](./charts/ionoscloud-blockstorage-csi-driver/Chart.yaml). + +It is recommended that you install a +[pre-commit hook](https://github.com/norwoodj/helm-docs/blob/master/README.md#pre-commit-hook) to automate this. + +## Styleguides + +### Pull requests + +Pull request title and description will be used as squash commit message after the merge. +Ensure that they follow the [convention commit](https://www.conventionalcommits.org/en/v1.0.0/) specification. + +The pull request title will correspond to the first line in the commit message, with the description populating the +rest. + +## Attribution +This guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)! diff --git a/README.md b/README.md index 28caf10..eb9a181 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,35 @@ # ionoscloud-blockstorage-csi-driver -Container Storage Interface (CSI) plugin for IONOS Cloud block storage +

+ + +

+ +Container Storage Interface (CSI) plugin for IONOS Cloud [block storage][1]. + +## Features + +* **Static Provisioning**: Associate an externally-created volume with a [Persistent Volume][2] (PV) for consumption + within Kubernetes. +* **Dynamic Provisioning**: Automatically create volumes and associated [Persistent Volumes][2] from + [PersistentVolumeClaims][3] (PVC). Parameters can be passed in via a [StorageClass][4] for fine-grained control over + volume creation. +* **Volume Resizing**: Expand a volume without downtime by specifying a new size in the [PersistentVolumeClaims][5]. +* **Volume Snapshots**: Create and restore [snapshots][6] taken from a volume in Kubernetes. + +Configurable storage class parameters: + +* `type`: Available type names are `HDD`, `SSD`, `SSD Standard` or `SSD Premium`. `SSD` is an alias for `SSD Standard`. +* `availabilityZone`: Defaults to `AUTO` if not set. +* `fstype`: Currently only `ext2`, `ext3` and `ext4` (default) are supported. + +## Contributing + +See [CONTRIBUTING.md] for more information. + +[1]: https://cloud.ionos.com/storage/block-storage +[2]: https://kubernetes.io/docs/concepts/storage/persistent-volumes +[3]: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic +[4]: https://kubernetes.io/docs/concepts/storage/storage-classes/#the-storageclass-resource +[5]: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims +[6]: https://kubernetes.io/docs/concepts/storage/volume-snapshots diff --git a/docs/assets/images/LOGO_IONOS_Blue_RGB.png b/docs/assets/images/LOGO_IONOS_Blue_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfae8890378fdeebd87a1d2e81a9da1b73cbf60 GIT binary patch literal 13385 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

4!r{yGsesW4 zVvD{oAo^&6p9G)dzk$BBx=-8OsI{jC1M@%0HG>ni<=R=_+*HlV5C^%K=GU3$8Czwnz%WG$1MH{-jjc(Hk=@15D~L4 z0}NiK{Wm{n*=BsMw=#)!#2mE<(jhrUU_CVdaGvcq#n!1+j}rnt9mst;4gdQ_A{@z( z;8^%(iWr#MZd67}|B&lqh>YUjR&g%0i_auM8NGcDCz6u|`_y$PR&LmXD3%S9t=0rr zVBU$Qz%YP22~5{mDGWIKL0}~guriY$xVof7BxebhosAp*JLueuhu@|Q9JER>+c5M} z#RUQ=>@WAPyr=ImpS*YpZo~vwNE5his%$#F6b{5$xd-GaiFr=&s%k)=t`k4UFeBpZ zAQlI+fp+4ggb{(weiHh6w=i_YIU#-fD{NZd`6CtwMJ+?o5WkD2Jw%(YYTP4OV3$x( zFj#u|Dh|4x$hrYUFGN7EBv9fpG`0DZ2yo7%iTNG;h4p|Rl-hE5K+%S}OMn&(piB;+ zY~>XW`fTPr7eKZeY$~f&uxB`PnhQ34{kB|k0dFTEJN@GTM6mc!E1PC~4FHo!HfTLG zR|ty!!p;$?+WqWMltfe^$?^$n2)@ZhG6^DLL#J_iXP9dTbtm)U(^p{vZmocNkQG3h z8sOZSR|m%{Vw0YqKxBiQAQLtlo)f%CK9K0mw?GOK!&ZxSpl{^!`@$H^@cU%;UqyPs zQT*m)*6*EW;DJ@2b#`>tkXZtPKFLmvr%XE7*<}*Axb6sA!B^CP&^8|ryHOBQUuiBH zo)7x;1R~lz)n9=Ku?b+%-Wns4=3`I~;s#`2wO+BXjS8Z4!&+n)chW={(yCWfZ31bT zKS;?=5?B%@=1VCEr#<^Fh|Ju40Tc|0a}Gmmaf!=l%}oGUAYMn~pt3G|QGmQ&p>b`e z2~(y=BD;1^ZUR^k6H;`7uq96`0GT>Bj75;glNW?f9(I0LWr0J2#NE&q*TyFyU9qHsFgS8|bb>Gwgdh61qIxxj{4pT}Jdfs1^Ks86H~`Y`g1a<;TM3;^c+KVPvd{yhB`&-WFNoypbSyK5;Bt9zVjVowaH z%7BQnJ+-4j){+g9FMuVH2ZW@-Q^SsmC-(OR6_9H3ZPR+i=JowNzhqg0r&ERlf%gls z5RQun{t<+g5s)(Om^*hU@^}}x6Sg!1nb|PG#z33CUUBA{|T}TobjK@`;`dl1G2go=(Q+34C*mr@H?ahAWWnb=$7(lWc;!t^)}E z2-2+f7o#%aAi;p#9~S(+woNQo-a2~vwazq*3JBa{YFvi^&>L^$BTERrQ3ptv1`Z0u zz{39luqYa!Y&~U5{?vtFqW!|a@~l3Vuw{ezBi98*sn_x&v$l3l0D73-58iLH1dM@e z2*o#UXcwwrVmT86)fsN+=Rm~4YCy?1K~c%EM$l&3#C>+=9FkeQ)5jj$vh5qgV9k5Q z=WFenERgst1o3YPrnOzBjg!|d14-B{P!+7E1Y0n527h*$(KkwzJ<Gz<~p|M*WxKWx9_Mm!rQm|J_&N&_b!@ZBoo2hO7GDGTC z)&{)~Vr=CXs3v%mvtNkn7}iwbJWE^KZymPE7lPFDt$VZHH&G1P$7y!|3Q8a5;yP9u zSD&jRznbP~7JK#wGc{IVO{iAwvpQ8mOUIPg`sbxTz%7AFW;M*0NWm;mR@rB$5Ou5~ zS-vz`bs<6HH=~&hoz<*j0NuKDmHh4pf3){b?jKXo0^PX6A_T^SB$2BryoUXf;0Ap? z;r2&C%^B>~4LRz%t4=2er?#N5&3Iq1@BRz3WK3vieYoW-mO|=flTeXvIE>-DDv3=$Bu zuCwedyG0cDMu}t|E-5pf(p$J6(KWrDH)tOs-&(aIXR{14dqwKpx%sY-4 z)I|s@%PcrfHC?jUo)omc75j&&v*^qCNFk+lLSHN+RJAN4+LKRZYsJ2%WH}uAH-8^< zoH}KC$2KH8-Bc9xe-<1Gp~%|pCDMsDmA2-&F4K19zOVc<`v@EDJ{@B8+pM12L;Fp+ zMC+@dO<753Q>wCOCH^=A-Jz5Jncui37ST#QaW(TTEBf}Od<&JHTJu%o<&DpE6^5oK zpv$O~h|Sij7V=>x4VXAlp&j_Jv=i_zKWQE<0S!HB+9=r)Smdqb)d8gr+An0bxrN8*ZhERStm%dx#N#F3=2{rVbXUJuQz%K= z)Gb-`)%8nNtZ5yOB6Ocs^R=qW1?l#-qJ7)nbUOTvu-o=Y)y{qK;=icGd{fS`F!0)g zY!s@K`7E=WZe=+RbV`Ll!(B0D{P^Asbr-2b--)Q#r3Xpnd(IoTQKC-i0j$C4AB$nt zQsiAHy~Af5$*Xeqx-TuBZlW{|dgjZt=IPaj3I!g9q@pp*d@tD+3K*C_g&2jwLAEnK z@yp0L><(yqv-9{~ZBqTT)Ey}w?KX-T`JzSPz0{zl*E26J3^c?u#raBhVlGAe-M}EU z&d>NK6q9Efy4dMpoYJLI8gw;si*1Z*)^O?In6pnBTqjv7lBr$;cYbdj^?p~6Q<;+R z1qmxvTu&D>yG+#su>JBI!&I9 z=iouZ>WqCZm)UZ-AZ4^h)}y4Iv-WsTbwsWU{H&{@qUh%ac(}Zztb>LLRhCV4hdV@5K30D;G>>Xbi z`eTUV-q6e2$=QaYT7M;`v@OghBiY_X88k0T%GRd2LwT&#^v zh5ZEr_*53<6tF{?)HsLIW9(tE{?-|A*Oojq-02ahtKd%YRrGDI@8QYf5(PTNCD(QI^hpE0H+r8EFeSB%WsP6+ln8P&3swqD8S;0rlHT8;3cVej_PvQx$*G+qPDOZcO~o< zRO+KN`vthM98_<9)_H%?60MLOA?0I1312lIzRj|64qWPiOeUAk{C{7a@)+rxfI^2m z@zTIecx~-3`fXQ7SH#4jO~1S^f|bd3=>|qttc(P(=kI5@RMKqSx0$cBhtO)WGpdOs zZ#v>PfD^{Xjn>gTnnrwl5|DJOG)9|tHN%ZUEeU($x4oya1+{b<9saYu#k1FtidABvS-${$NyclWo+mAb72=DC<& zxlvHwONscJ#Pr{)bcTcE-SPGC|8U70qf{=SfnIg}=4B1b}3Q(q^(!1AGp<`aIO(rKPdX69(T23ZqP53vFTES`fBh5!6p1~`aCZ=<5e%Lj+9vt?u3nI!q5 z{l~lmeVdtTw2h$bk3-!#cdQhSscK}h=H0bDtu41^x9KZK4NUg*Os9@_wT!@!bduMt zt*ZuzQ-|XEnDqavK0dd;QL6|e_i7@nkqDgj{h>QbWw;(*zM8l?SC|k`cqRA!8c4by z(p|@_*!l?tp3liCYmhp!w_A1{iD6c2 zc4sO#k*V7>e>bG2^=rfgtd+b_iLP|x=F$ejH~b{!qVg zV_+VtO#AX-OKJ~cTCa{Lz5!;b@OB8b`pI5X6Di{L@87ehUojUrCiPEsqliqn$D3!F zDFFRe56TV|4i3{}w^T*0WGgKOW~qsot5mOZOhbv+D(vV74g!mNCcA3}z^!mtRP82A z<-;?vAk8L9PafO)P9#xf7)U3rF13}wd~YRN=?<&n$w;NQwkiealaN zz(1~}z+%DA&GYeJ;R1L6-gB9?|N40jK>p-s{Wt8{rxcP+70lwf*Cw-8_@c~Bqs80n z;XlZOd@5oH2m67(!CZIijQhNozie=bQt5KDT@Mcb(FWvit~W03?Ju>5RnU0QJZns= zYj$s8?>n(~zA>>29ys)`lF{yBgU^NqflYbh^AaRlN zV8o#X#4nd%jO4DEZSH1m;Z6Bjb~CM)|D7~gJXhqEr_h8~yn63Cte*`Y+3?2DnHYeF z7`0~q4bbrY2`(Qb5P1t}-*0N_E6)sC2R?6#jcV6Us2xYClthYp0}5v}3!!QV5;Xt! z*N#MH7!Dyk=TOFG!hj+wH5Q;HwQvT39c019yDtZCPUF1K8{~r5qGr=xr9^= zv>bz%J?dCQ{3NrAYA?QGB_9!Lqqw-Pd{?t@S|rD4ifz$LT~BB_EUqVzMR{EVi^$M5 zJ&l{&t!Q2VZ)VhL&ra8MncrHLf1p_g;y^F@9YxVT)0^w+l_E8!qVN)q8JQ<^Sj^`e z5uuA9Cr1TN-vV!o{38c%@V*C_At=El&gq_vaa*?8E@FL;Im_F;d>h=)>Zw2{{<3;=x2fCa@?9OrsXIJRg^>DL5ZQ;>p*0zd^p1aJ@W*jq4QlGH zYI;z{@ZA>a&iNIgM_c&5Z%8obsVYzh9Iv1diY~!X*Ik=+I#x~*MsI~G%jIY@l6L#( z`JL5OpZqEll&4ud-z%jprCbjuoMa;CB;IS{UW(vUmq+QhJ6l1JOULhR&1>6kizw%h zyImSN$9P+8P|;q#qihA5?Ne{_eA&+jq)lkB#rT(LWD}(nTnf&)6 z@jNo@-Ff5grm3C#LVUDdub^C27;MAUYN_X&)uL>!A~|8jKCTb@qH>y54Rbo}19~=Y zOne>hSzyi`I;>I1W7=BTc{URmn~1Qnvl%U&-a$5|G50bhGzha6!y>;2UJ23`j!wE# zV1tdig6?RxeEtZ17$vLsqJb@i!^oN{;V1Tvmh1NP(#5ya)9)pCqQS5=w*mfuUO!8~ zo)t34H^*YKSs%M_ENSC>DQf%{-)8}Q0`ZzT% z#)nnYY=7NSqTb2*kuiF!|9eNt9+V&8|9q6nzwW^&Uf#K^ja84i4eY5iFP)=)xuEN| z`K;0V!l!eq?gpl$TY|>mY+IBx_(H;4K&61`tzIWw)Zyg)QAQ^+Jn< zW}A<5n4B*T&UI}VYsBq?FS4gAvKNhe!r&$L4AQ-!-mtduAfck;A^5#HcW*FOV_!g1ihp=Itb&OWv9@_`_O(_6>E?QwbohVpCZ>2m_ple!bqFJKNs+pgR5Ud6^&{N(L^`iPPHlIuqo_wR_8#>4_;MxH5d=7eh4}d}v?Vl00VualIuwLd@%uq^__Oc>QNVev3_iOZ>== z_j|IT9-qK!mq`^;YB*}2qTqhFTSyw9KnGnUN(|s*HUTu z)%m2X5vjc=euP8h9$|}GX7?h@f9}J7LSgkI4ec>M7ExFf#|yXbQN*DXA)OyOA4CPs zk66xEIP3i6TN)K!4__*RshQ8#sjrhpUehI;$(rCg`Y6*S{_@?A41WXO@27#g*vXL! zmVL3O?tpS$A-AcfTW*|oEh6>^7!3dSsc$od@R)i=npqMrOWpwpo|W zoZER{%IB)KFjy`MRATAs$Z17nZnEn1$!)G>U@Nl)QmPlETgFo6e8^3L}LAjY;V~1YMNYAQm~0 zRRO#07e6mq)pEWwuW#BZFB3AbTw}9wVH49DZ;asfs&o@G;a|9(C270Y>*ann4>WU= qHX|->?6&uS{L0U}_nz!s5M4&z?2_0TQ6~K7pvOv@iWLf0q5lsS$%1eI literal 0 HcmV?d00001