Storage Developer Conference - #75: Deep Sea Fishing: A Swordfish Deep-Dive

Episode Date: September 18, 2018

...

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 SDC Podcast Episode 75. All right, so my assumption for this presentation is that you've just sat through the last two presentations. So I don't really do a lot of explanation about what swordfish is at this point or redfish or anything like that. So we're going to mostly just jump right into things here.
Starting point is 00:01:01 Let's see. So, again, yes, building on the concepts presented in both the intro to redfish and swordfish sessions. What we're actually going to talk about is more, I'm going to jump into a couple of different areas here. One of which is the kind of the overall storage system and storage service concepts, but I really wanted to dig into a little bit on the class of service and give an example of how that works. This is an area that is kind of critical to the system, but you guys get brand new material today.
Starting point is 00:01:43 We have not covered this before, so George is going to be sitting in the back critiquing me. The other thing we're actually going to do, and John talked a little bit about this first thing this morning, is I'm actually going to talk, and this is kind of a precursor to the implementer stuff a little bit. I'm actually going to talk quite a bit about the CSDL and JSON schema formats and just kind of show schema in quite a bit more detail.
Starting point is 00:02:19 What are the schema? How are they constructed? Because one of the things, once you start looking at the spec, you actually start digging into the schema quite a bit. So I'm going to talk a little bit about how those are constructed and what they look like and the two different formats and comparison of them side by side a little bit. So that's pretty much what we're going to cover now. And we'll see if George can actually comment, whether he'll actually comment or not on the class of service stuff.
Starting point is 00:02:51 Standard disclaimer, and also the website. Again, cna.org slash swordfish. Oh, I'm sorry. I didn't put my three notices. Sorry, Linda. The bowl is once again empty. So there is once again a giveaway. Another Echo Dot.
Starting point is 00:03:12 So enter again for the Echo Dot business card or your name and contact information. And make sure you put that in there at the end. This is a smaller group. You have a better chance this time. So the glass bowl up here, Linda will take that around and make sure you get your information in there for that. Second, again, reminder, Twitter contest, no one is tweeting apparently apparently, except me,
Starting point is 00:03:46 and I don't count, so I can't win. So hashtag STC17, hashtag storage management. Apparently, all you've got to do is have one tweet out there. So, and what was the third one? Oh, take the coasters and the uh you can take the coasters with you and the two little the swordfish cards the little swordfish cards have the same information on the little bit of a blurb on there um you're welcome to take those with you all right standard disclaimer and reminder of the pointer to snea.org slash swordfish.
Starting point is 00:04:26 All right. So, you know, I said I wasn't going to do a lot of recap, but I'm going to give us a starting point, the resource map. We talked about, you know, here's the basic Redfish resource structure. When we add swordfish, build, come on. There we go. When we build, we focus on and we add the storage systems and storage services. And so let's talk a little bit more about those storage concepts.
Starting point is 00:04:57 We're on slide nine already. We're just zipping right through here. All right, so what are storage systems anyway? We said this a little bit already. But storage systems, again, it contains those computer system instances that are used for storage applications. And I mentioned this in the last presentation, but if you actually go look at the scheme and look at the spec, those are, the storage systems are actually exactly the same thing as computer systems.
Starting point is 00:05:30 So what you'll actually see when you do a real implementation, if you're a real boy, you will actually see all of those storage systems actually show up in systems as well. So there's a couple of different kinds of implementations you can do.
Starting point is 00:05:53 You can do, you know, if you're doing like a, think of this as, you know, host-based management if you're doing, you know, that kind of management. Host-based management that's got a lot of different systems as opposed to embedded management. You might see a system up here that's got servers and other things in it as well, this storage system collection down here would only have your storage systems in it. If the only thing you're managing is storage, these systems would be identical. This becomes relevant when there's also another class of redfish management ecosystem,
Starting point is 00:06:27 a redfish service that we call an aggregator, because what you can actually do is build a redfish service hierarchy. So an aggregator that's building up a management, so swordfish that manages swordfish or redfish that manages, you know, based on different kinds of systems. So you could have a storage system that's built out, you know, by pulling in servers, you know, it's composed. I hate to use the word composed because it's not really using a good composability system that John talked about earlier. But if you take my word composed and realize it's not that same one, it'll work.
Starting point is 00:07:13 But it's comprised of, you know, servers. And it's using that Redfish information or even that swordfish information from different systems to build a bigger swordfish system, you might see things in those different structures. I'm probably going into too much detail there. I'll stop. But kind of the key point is you'll see it in both spots. You will see people's implementations most likely telling you,
Starting point is 00:07:53 look in storage systems to find them. Okay, storage services, again, we'll spend most of our time here. So the storage service instances manages all the different storage-related functionality. Different implementations can choose how many different storage services they want to instrument. They can support one storage service per storage system, or they could support many. It's going to be kind of implementation-specific. There are clearly some storage services or some storage systems you can look at today and think, yes, those will clearly support lots of storage services,
Starting point is 00:08:42 other kinds that it just clearly makes sense to only support one storage service. It's going to be completely implementation-specific as to how many storage services they choose to support. This has a redundancy element built into it, so we support implementations already working either way. Okay, so I'm kind of diving down into things that I didn't intend to,
Starting point is 00:09:19 but, you know, hey, that's okay. So the storage service, again, we talked about this already, you know, class of service volumes, file systems, storage pools, all of those things we saw as we were navigating around in the mock-ups earlier. So let's take a more specific look at class of service. What is this thing? How is it structured?
Starting point is 00:09:44 How does it work? So what I did in here was I put an example together that shows the very simple case of this for you because this thing can be structured in a very complex model as well. So classes of service are fundamentally composed of lines of service. There are five different kinds of lines of service. So there's data protection, data security, data storage,
Starting point is 00:10:22 I.O. connectivity and I.O. performance, and all of these have multiple attributes that you can associate with them. And so the way that you specify what properties are available for each one of these are in capabilities. So what is your system capable of? And so, again, it's kind of up to the implementation to say how flexible it wants to be. So if an implementation just wants to say, I'm going to just predefine a set of classes of service,
Starting point is 00:11:00 you won't need to see all this complexity. But if it's a large-scale system, it's going to be deployed with a lot of different flexibility to it, you might see a lot of detail here, and it might populate a whole bunch of capabilities so that a storage administrator could come in and configure a whole bunch of detail here. So what I'm going to show you is actually something that could be very tiny. So the hierarchy here is kind of like you have this, again, you have this class of service that's comprised of lines of service, and then this detail down here where the definition of what you can specify for the lines of service
Starting point is 00:11:44 may be specified in those capabilities. So, again, very, very simple example here. If you have a system that says I want to use a single property to define class to define class of service so I want to go in and here here is one property I go into the IO connectivity capabilities there's a property called supported access properties or support called supported access properties, or sorry, supported access protocols. What that actually translates to is it's actually connection type, but it really translates to drive type, right? So this is things like SAS, SATA, NVME. It's got a bunch of other things in there too, but when you actually look at it,
Starting point is 00:12:43 for these purposes, we can translate this to say, that's actually going to tell me the drive type. So what I can do is actually I can go in and I can create a line of search, two lines of service that says all it is is this property. And I can create a line of service that says, I want a line of service that says it's NVMe. I want a line of service that says it's SAS or SATA. Right?
Starting point is 00:13:14 And that actually says NVMe, I know that these are fast drives. These other ones aren't effectively, right? So high-capacity drives, high-performance drives. Right? So high capacity drives, high performance drives, right? So there I've got that piece done. So here's our little eye chart. So this is kind of what I did here. I put them both on the same one, hopefully, so you can kind of see this. So here's my one class of service named high capacity.
Starting point is 00:13:55 Let me see if I can point it this way a little bit. So over here we've got high capacity, and I created this line of service and specified this line of service down here where that same property, the access protocol, is a SATA. And over here, we've got another class of service. This is high performance, and its access protocol is NVMe. So, again, super simplified example. You know, you could, but you get the idea, right?
Starting point is 00:14:27 I can use, I could get this as simple as one property that I could use to bubble this up to say, I want my system to have two classes of service keying off of one property. Okay, well, great. Now, how do I use it? You know, what do I do now? How about these two classes of service? So I've got classes of service defined. And so I, turn that off.
Starting point is 00:14:58 So once the classes of service exist, whether I pre-built my system that way or whether I went and created them, then I use those classes of service when I create my storage pools. So there's multiple ways you can actually do this, right? So I had a question earlier when we were looking at reviewing these slides about what are we going to actually ask the implementations to do here? Are the implementations going to always create the lines of service and the class of service.
Starting point is 00:15:49 And the spec doesn't actually dictate this. So one of the things we'll likely do as we start running through some of these initial implementations is start working on some best practices for this and try and come up with some guidelines to say, you know, what should, you know, what do we recommend best, you know, implementations to do? Should implementations generally have
Starting point is 00:16:14 a couple of classes of service, you know, at least one class of service, a default class of service that comes out of the box? We don't require it now, but what's the right best practice? Should they have at least one? What would we recommend? I'll just head that question off because I know it's likely to come.
Starting point is 00:16:41 Okay, so when you go to create a class of service, there needs to be, you need to specify, or sorry, when you create a storage pool, you need to specify then a class of service, whether it's, you know, the default one for the system or you pick one. And then, so you can go create multiple storage pools and have them all ready, or you can just do one, doesn't matter. And then when you go to allocate a volume, you use that attribute. You can use that class of service attribute to pick from either the one pool you know the pool, or from the set of pools,
Starting point is 00:17:19 to say, you know, pick which one to use, right? So we created that high performance, high capacity one. I can just say, hey, pick a pool that's got that high performance class of service and I need this much capacity. Or if I happen to know that pool Boston Performance, you know, I created as a high-performance pool, use that one. So there's lots of different ways, and it's kind of up to the, you know,
Starting point is 00:17:57 the specifics of the configuration for the naming and how you want to do that. So here's kind of a quick example of this. I actually pulled the template for this from our user's guide. I haven't yet mentioned today our user's guide. One of the things we released in conjunction with our specification was a user's guide which has a whole set of example use cases from a client perspective for, what do we have, about 20-ish use cases in there
Starting point is 00:18:38 for things like allocate volume with a default class of service, allocate volume with a default class of service, allocate volume with a specified class of service. So just to give folks an idea of how to interact with the Swordfish system. So this is one that would basically be, okay, how do I create a volume? So here's the post, and here's kind of what a body of the post request would look like. So I specified its name, its capacity, and the class of service that I'm looking for. That's about it.
Starting point is 00:19:20 So none of that bothering with RAID levels, which drives to use, all of that kind of stuff. We didn't see any of that in any of this process. And the user's guide provides more context for how this whole use case works, but it's really pretty straightforward. Yep? What would you get in the response? Only HTTP code or anything else?
Starting point is 00:19:54 I think you pretty much get a success and potentially a pointer back to the volume, depending on if it's created right away. And that's implementation-specific. You might get a pointer back to the volume, depending on if it's created right away, and that's implementation-specific. You might get a pointer to a task if an implementation takes a while to create the volume. So it's one of those two things.
Starting point is 00:20:15 It's either a task pointer or a pointer to the volume itself. Yep? Yeah, it's in side parentheses. I'm just doing the list. Those are it's inside parentheses. I'm just doing the list. Those are essentially like indexes. You have storage services one, for example. Yeah, so...
Starting point is 00:20:34 Is the one in index that the client site knows about, or where did that come from? So these... George, you want to explain the OData format there? There's two ways to specify keys, but they're keys. They're keys, okay. Okay. One's probably unfortunate because it's a small number.
Starting point is 00:20:54 If you think about it as an index, but in a real system, it's likely to be a UID that's real big. The high performance there, that was a term defined by the vendor implementation. That was that same class of service that I had in... Yeah. Yeah. So if that's defined through this process, that can vary from system to system, is that correct?
Starting point is 00:21:20 Yep. Yep. So the single manager of this whole thing basically has to drill down and decipher kind of what these different things mean if we're trying to provide a unified view of multiple systems in a different number. Is that correct?
Starting point is 00:21:35 Yeah, but those names can be, well, some of this may... For the names you aren't getting. Yes, yeah. So the names could be user-defined names depending on the specifics of the implementation, right? Some implementations may come with predefined classes of service. Some may be entirely user-configured. Okay.
Starting point is 00:22:07 Let's see. All right, so that's, you know, kind of a quick over, quicker than I, went through that faster than I expected for some reason. So, all right, so let's jump into schema a little bit. So when you're actually starting to interact with and work through the spec and deal with, you know, looking at implementations, there's two different ways you'll be looking at schema, right? If you're building a server-side implementation or if you're dealing with from a client perspective. But let me just kind of start walking you through how the schema
Starting point is 00:22:42 is constructed and what it looks like. And there's, we'll talk about this a little more in a minute. There's actually two different variants of the schema. But the schema is we fundamentally develop the schema in, as John pointed out earlier, in CSDL, the Common Schema Descriptor Language, which is developed by OASIS. And it's that standard schema language. It is not – Redfish, actually, and Swordfish, therefore, use a subset of the full OData specification, but it does conform – the portion we do use conforms to the OASIS OData spec.
Starting point is 00:23:25 So there's several items here, and I'll try and remember to highlight them all when I go to the schema. I tried to put little highlights in to remember every point. I may miss one, so bear with me. So there's a lot of similarities to other languages here and other mechanisms for defining these things. There's one file per schema type, so volume, pool, class of service. Each one of these things has one file for each one of these.
Starting point is 00:23:59 So we have 29 or 30, something like that, schema files for Swordfish itself. So each one can pull in external definitions. So, you know, clearly storage service will, you know, have includes for all of the various things that are in its hierarchy, so volumes and storage pools and storage groups and everything else. So there's an include format, just as you'd expect. Each response contains that OData type, and that provides that top-level decoding.
Starting point is 00:24:35 So there's a way to kind of define namespace. Everything inherits from this base type of resource, and then when you're looking at the namespace, it'll be, you know, something that's like here, you know, volume.volume or volume.version. Volume.version.volume shows us a volume entity of a particular version in the volume namespace. And so there's kind of two versions here.
Starting point is 00:25:15 Like I said, clearly when you're doing implementations, you're going to be, you know, developers are really going to be dealing a lot with these schemas. Purpose-built clients may not be reading the schema directly. Generic clients probably actually want to in order to be doing formatting and dealing with everything properly. In the last session, I talked about our basic web client. It is actually the way I've been working with the folks building that is I am actually having them read the schema
Starting point is 00:25:47 in order to be able to know how to format things. So, for example, I'm having them look at the annotations to say, is this property read-write or not? They're not looking at the specifics of everything. They're just looking at the annotations in order to be able to determine, yep, this one's read-write. Okay, I know how to mark that one. So that kind of thing is right.
Starting point is 00:26:08 So this is the same kind of guidance here. So, and John mentioned this as well, all of the standard schema files are published or republished on the DMTF website. So I know one of the things folks are used to seeing from SNEA is that we put all of the stuff on a SNEA website. Well, that's actually different with Swordfish. One of the things we're doing with Swordfish is we're putting our schema files as the primary place we point stuff on the DMTF website.
Starting point is 00:26:43 And the reason we're doing that is to make it more convenient for users, clients, developers, anyone who wants to see the schema. So the primary place we publish them from a legal perspective is on this Neo website, but we put them in a zip file. We don't ask people to say, okay, go to DMTF to get all of these schema files and then come over here, and then if you're a vendor, go to your own website. We highly recommend everyone put them on the DMTF website. And there are guidelines for companies, SNEA and everyone else,
Starting point is 00:27:25 to say you have to have a primary spot on your own site where you publish your files, but we highly, highly, highly recommend that everyone, when you do your implementations, republish through the DMTF portal and put them there because it's so much easier for clients to say, go to one website, find all your schema files there. So that's what we're doing.
Starting point is 00:27:48 We're recommending to all of our Swordfish vendors that, as folks implement, that they also publish through that portal. We don't have any actually live and real implementations yet that have shipped, so there's none out there yet, but we expect to see that when we do have some implementations, hopefully next year. So not to say also clients and services
Starting point is 00:28:17 may also have local copies. So we do expect to see a lot of implementations where people are in dark sites, right? Or have embedded instances or whatever. So we do not say only put things out on the DMTF website.
Starting point is 00:28:35 It is also good best practice to have a local copy. Every instance of every schema, including OEM schemas, OEM being the name, the branding, or the type, I should say, for every vendor-specific schema will be versioned. So they will be identical. You can have a local instance of it as well.
Starting point is 00:28:57 So there's no issue with having those be different because they will all be versioned. Oop, did I miss a page? Okay. So schema file types. There's two. They're identical. This is completely up to the developer which one they want to use. But we do all of our design development work in the CSDL and the XML versions. And then we use tools
Starting point is 00:29:27 developed by Redfish, not by us, to convert those over to JSON. Those files are identical. I will show you an example of that in a little bit as we walk through what the schema files look like. Again, I already said, you know, the common schema definition language. I've already said these first few bullet points already. But the JSON, one primary difference here is the files are generated into multiple versions for JSON, one per version. And in the CSDL and the XML versions,
Starting point is 00:30:10 all the version information is in one file. So that's pretty much the only difference in delivery that you will see from them. The information is identical, just in different formats. So the JSON follows the json-schema.org format. But again, it's really just up to your personal preference which version to use. I end up looking at the CSDL format because that's what we use 99% of the time in the technical work group. So I have a hard time looking at the JSON schema without trying to make the mental translation back to the other format.
Starting point is 00:30:53 Okay, so here's a little bit, and I might have made this a tiny bit bigger, but again, you know, you guys are mostly sitting towards the front of the room. So, okay, so we talked a little bit about, but again, you know, you guys are mostly sitting towards the front of the room. So, okay. So we talked a little bit about, you know, some of the elements in here. Again, there's basically one version for each schema type. And this actually is kind of, we picked, this is doing, what is this doing? This is doing session. It's actually one of the simplest objects.
Starting point is 00:31:33 It's one of the redfish objects because it was pretty short and highlighted everything. So we talked earlier about, you know, they'll include the related objects. So you can see up here, this is what the includes look like. One of the things you'll see, let me get the highlighter since I can't reach that high. So you've got the include formats. Look here. Look up here. Some of the basic includes that everything does is pull in these basic definitions, the OData capabilities,
Starting point is 00:32:07 files from OASIS and the core OData definitions. You see these aliases like this and capabilities. But then you'll also see these are referencing our own ones. So like this redfish.dmtf.schema.v1.redfish.extensions is another Redfish file. Here's the base resource one that everything inherits from. When it's a Swordfish file, it'll be redfish.dmtf.schemas.swordfish.v1 because that's that republication portal where all of our files go. If that was a republication for, say, Broadcoms,
Starting point is 00:32:52 I would expect that to be like slash schemas slash Broadcom slash v1 because we haven't pushed anything out there yet, but when we did, I would expect that to be a similar structure for republication of various companies' files. So that's basically the includes. We talked about namespaces, and so here's the basic format like that. So you can see that entity.version.entity to define the namespace down here. You know, it's a resource.version.resource. It's kind of a strange format, but that's how to specify it.
Starting point is 00:33:49 Okay, and there's some other elements in here. Oops, where did I go? I should look on my own screen here. And then there's a bunch of other fun little things that I didn't really talk through. So there's annotations. So everything is, some of the things that we require are pretty much everything has to have a description and a long description. This is how we, these are, you know, basically required properties in the system.
Starting point is 00:34:18 How we define properties. I've just reused property in a different context there. I apologize. So an actual property of the session is defined this way. So you have a property and then a name and then a bunch of annotations here. So again, see this annotation? This is where you'll see things like a permission that says this property is read-only.
Starting point is 00:34:45 And then in this case, this one's actually also required on create, right? So the username, when you create a session, it must be, you must have a username. And then again, you've got a description and long description. And similarly, password has all those same properties as well. A couple of other kind of redfishy-centric things.
Starting point is 00:35:21 We talked, you had a question earlier about where, you know, was there a lot of active management, basically. And I mentioned this notion of actions in here. Actions is a way to represent functionality that doesn't map well to CRUD. And so CRUD, for anyone who's not familiar with that term, is a restful notion of how to create, read, update, delete, basically. But anything that doesn't map well into that notion would be things like reset, right? When you go to, or mapping and masking, or some functionality like that, where it's like I can't just apply it to an object and have a clearly stateful change to it.
Starting point is 00:36:18 There's not a lot of things in the storage space that actually this applies to, but this is a really interesting way that Redfish came up with to say this thing doesn't fit into the model very well. Let's provide an obvious way for that thing to be interjected into the system. So we have this notion of actions. And so they're explicitly called out this way. What they actually map to is a post that, you know, tells the system to go off and do this thing.
Starting point is 00:36:53 And like I said, we don't have very many of them defined at all in Swordfish, but it's a notion that you can add anything you have in your system that you want to add in explicitly. Or even if it's an operation that you could map to something else, but you want to make obvious, you can also use this mechanism. We wouldn't recommend that, but from an OEM perspective, you could do that. And so again, you see property name up here property name up here and then there's this OEM actions down here which I didn't highlight so there's a space down here
Starting point is 00:37:34 in this complex so these complex types are a way to basically define the behaviors of that property. And then there's an OEM actions here, which is where an OEM extending one of these schema can come in and add the action, add their own actions. So there's kind of space.
Starting point is 00:38:08 I didn't see regular OEM in here. Oh, there's not an example in there. In every schema, there's this place. There's an OEM section and an OEM actions so that vendors can come in and basically add additional functionality into every schema. So you don't basically take and create a whole other copy of it. You basically just add your own functionality in to that existing schema.
Starting point is 00:38:39 Okay, so the same, as I said a couple minutes ago, the schema is identical when it's in JSON. It's converted to this, but everything, so we can kind of look through the Redfish schema here and see on this session that all of the same properties and attributes and annotations and everything are converted over. They're just represented in the JSON schema format here.
Starting point is 00:39:13 So you can see all of that, you know, original OData context, ID and type get generated here, and the references are in place. So ID, oh, so here's the OEM section that I just mentioned in Africa to highlight. OEM and ID are actually inherited from resource. That's why we didn't see them explicitly. One of the things you'll notice about the JSON schema is that everything is included explicitly. So anything that's inherited from another schema
Starting point is 00:39:53 will show up explicitly in the JSON schema. You may not see it in the CSTL schema. So, like, you'll see OEM here. You'll see ID. Those came from resource. Description comes from resource. Name comes from resource. So here's a username that we saw earlier.
Starting point is 00:40:15 And so you see the same thing, right? Read only true. We saw that. Read only true. Some of those other attributes and annotations don't necessarily come over because JSON doesn't have a notion of those. Okay. And then here again is the actions, and then it's got that OEM section underneath it.
Starting point is 00:40:44 And, okay, so that was kind of the end of that. So again, we've seen this slide before. Just a reminder, sneha.org slash swordfish. Is anyone getting sick of me saying that yet? Again, if you're interested in joining the TWIG, talk to, let's see, who all is in the TWIG? Raise your hand. All right. There's about four or five in here.
Starting point is 00:41:17 If you're interested in joining the TWIG, participating, talk to any of us, or there are several folks around that, if you're not a member of SNEA, that would love to talk to you about joining SNEA. Again, swordfishforums.com, ask any questions you want to there, or there's also a mechanism, storagemanagement at SNEA.org, you can send us email. All of this information is on SNnea.org. And if you have specific feedback about the SPAC, you can also send that to snea.org. Okay, questions? Thanks for listening.
Starting point is 00:41:57 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. 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.