Cosmos Nicolaou | 4e02997 | 2014-06-13 14:53:08 -0700 | [diff] [blame] | 1 | package namespace |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 2 | |
| 3 | import ( |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 4 | "fmt" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 5 | "time" |
| 6 | |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 7 | "v.io/v23" |
| 8 | "v.io/v23/context" |
| 9 | "v.io/v23/ipc" |
| 10 | "v.io/v23/naming" |
| 11 | "v.io/v23/options" |
| 12 | "v.io/v23/security" |
Jiri Simsa | 337af23 | 2015-02-27 14:36:46 -0800 | [diff] [blame] | 13 | "v.io/x/lib/vlog" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 14 | ) |
| 15 | |
| 16 | // mountIntoMountTable mounts a single server into a single mount table. |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 17 | func mountIntoMountTable(ctx *context.T, client ipc.Client, name, server string, patterns []security.BlessingPattern, ttl time.Duration, flags naming.MountFlag, id string) (s status) { |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 18 | s.id = id |
Matt Rosencrantz | 89445a4 | 2015-01-05 13:32:37 -0800 | [diff] [blame] | 19 | ctx, _ = context.WithTimeout(ctx, callTimeout) |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 20 | call, err := client.StartCall(ctx, name, "MountX", []interface{}{server, patterns, uint32(ttl.Seconds()), flags}, options.NoResolve{}) |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 21 | s.err = err |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 22 | if err != nil { |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 23 | return |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 24 | } |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 25 | s.err = call.Finish() |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 26 | return |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 27 | } |
| 28 | |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 29 | // Mount implements Namespace.Mount. |
Matt Rosencrantz | 4f8ac60 | 2014-12-29 14:42:48 -0800 | [diff] [blame] | 30 | func (ns *namespace) Mount(ctx *context.T, name, server string, ttl time.Duration, opts ...naming.MountOpt) error { |
Mehrdad Afshari | cd9852b | 2014-09-26 11:07:35 -0700 | [diff] [blame] | 31 | defer vlog.LogCall()() |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 32 | |
Todd Wang | 1aa5769 | 2014-11-11 13:53:29 -0800 | [diff] [blame] | 33 | var flags naming.MountFlag |
Suharsh Sivakumar | a26ffa7 | 2015-03-03 15:49:57 -0800 | [diff] [blame] | 34 | var patterns []security.BlessingPattern |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 35 | for _, o := range opts { |
| 36 | // NB: used a switch since we'll be adding more options. |
| 37 | switch v := o.(type) { |
| 38 | case naming.ReplaceMountOpt: |
| 39 | if v { |
Todd Wang | 1aa5769 | 2014-11-11 13:53:29 -0800 | [diff] [blame] | 40 | flags |= naming.MountFlag(naming.Replace) |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 41 | } |
| 42 | case naming.ServesMountTableOpt: |
| 43 | if v { |
Todd Wang | 1aa5769 | 2014-11-11 13:53:29 -0800 | [diff] [blame] | 44 | flags |= naming.MountFlag(naming.MT) |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 45 | } |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 46 | case naming.MountedServerBlessingsOpt: |
Suharsh Sivakumar | a26ffa7 | 2015-03-03 15:49:57 -0800 | [diff] [blame] | 47 | patterns = str2pattern([]string(v)) |
David Why Use Two When One Will Do Presotto | 3da1c79 | 2014-10-03 11:15:53 -0700 | [diff] [blame] | 48 | } |
| 49 | } |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 50 | if len(patterns) == 0 { |
| 51 | // No patterns explicitly provided. Take the conservative |
| 52 | // approach that the server being mounted is run by this local |
| 53 | // process. |
Suharsh Sivakumar | a26ffa7 | 2015-03-03 15:49:57 -0800 | [diff] [blame] | 54 | patterns = security.DefaultBlessingPatterns(v23.GetPrincipal(ctx)) |
| 55 | if len(patterns) == 0 { |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 56 | return fmt.Errorf("must provide a MountedServerBlessingsOpt") |
| 57 | } |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 58 | vlog.VI(2).Infof("Mount(%s, %s): No MountedServerBlessingsOpt provided using %v", name, server, patterns) |
| 59 | } |
Matt Rosencrantz | afe4964 | 2014-12-05 15:10:56 -0800 | [diff] [blame] | 60 | |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 61 | client := v23.GetClient(ctx) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 62 | // Mount the server in all the returned mount tables. |
Matt Rosencrantz | 4f8ac60 | 2014-12-29 14:42:48 -0800 | [diff] [blame] | 63 | f := func(ctx *context.T, mt, id string) status { |
Suharsh Sivakumar | a26ffa7 | 2015-03-03 15:49:57 -0800 | [diff] [blame] | 64 | return mountIntoMountTable(ctx, client, mt, server, patterns, ttl, flags, id) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 65 | } |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 66 | err := ns.dispatch(ctx, name, f) |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 67 | vlog.VI(1).Infof("Mount(%s, %q, %v) -> %v", name, server, patterns, err) |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 68 | return err |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 69 | } |
| 70 | |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 71 | // unmountFromMountTable removes a single mounted server from a single mount table. |
| 72 | func unmountFromMountTable(ctx *context.T, client ipc.Client, name, server string, id string) (s status) { |
| 73 | s.id = id |
| 74 | ctx, _ = context.WithTimeout(ctx, callTimeout) |
| 75 | call, err := client.StartCall(ctx, name, "Unmount", []interface{}{server}, options.NoResolve{}) |
| 76 | s.err = err |
| 77 | if err != nil { |
| 78 | return |
| 79 | } |
| 80 | s.err = call.Finish() |
| 81 | return |
| 82 | } |
| 83 | |
| 84 | // Unmount implements Namespace.Unmount. |
Matt Rosencrantz | 4f8ac60 | 2014-12-29 14:42:48 -0800 | [diff] [blame] | 85 | func (ns *namespace) Unmount(ctx *context.T, name, server string) error { |
Mehrdad Afshari | cd9852b | 2014-09-26 11:07:35 -0700 | [diff] [blame] | 86 | defer vlog.LogCall()() |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 87 | // Unmount the server from all the mount tables. |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 88 | client := v23.GetClient(ctx) |
David Why Use Two When One Will Do Presotto | d424c21 | 2015-02-25 11:05:26 -0800 | [diff] [blame] | 89 | f := func(ctx *context.T, mt, id string) status { |
Matt Rosencrantz | afe4964 | 2014-12-05 15:10:56 -0800 | [diff] [blame] | 90 | return unmountFromMountTable(ctx, client, mt, server, id) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 91 | } |
Matt Rosencrantz | 1094d06 | 2015-01-30 06:43:12 -0800 | [diff] [blame] | 92 | err := ns.dispatch(ctx, name, f) |
David Why Use Two When One Will Do Presotto | d028960 | 2014-11-18 14:42:19 -0800 | [diff] [blame] | 93 | vlog.VI(1).Infof("Unmount(%s, %s) -> %v", name, server, err) |
| 94 | return err |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 95 | } |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 96 | |
David Why Use Two When One Will Do Presotto | 18be8b0 | 2015-03-02 17:26:25 -0800 | [diff] [blame] | 97 | // deleteFromMountTable deletes a name from a single mount table. If there are any children |
| 98 | // and deleteSubtree isn't true, nothing is deleted. |
| 99 | func deleteFromMountTable(ctx *context.T, client ipc.Client, name string, deleteSubtree bool, id string) (s status) { |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 100 | s.id = id |
| 101 | ctx, _ = context.WithTimeout(ctx, callTimeout) |
David Why Use Two When One Will Do Presotto | 18be8b0 | 2015-03-02 17:26:25 -0800 | [diff] [blame] | 102 | call, err := client.StartCall(ctx, name, "Delete", []interface{}{deleteSubtree}, options.NoResolve{}) |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 103 | s.err = err |
| 104 | if err != nil { |
| 105 | return |
| 106 | } |
| 107 | s.err = call.Finish() |
| 108 | return |
| 109 | } |
| 110 | |
David Why Use Two When One Will Do Presotto | 18be8b0 | 2015-03-02 17:26:25 -0800 | [diff] [blame] | 111 | // RDeleteemove implements Namespace.Delete. |
| 112 | func (ns *namespace) Delete(ctx *context.T, name string, deleteSubtree bool) error { |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 113 | defer vlog.LogCall()() |
| 114 | // Remove from all the mount tables. |
| 115 | client := v23.GetClient(ctx) |
| 116 | f := func(ctx *context.T, mt, id string) status { |
David Why Use Two When One Will Do Presotto | 18be8b0 | 2015-03-02 17:26:25 -0800 | [diff] [blame] | 117 | return deleteFromMountTable(ctx, client, mt, deleteSubtree, id) |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 118 | } |
| 119 | err := ns.dispatch(ctx, name, f) |
David Why Use Two When One Will Do Presotto | 18be8b0 | 2015-03-02 17:26:25 -0800 | [diff] [blame] | 120 | vlog.VI(1).Infof("Remove(%s, %v) -> %v", name, deleteSubtree, err) |
David Why Use Two When One Will Do Presotto | 8e521e0 | 2015-03-02 14:32:30 -0800 | [diff] [blame] | 121 | return err |
| 122 | } |
| 123 | |
Asim Shankar | b547ea9 | 2015-02-17 18:49:45 -0800 | [diff] [blame] | 124 | func str2pattern(strs []string) (ret []security.BlessingPattern) { |
| 125 | ret = make([]security.BlessingPattern, len(strs)) |
| 126 | for i, s := range strs { |
| 127 | ret[i] = security.BlessingPattern(s) |
| 128 | } |
| 129 | return |
| 130 | } |