<div dir="ltr">Hi,<div><br></div><div>TL;DR</div><div>I am pretty new to Haskell and have some Haskell code I'd love to get feedback on. (<a href="https://github.com/SAP/bosh-cpi-haskell/tree/a586079dd9383fca030f1536116522874a086a0f">https://github.com/SAP/bosh-cpi-haskell/tree/a586079dd9383fca030f1536116522874a086a0f</a> and <a href="https://github.com/SAP/bosh-kubernetes-cpi-release/tree/master/src/bosh-kubernetes-cpi">https://github.com/SAP/bosh-kubernetes-cpi-release/tree/master/src/bosh-kubernetes-cpi</a> )</div><div><br></div><div>Longer version:</div><div>I started looking into Haskell back in November last year. Pretty soon I wanted to try something more "real-world" IO heavy in order to see how that goes.</div><div>I came up with a side-project at work to implement a Bosh Kubernetes CPI. Bosh (<a href="http://bosh.io">bosh.io</a>) is a tool to install and manage distributed systems on a range of IaaSs. In particular it is used to install Cloud Foundry (a cloud application development platform). I guess I don't have to introduce Kubernetes.<br></div><div><br></div><div>The interface between Bosh and its cloud provider interfaces (CPI) is a simple command line application. Bosh provides configuration via file provided as process call argument. It provides the method to be invoked including arguments as JSON via stdin and expects a response via stdout. The CPI can provide a log via stderr. (<a href="http://bosh.io/docs/cpi-api-v1.html">http://bosh.io/docs/cpi-api-v1.html</a>)</div><div><br></div><div>The interface to Kubernetes is basically a REST api, i.e. http calls. Currently I use a generated client based on Servant (<a href="https://github.com/soundcloud/haskell-kubernetes">https://github.com/soundcloud/haskell-kubernetes</a>)</div><div><br></div><div>I have put that interface into its own package. </div><div>I created two typeclasses FileSystem[1] and System[2] to abstract away the system (I guess I should call them MonadFileSystem and MonadSystem to align with how mtl calls the monadic classes). And I created another typeclass MonadCpi[3] to abstract away the concrete implementation towards potentially several infrastructures.</div><div><br></div><div>The Kubernetes implementation[4] is rather hacked (no tests, low testability, etc.) and I'd like to change that. I thought about a typeclass for REST resources (with methods create, get, list, update, delete, ...) and I begin to have problems integrating that into my current primitives (e.g. I'd like to have a MonadLog instance that uses my System typeclass for printing to stderr). That's when I started to ask myself if I had chosen the right Haskell tools and primitives for what I was doing and thought it was time to get some feedback from more experienced Haskellers aka you.</div><div><br></div><div>I know this was a pretty long text. Sorry for that. Any feedback, including "you did it completely wrong" is appreciated - as long as it includes "have a look here and here", "look this is what I would do", or similar.</div><div><br></div><div>Many thanks already for reading.</div><div><br></div><div>Best</div><div>Jan</div><div><br></div><div>[1] <a href="https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base/System.hs#L29">https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base/System.hs#L29-L30</a></div><div>[2] <a href="https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base/System.hs#L32-L36">https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base/System.hs#L32-L36</a></div><div>[3] <a href="https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base.hs#L126-L138">https://github.com/SAP/bosh-cpi-haskell/blob/a586079dd9383fca030f1536116522874a086a0f/src/CPI/Base.hs#L126-L138</a> </div><div>[4] <a href="https://github.com/SAP/bosh-kubernetes-cpi-release/blob/master/src/bosh-kubernetes-cpi/src/CPI/Kubernetes.hs#L65-L296">https://github.com/SAP/bosh-kubernetes-cpi-release/blob/master/src/bosh-kubernetes-cpi/src/CPI/Kubernetes.hs#L65-L296</a> </div></div>