Storage Developer Conference - #126: Introducing the SNIA Swordfish™ PowerShell Tool Kit and Windows Admin Center Integration

Episode Date: June 2, 2020

...

Transcript
Discussion (0)
Starting point is 00:00:00 Hello, everybody. Mark Carlson here, SNEA Technical Council Co-Chair. Welcome to the SDC Podcast. Every week, the SDC Podcast presents important technical topics to the storage developer community. Each episode is hand-selected by the SNEA Technical Council from the presentations at our annual Storage Developer Conference. The link to the slides is available in the show notes at snea.org slash podcasts. You are listening to STC Podcast, episode 126. Okay, welcome to Storage Developer Con 2019. Are we all excited to be here? Yay! Okay, welcome to Storage Developer Con 2019. Are we all excited to be here? Yay!
Starting point is 00:00:48 Okay, so I'm going to be co-presenting here today with Barks, who's sitting in the front row here with his hand up. And we're going to be talking to you about Windows PowerShell and specifically how that could be used to expose Swordfish functionality as well as the underpinning for writing a Windows Admin Center module so that you can actually control storage directly from a Windows machine. So you can either do it from PowerShell
Starting point is 00:01:12 or you can do it from WAC. That's the eventual goal here. Let's go ahead and jump right into it. We all know what Swordfish is, basically, right? We've done a whole day worth of sessions on Swordfish so far. And everything you learned about Python, just forget. Okay, so we're going to go over the PowerShell toolkit, and we're also going to go over some
Starting point is 00:01:30 of the integration points with Windows Admin Center. And we're also going to show you how to build the rough steps to build a Windows Admin Center gateway. Let's go ahead and jump in and give you an idea of what I'm going to talk to you about first. Because Barclay is going to come up in a few minutes and talk specifically about the Windows Admin Center integration, whereas I'm going to talk about everything leading up to that. So I'm going to talk about the PowerShell toolkit and how you can use the
Starting point is 00:01:53 PowerShell toolkit to map your Swordfish devices, your, or I'm sorry, your storage devices to the Swordfish model. So if you have a REST API that you currently use for your storage, and most of us have it. I mean, you're with Pure Storage, I'm with Nimble,
Starting point is 00:02:09 we also have 3PAR, we have NetApp in the room, we've got all these different vendors, and we all have PowerShell toolkits to help our customers manage their own storage. All of these PowerShell toolkits depend on the REST API that those vendors supply. So with this, we're actually going to show you how you can take either the PowerShell toolkits depend on the REST API that those vendors supply. So with this, we're actually going to show you how you can take either the PowerShell toolkit or directly from the REST
Starting point is 00:02:28 API and feed it right into Swordfish. And that's how the mapping is going to work. Then we're also going to talk about the provider framework. And what this is, is it's great that I can use a PowerShell toolkit to consume Swordfish resources. It's great that I can map my REST API to Swordfish to see how it looks. But more importantly, I actually want to be able to provide Swordfish to my customers. I actually want this to be on the server side instead of just the client side. And we're also going to show you how the emulators work and how the mock-up website works. So today, we ship a Python-based emulator that anyone can download from GitHub to become a Swordfish target. Anyone also can download, go to the mockup site, and that pretends to
Starting point is 00:03:11 be a Swordfish target. So here's our two targets. This is the third target we're going to introduce today, and this is the bridge between the two. And I'm going to show you what that looks like here. So what we've got is, if you're a storage vendor, your storage device lives here. But more importantly, your storage device needs to have its own custom Swordfish emulator. What I'm gonna show you here is how we can use your storage device, and you can use the Swordfish PowerShell toolkit
Starting point is 00:03:39 to actually query that information. And more importantly, the WAC extension, which is gonna live off of the Swordfish PowerShell toolkit. This is a Swordfish consumer. This is a Swordfish provider. But more importantly, we also provide this provider, which is the mockups.com site, and we also provide the Swordfish simulator that's out there right now. What we're introducing in this session is the PowerShell toolkit and we're introducing a Swordfish provider
Starting point is 00:04:12 that lets you put your storage device here instead. And we're doing a REST API Swordfish mapping example that shows you how you can take your storage, map it to Swordfish, and then expose it via the provider. So you can write your own custom provider, or you can use our shell of a provider to do it. So again, if you're very familiar with Python, you could actually start with the simulator or emulator as it is now that's written in Python. You could actually modify the API code there and actually add your device in and go directly from your storage to the
Starting point is 00:04:48 simulator, or you could write your own custom provider, or you could use our PowerShell provider and actually modify that as well. I'm going to show you exactly what that looks like. It'll all make sense in a moment. So the toolkit, let's start with the client. Swordfish doesn't mean anything unless somebody can actually query the information from a storage array. For instance, if I've got a storage array out there, I want to know how many drives it has.
Starting point is 00:05:09 I want to know what chassis it's living in. I want to know how many volumes it's got, how many initiator groups it has. I want to know all the replica information. To do that, we've actually started up an open source project here that will run in a Windows environment or Linux environment using PowerShell, and it will actually
Starting point is 00:05:28 query and make REST API calls directly against a Swordfish-enabled target. So if you've got a device at Swordfish today, we can query it using PowerShell. And we could run very, very simple commands, such as you import the module, and then you say connect swordfish target down here. You give it a target name in the port. By default, if you leave these alone,
Starting point is 00:05:50 it goes local host and it goes port 5000. But if you, if you want to, you can point this to any swordfish target in the world. Whether it's a simulator, whether it's an emulator, whether it's swordfish mockups, it doesn't matter what, what it is. If you've got a swordfish target, this will talk to it once you do that and you actually connect to the array it will return back the base object of that device so you're turning back the the root structure of redfish slash v1 and in fact you'll notice that we're returning the actual object and these right here are all the json items that you'd expect to find I'm going to show you what that looks like in JSON code. This, by the way, is what it looks like when you're connecting to the Swordfish target.
Starting point is 00:06:30 I also wrote a command to connect to the Swordfish mockup website. Treats it exactly the same because the Swordfish mockup site and an actual Swordfish target look the same. So this different connection type lets you test without even having to run an emulator locally. Normally, if you want to run PowerShell toolkit to connect to Swordfish, you need a Swordfish target. But this lets you connect right to the website and set up absolutely zero infrastructure to start working on this thing.
Starting point is 00:06:57 So you can actually start consuming Swordfish resources immediately. Now, with that said, everything's returned as objects, nested objects. And you very easily cast them to variables. So if I do a get volumes, get swordfish volumes, it's going to give me back a list of all my volumes. And if I throw that into a
Starting point is 00:07:16 variable, I can walk through those and say, okay, just give me volume four, or give me a list of my volumes where the pipeline object dot name equals volume five. So I can look for individual volumes. I can also use more complex code. I can say give me all the volumes where the volumes are
Starting point is 00:07:35 bigger than one gigabyte. Or give me all volumes where volumes, uh, uh, provisioning policy is equal to thin. So you can do all kinds of filters and piping through the native PowerShell directly with this command. You can even cast this variable and say, I want that variable, when it comes back with an object, I want to be able to push that back to JSON to see what the raw JSON code looks like. So that's what this looks like. If I do a get volumes, and I only want volume four, I can convert that volume right back to JSON, and
Starting point is 00:08:06 boom, that's what the JSON looks like for the raw device. So not only can I pull a swordfish target and pull an individual volume and do all kinds of work on it, but after that I can put it right back into JSON to be able to look at it as I would if I was expecting to read JSON raw so again this is the raw JSON and again it converts from the JSON object that's on the swordfish target
Starting point is 00:08:37 brings it into PowerShell, uses it as an object converts it right back again so we're not actually modifying the data, we didn't code any of this information this information. This information is directly passed through. So if you need help on these commands, and by the way, there's a lot of commands that are included, you can do a list of valid commands is get command module swordfish,
Starting point is 00:08:59 sneak swordfish, and if you want help on a very specific command, you can do get help and the name of the command with an examples or full and you can actually see samples of what these commands look like when you're running them. So every command that we've written, I've also made sure that we put inline help in. So there's inline help for all these commands
Starting point is 00:09:17 including how they operate, what they do, what API they're calling and examples of what they look like when they're being run. To see the raw transactions, you can actually do verbose true, at which point all of the raw REST code is actually going to be thrown to the screen in yellow, so you can actually troubleshoot a problem with your provider. If you're writing a Swordfish provider, you can use this PowerShell toolkit so that you
Starting point is 00:09:41 can make calls to the device. And with the verbose mode on, you can see exactly what the responses are. And this, by the way, is what the help looks like. So here's a get command on the Connect Swordfish mockup. It tells you roughly how to use it, and it even gives you an example down below of exactly how to run it. And this is standard PowerShell. All PowerShell people know how to use this and know how to expect it. So this is expected behavior for all. And this is the get swordfish volume. And you can see I've got multiple examples because I can actually put filters on the get command too. I can say get swordfish volume
Starting point is 00:10:20 and I can point to a single swordfish service instead of actually having it, so if one Swordfish provider could actually be providing five different arrays, but I can actually point down and say, okay, only get if it returns back service ID of that, or only get if it returns service ID of that and volume name of that. So I can actually filter it on the command line so I only pull back one thing. That
Starting point is 00:10:43 way instead of pulling back an array of objects, I can actually just pull back a single object or a collection of objects. Yes? Is it pulling the whole object, or is it doing the dollar select? In other words, it's going out there and getting everything? No.
Starting point is 00:10:58 Well, the first pull, it's got to do multiple pulls. The first pull, it goes and looks at the index. Once it's found the index, if you specify these, it can just pull the individual item. So it's not, but, so it makes one call for the index and then one call for the individual item. If, on the other hand, you say, you put a wildcard in there,
Starting point is 00:11:17 it has to look at every item and see if it validates on the wildcard. So these are the working commands right now that I've written. So get sword've written so get swordfish chassis get swordfish chassis power get swordfish chassis thermal get swordfish drive get swordfish endpoint endpoint group storage pool storage services volume class of service swordfish target and mock-up so these commands all exist and they're all get commands i haven't written the post commands yet, which are going to be new and set. So in a REST API world,
Starting point is 00:11:49 you're going to be used to CRUD operations. Create, remove, update, and, or no, create, read, update, and destroy. In PowerShell, those are actually converted to get set, new, and remove. So the terminology is a little bit different, but they work exactly the same. So you can see that I need to do new set and remove
Starting point is 00:12:10 for endpoints and groups, pools, group, you know, consistency groups, volumes. There's a bunch of these I still have to write, but it's all open source work that anybody can help out with. The framework is already there. Adding these new commands is not hard to do. So again, the create equals new, read equals get, update equals set. And again, all commands have inline
Starting point is 00:12:32 help. And all commands work both against the Swordfish targets if you downloaded the emulator that's written in Python, or it works against the Swordfish website, or it works against a real Swordfish target. They're all designed to work equally in all three places. You should mention about get-verb, because that's what's defining all these. True. There is a terminology with PowerShell that only a certain select number of verbs,
Starting point is 00:12:58 the first word, can be used. All PowerShell commands work as verb-vendor identification and then the command itself, noun. So in this case, swordfish is vendor identification and drive is the noun and get is the verb. That's how all PowerShell commands are formatted. But there are only a select number, like for instance, if I wanted to use delete, delete's not a valid verb for PowerShell and it would actually throw errors.
Starting point is 00:13:30 And PowerShell people aren't expected to know that delete is a valid verb. They're always looking for remove. So there's a whole bunch of terminology that PowerShell people have to accept that we have to live with. Yes? And then mention about the singular small. Right?
Starting point is 00:13:46 So like, getSorcusDrive, you just use that to get you all the drives. Right. Right. The other thing is that normally with API, a lot of people when they write their API, they write things plurally. For instance, if you want to get drives, the API
Starting point is 00:14:02 call is drives with pluralized with an S. In PowerShell, it's always a singular because you might be getting one drive. But singular assumes that instead of returning a single item, you could actually return an array of items. So get swordfish drive. It's always going to be a singular drive, not drives. So the things to remember here is we use the approved verbs.
Starting point is 00:14:25 We prefix everything with swordfish, and our nouns are always singular. With that, you can pretty much figure out, and we try to make the nouns exactly match what the API model was as well. Now I should note that we're not using any DLLs, any compiled code. Everything is open source and viewable by the public. But that also helps because we're also not using anything that doesn't compile for Linux and Mac. So if you're running PowerShell for Mac or PowerShell for Linux,
Starting point is 00:14:54 you have to be using.NET or.Core specifics only, which this will run on. So it makes it much more portable that way. But it also ensures it's all open source, nothing is held secret. So let me show you what the mapping looks like. If you want to map your storage device directly to a PowerShell API, or directly to a Swordfish API, that's kind of a hard job. That's where really all of the meat comes in of how you actually implement Swordfish, is how do you map what you have
Starting point is 00:15:28 to what's existing in the spec? Because they're going to be different. Nobody does everything the same. So what you're going to need to do this is you're going to need the REST documentation for your device, a PowerShell toolkit that exposes that REST documentation, because then you can just make PowerShell calls
Starting point is 00:15:43 instead of having to write raw REST. And basic PowerShell knowledge, access to Swordfish mockups and access to the Swordfish spec. And with that, you're going to retrieve the volume from your, the volume object from your device, expand its JSON, hold it side by side. So you're going to say, get volume here on your device,
Starting point is 00:16:02 and then you're going to do a get volume on the Swordfish spec, and look at them side to side, and actually see what matches up. If you have the documentation from your spec, you can actually read the spec. When your volume says size, does it mean the same thing when it says size in the Swordfish spec? And you'd think that's an obvious, but it's very common for a vendor to express things in megabytes or in gigabytes or in gibibytes. You have to normalize your data because the sort of spec expects it a certain way.
Starting point is 00:16:32 So with that, you can actually do that very, very easily. But you have to know what to expect. And then you're going to go through them side by side. Let me show you what that looks like. So here's where you're normalizing the spec. In this case, my volume cache policy is either going to be normal or it's going to be off. But in Swordfish terms, it's either going to be adaptive read-ahead or off. So I can't feed, normally I would just feed the same value in from one spec to the other spec.
Starting point is 00:17:01 But in here, I simply have to change the name from, if the value equals normal, then the value I should feed in is going to be adaptive cache. Otherwise, the value is going to be off. So you can see that there's some things I have to normalize. This is kind of what that looks like. I go into swordfish.com, or swordfish mockups, and I downloaded a volume, a standard volume, just a sample. And then I took my spec, which has all these different fields,
Starting point is 00:17:26 and I figured out what maps to what. Some of these are going to have to be normalized, most are not. But as soon as I've done this little quick mapping, I can kind of start to figure out what this is going to look like. Now, you notice there's going to be a few classes. There's going to be some things in here that simply do not exist in the Sorphish spec, in which case I don't have to worry about it. There's going to be some things over here that do not apply to my device. Again, don't necessarily have to worry about it. I'm going to look at the Swordfish spec after this
Starting point is 00:17:55 to try and figure out what I can flesh out. This is just to get me a started, a place to start. So the idea is that, for instance size here it's 4096 block size here 4000 uh 4096 i'm gonna put the exact same thing it's just going to feed right over so it should make sense how this mapping is going to work after you've done the mapping then you go to the sort for spec and you start walking through all the different fields that could exist for a volume to see if you've got something from your ap that matches it. And if you do fill it in, if you don't, you don't. But there's going to be some things like, for instance, my array, nimble storage, my array only supports triple parity. Now, if I look at the spec, the spec actually for RAID type actually says one of the options is
Starting point is 00:18:41 RAID 6-TP for triple parity. So that's the term I'm going to use. And because my array doesn't support anything else, it doesn't return it as a setting here, but I can fill it in over here as a hard-coded value. Again, I hate hard-coded values, but in some situations, if your array only does it a certain way, you can't hard-code values in. So some things are going to be hard-coded,
Starting point is 00:19:02 some things are going to be directly pulled in, some things are going to be normalized before they're pulled in, and then some things are simply are going to be hard-coded, some things are going to be directly pulled in, some things are going to be normalized before they're pulled in, and then some things are simply not going to be there. And you're just going to simply go through the entire spec doing that. Now, once you do, this is what it's going to look like. You're going to make, and
Starting point is 00:19:17 I created a file structure to match the Swordfish spec. So again, we're now off the PowerShell toolkit, which is where most of us start at, because that's how you query a Swordfish target. Now let's move on to a mock-up. I've actually put a project here,
Starting point is 00:19:36 which I'm working on getting all the vendor-specific stuff out of and making it generalized. And once I do, it'll be submitted to Snea's site for inclusion as a new open-source project. But what this does is it lets you run a PowerShell commandlet that will query, and by the way, I'm calling this Project Catfish, it lets you query the array, an array, and lets you pull all that data in
Starting point is 00:19:55 and save it all to the hard drive locally. And what it does is it saves that structure to the hard drive, and then you can see over here the code where I'm filling in the detected values directly into the fields of what the JSON should look like. Now, in PowerShell and JSON look very similar. I mean, it's surprisingly similar.
Starting point is 00:20:17 The only difference is instead of a semicolon, or instead of a semicolon, they use a colon between the values. They use an equal sign. Instead of sharp brackets, they use curly brackets. I mean, there's very, very few differences, but the point is,
Starting point is 00:20:35 this is all written so that it's very easy on the eyes, very easy to read what my final spec is going to look like. And more importantly, I run a final spec, and I create a file. I create a Swordfish mockup file called create mockup. And that create mockup has different
Starting point is 00:20:50 sub files. It runs one for volumes, one for endpoint groups, one for endpoints, one for storage pools, so that I have one of these that looks like that inside each of my sub files. And the value there is that if I need to troubleshoot something with volumes, I open up the volume file and I look in there and I mess with it. And once I figured out how to do this for a single volume, I simply put it in a loop and have it run against all the volumes. And it builds the entire structure for you and just creates it. Now, you should note, if you're new to PowerShell,
Starting point is 00:21:25 all variables start with a dollar sign, and all constraints, all our constants are shown in brown. So if something has a single quote on either end, that's a constant. I'm not going to change it. It's just fed right in. For instance, up here, OData type,
Starting point is 00:21:39 I know I'm conformant to the 1.0.4 volume, or 1.4.4 volume spec, so I just hard-code that right in. And if I update this module to change to 1.5.0, I'll manually do that as well. So again, we create the object in my PowerShell script as a PowerShell object. And then remember before I ran the PowerShell toolkit
Starting point is 00:22:05 and I was able to pull a volume and then convert it to JSON? Well, I can do the exact opposite. I can take the object I create in PowerShell, convert it to JSON, and then save it to a file. Or send it out to a user. So it's the exact same process. I'm using the built-in convert to JSON functions. And to do this, the best part is you can actually take this,
Starting point is 00:22:30 this mock-up creation process, and you can turn it around and actually make PowerShell listen to port 5000 and actually query the information that's coming in. So if I do a call to port 5000 on this server and I've got my script actually listening to port 5000, all the different directories that it tries to do, that it tries to query,
Starting point is 00:22:53 come back as parameters for my script. At which point they can return the actual index that they looked up previously. So the mockup does two things. If you run the create function, it will lay onto the hard drive an exact replica of what my storage looks like from a Swordfish perspective. I can walk down all the directories.
Starting point is 00:23:14 I can look at how things are laid out. I can open the index.json files and just read them like a text file. However, I can also run the PowerShell command called listener that listens for port 5000 and will actually respond to Swordfish calls. And the best part is I pointed it so that the listener will point right back to that file system and respond with the exact answers that I've recorded previously. So the benefit here is that I can take a swordfish, I can capture a model and then replay that model back all I want, over and over and over.
Starting point is 00:23:59 Now it'd be great if you all had nimble arrays. I'd love that. I'm sure for you it'd be great if everyone had a pure array. But I can't really expect that for somebody who's trying to develop on PowerShell. So I've also included in the GitHub the output of my array after I've pulled this information. So if you want sample data of a nimble array having been run through this process, it's on the GitHub site as well. So you could actually run a listener and pretend you have a nimble array on site that you can run against, run commands
Starting point is 00:24:28 against, without ever buying a nimble array, just so you can get down how the process works and how the code works. And this, by the way, is the code for the listener. It's really simple. PowerShell lets you do a lot of things like this, a lot of system-level things really easily. And then once it's running, it's pretty nondescript.
Starting point is 00:24:54 Now note, in my PowerShell code, I could choose very easily to rewrite that code so that instead of pulling the listener information, instead of going to the hard drive and looking for a static file, instead I could actually go to the array and pull the information directly from the array. And more importantly,
Starting point is 00:25:12 I could also write it very easily, very small changes, so that instead of a put, if it was a put instead of a get, instead of actually reading information from the array, I could actually push information to the array as well using the exact same command set. So it's a very extensible toolkit,
Starting point is 00:25:28 and this can actually give you a storage provider written in PowerShell for your non-Swordfish-enabled array. You've got a Swordfish-enabled... You've got a non-Swordfish device out there. This gives you a proxy agent that you can roll in a couple hours. And in fact, tomorrow,
Starting point is 00:25:44 I'm actually going to be demoing that in the Swordfish mockup, or workshop. We're going to be doing a workshop next door. We're going to help people install the emulators, help people install the tool kit, and I'll help people run this Swordfish walkthrough. So you can actually figure out exactly how to write your own emulator. And if you want, we can actually take a look at your API, if you've got
Starting point is 00:26:02 an API with you. We can take a look at your API and show you exactly how things map over. And show you how, we can actually take a look at your API, if you've got an API with you. We can take a look at your API and show you exactly how things map over and show you how to use the specs to do that as well. So this should kind of give you an idea of where we're going. Right now, I don't have that many commands done. I've got most of the read commands done. I haven't done the write or the update commands yet, but those are coming.
Starting point is 00:26:19 And those should be done before the next event. It's a cookbook. And then we are on to Barker's session, which is Windows Admin Center. Let me give you the microphone. Oh, you're on this one. Where's the little clicky? That's on the keyboard.
Starting point is 00:26:41 It's a little arrow. Oh, I thought you had one. Yeah, so everything that Chris has kind of talked about in terms of the PowerShell work that we're doing, one of the things I kind of always call it, we have the chicken and the egg problem, right, which is we can have swordfish services, but if there's no client consumer, what's kind of the point of actually having that service? So really what Windows Admin Center is going to give us is the ability to build what are called extension types. And that will act as a consumer or a client for consuming not only Redfish stuff but also Swordfish.
Starting point is 00:27:18 So Windows Admin Center is essentially the next generation of server manager in Windows. So if you're running Windows Server 2019 and greater, you're going to notice that there is no more server manager there to be used. So that's the replacement is Windows Admin Center. And one of the major differences is because server manager never had an extensibility model, right? You're pretty much stuck. This is all you can do with this thing. And it's very, very specific against Microsoft features that they wanted to implement. But Windows Admin Center has an extremely good extensibility model behind it. And the way that you do that is we build what are called extension types. So there's two types of extensions. One is called a solution extension, which is a very high-level extension that's built
Starting point is 00:28:00 into the master menu list of Windows Admin Center itself. And then there's also what's called a tool extension. So Windows Admin Center is all about managing servers, compute nodes, hyper-converged infrastructure, failover clustering. So it's built in what's called the connect context model. So you're always going to be connected to something, and once you have that connection, the context of you working in that is what's going to provide a lot of these different extension features. So the interesting thing about WACC is the fact that because when you connect
Starting point is 00:28:37 to a server that has Redfish enablement, you build a tool extension for that server connection, and now you can actually begin interrogating all of the Redfish characteristics that might be surfaced from that particular compute node. So you have to think about how this connection model works in terms of what we're going to be able to do when it comes to specifically around the Swordfish piece. So there's some interesting things that you can do. One of the most important attributes of working with Windows Admin Center as a developer is you have to install it via the command line,
Starting point is 00:29:15 and you're actually going to use this attribute called dev underscore mode equal one. That's going to give you the ability to do live debugging sessions inside of Windows Admin Center from whether your tool is Visual Studio proper or whether you want to use Visual Studio Code. You can certainly get into debug sessions to be able to do these things. You're going to notice it's what's called side-loaded. So that just means that you're side-loaded so that you can do debug sessions and connections into that particular extension type.
Starting point is 00:29:50 So when Microsoft released Windows Admin Center in its early days, it was better known as Project Honolulu, they only had an SDK that was 0.1. So they just recently, with a later build in the 1900s, that they've introduced the SDK 1.0. So all of these are links in here, so that way you kind of have a quick link into looking at the SDKs and everything else. We've adopted this latest insider and the next operations, so that way you can define whether or not you want to use current builds or whether you actually want to use future builds of the SDK with even newer builds,
Starting point is 00:30:32 preview releases is what they consider them, for the different versions of Windows Admin Center themselves. So there's two types of plug-in connections that you can use. One is called a gateway, and the other one is basically being able to do a PowerShell extension. So the basis work that Chris has been doing on the PowerShell toolkit, we are going to essentially use that same toolkit to be the driving force behind any of the connectivity models inside of Windows Admin Center itself.
Starting point is 00:31:03 So the interesting thing there is that as more improvements are made into the PowerShell toolkit, we're just going to natively adopt those inside of Windows Admin Center. So the other thing, all of this is, so the screenshot on the right, this is the new model that's being used. So before, the interface on this used to be iPlugin. That's been deprecated now, so now everything flows across HTTPS, so you don't have to worry about handling a lot of that stuff yourself anymore. The way that one of these plugins works is when you publish a plugin that you want generally available to anybody that might be running Windows Admin Center
Starting point is 00:31:45 is you publish to the master Microsoft NuGet feed. So once it hits there, and any time an update's made, you're going to actually see that extension come up and say, hey, there's an update available. Do you want to go ahead and install that? So this is something that I'm working directly with Microsoft on because we have to go through a publishing process with them in order to get that particular package up there. But as a developer, what you can do when you're running Windows Admin
Starting point is 00:32:11 Center in dev mode is you can create your own feed, and that feed can just simply be a folder on your box. WAC runs both on Windows 10 or Windows Server itself. So you don't really need to kind of have a server infrastructure in order to begin doing development work against Windows Admin Center itself. So this is an example of a solution extension that we built. You'll see here, this is the extensions gallery. And you can kind of see there's tons and tons of different companies
Starting point is 00:32:42 that have actually been doing things in here. Fujitsu, there's DataOn. And then there's a whole bunch of different developer tools that you can actually download. So this is what a solution extension looks like. You can kind of see there's the Pure Storage logo. And then you'll see there's all these connection contexts. So this is how we actually manage the connectivity into a flash array.
Starting point is 00:33:04 So the only thing that we're going to be doing different here is actually we're going the connectivity into a flash array. So the only thing that we're going to be doing different here is actually we're going to be connecting to a swordfish endpoint. So now we'll have that connection, just like Chris showed in the commandlet of connect swordfish target. We'll actually just be connecting to that swordfish target, and it'll be represented as a new connection type that you can begin drilling into. So these are just some of the things that you can accomplish in Windows Admin Center. This is a view of what our dashboard looks like on our main management interface.
Starting point is 00:33:32 So you can pretty much replicate anything that you want. Microsoft provides a very robust set of integrations and controls that they've already built that you can leverage. And the purpose behind this is that it's not recommended that you go off and do some custom thing because as new versions of Windows Admin Center come out,
Starting point is 00:33:52 they want that to be highly compatible moving forward. If you have your own custom controls that you've developed, it's not going to follow their CSS styles. It's not going to follow any of their best practices. Hence the reason why you really need to focus on just using the particular controls that are actually provided by WAC itself. So you get action menu items, and all these types of things are going to be able to do, as right now we only have get cmdlets, but as we do sets and everything else, we're actually just going to build them into a real user interface.
Starting point is 00:34:34 So the first version of the project that I'm working on is, you know, in Don's session, he talked about the basic web client. So all I'm going to be doing is taking the basic web client and really plugging it inside of Windows Admin Center. It's called the iFrame way of doing things. Very simple, very straightforward, and it shows that first kind of example of how you develop a really basic extension. And then as we move forward, I'm essentially going to be taking the basic web client and providing all that same type of functionality
Starting point is 00:34:59 directly in Windows Admin Center. So you'll be able to do clicks and adds and take actions like destroy volumes or destroy different elements that might be part of the schema itself. So here's a couple more examples of what some of the screens look like in terms of our extension.
Starting point is 00:35:19 So the next steps that I have to do right now is I'm actually actively working with the teams called Server Management Team at Microsoft, but everyone refers to them as the WAC team. I'm actually working with them because they are contributing to this open source project. So it's not just simply pure and HPE.
Starting point is 00:35:38 I mean, we want more people to contribute to this. And it's very interesting for me. I think Chris and I really appreciate the fact that the WAC team sees this as something that they want to invest some time in. So I do have calls with them to kind of go over different things that we might want to accomplish because everything has to be built around this connection. A connection requires credential management. So there's some very, very specific things that we need to do from a credential management standpoint. You know, moving over to the new SDK versus the old SDK. And then, you know, like Chris had mentioned, you know, we're going to be, you know, talking about
Starting point is 00:36:15 some of this stuff in the workshop. So, you know, I'll have some demo code and everything else that will be up so you can kind of see how this thing's developed. So there's two also ways of doing Windows Admin Center extensions. One is if you're a C++ or a C Sharp up so you can kind of see how this thing's developed. So there's two also ways of doing Windows Admin Center extensions. One is if you're a C++ or a C Sharp developer, you can certainly do that. WACC is all based on Node.js, Angular, and TypeScript. So you kind of have your different options of how you want to implement this.
Starting point is 00:36:37 Or like I said, you can go ahead and use C Sharp, and best of all, you can actually write a lot of this stuff in PowerShell directly as well. These are all the resources. Chris had a couple on his slides. There's the toolkit, and these are all the different things that you would use to actually get started in writing an extension. They're very, very well documented,
Starting point is 00:36:59 and it's quite easy and straightforward to kind of get running. Like I said, you can do this on Windows 10. You can manage Windows 10 systems, or you can manage Linux. You can manage Windows, basic Windows servers themselves inside of Windows Admin Center directly. And with that, that was my stuff, and we can do Q&A. I want to add one more thing, too, which is that the WAC client while writing is actually the first
Starting point is 00:37:27 open source, or not the first open source, the first industry standards organization WAC module that Microsoft's been cordoned to take on. Yep. There may be more coming after that, like we were talking about a Redfish one at some point, but this is the first one and we're also the first group
Starting point is 00:37:43 that's going to be doing the development in the open because up till now it's always been vendors who are writing their whack module not presenting how they did it to the rest of the world this one's going to be all about exposing to the world yeah i mean the other intention of like the toolkit itself is instead of every vendor going off and doing their own thing and being very customized to that particular vendor that the whole point of this open source project is to have that standard that supports the standard. And this is the way you go and access everything. Everyone's on a level playing field. And if you know how to do something, I mean, what company doesn't have an EMC, a Nimble, a Pure, multiple arrays?
Starting point is 00:38:23 If you know how to talk to one, you'll understand how to talk to the other ones as well. And what I'm looking forward to is the day that somebody comes to me and says, hey, your PowerShell toolkit didn't do this properly, and I followed spec. That's exactly the call I want to get, because that means either the spec and something's going on there, or it means the toolkit needs to be updated.
Starting point is 00:38:41 That's how we make these things better, is by people actually implementing against them. And the toolkit, if it doesn't return your volume, you should look to make sure that you're following the spec properly because it should. And one of the other things that we're going to include, so there's this utility in PowerShell called Pester. So Pester is the way to do automated testing.
Starting point is 00:39:01 It's a declarative language. So we're going to be building Pester tests in here so that if you wanted to do mass scale testing or anything else, or you actually wanted to test based upon certain things that are coming back from the spec itself, you'll be able to identify these things very rapidly by just being able to run and kick off all these pester tests to actually go off. And you can write reports back out of it. You can do error tracking out of it. So we're going to be including some of those as well. Yeah, and the major way of actually distributing PowerShell modules
Starting point is 00:39:36 is through what's called the PowerShell gallery. So it's very, very simple. You just say install-module. What the module name is, in this case, it would be SNEA Swordfish. Pulls down from the gallery automatically, and your installation is done. Thanks, everybody. Thanks for listening. If you have questions about the material presented in this podcast, be sure and join our developers mailing list by sending an email to developers-subscribe at sneha.org. Here you can ask questions and discuss this topic further with your peers in the storage developer community.
Starting point is 00:40:16 For additional information about the Storage Developer Conference, visit www.storagedeveloper.org.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.