blob: 85d05c663789084d7c93b8b3de638d05aaec7909 [file] [log] [blame]
Cosmos Nicolaou4e029972014-06-13 14:53:08 -07001package namespace
Jiri Simsa5293dcb2014-05-10 09:56:38 -07002
3import (
Asim Shankarb547ea92015-02-17 18:49:45 -08004 "fmt"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07005 "time"
6
Jiri Simsa6ac95222015-02-23 16:11:49 -08007 "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 Simsa337af232015-02-27 14:36:46 -080013 "v.io/x/lib/vlog"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070014)
15
16// mountIntoMountTable mounts a single server into a single mount table.
Asim Shankarb547ea92015-02-17 18:49:45 -080017func 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 Presottod0289602014-11-18 14:42:19 -080018 s.id = id
Matt Rosencrantz89445a42015-01-05 13:32:37 -080019 ctx, _ = context.WithTimeout(ctx, callTimeout)
Asim Shankarb547ea92015-02-17 18:49:45 -080020 call, err := client.StartCall(ctx, name, "MountX", []interface{}{server, patterns, uint32(ttl.Seconds()), flags}, options.NoResolve{})
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080021 s.err = err
Jiri Simsa5293dcb2014-05-10 09:56:38 -070022 if err != nil {
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080023 return
Jiri Simsa5293dcb2014-05-10 09:56:38 -070024 }
Todd Wange77f9952015-02-18 13:20:50 -080025 s.err = call.Finish()
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080026 return
Jiri Simsa5293dcb2014-05-10 09:56:38 -070027}
28
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -080029// Mount implements Namespace.Mount.
Matt Rosencrantz4f8ac602014-12-29 14:42:48 -080030func (ns *namespace) Mount(ctx *context.T, name, server string, ttl time.Duration, opts ...naming.MountOpt) error {
Mehrdad Afsharicd9852b2014-09-26 11:07:35 -070031 defer vlog.LogCall()()
David Why Use Two When One Will Do Presotto3da1c792014-10-03 11:15:53 -070032
Todd Wang1aa57692014-11-11 13:53:29 -080033 var flags naming.MountFlag
Suharsh Sivakumara26ffa72015-03-03 15:49:57 -080034 var patterns []security.BlessingPattern
David Why Use Two When One Will Do Presotto3da1c792014-10-03 11:15:53 -070035 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 Wang1aa57692014-11-11 13:53:29 -080040 flags |= naming.MountFlag(naming.Replace)
David Why Use Two When One Will Do Presotto3da1c792014-10-03 11:15:53 -070041 }
42 case naming.ServesMountTableOpt:
43 if v {
Todd Wang1aa57692014-11-11 13:53:29 -080044 flags |= naming.MountFlag(naming.MT)
David Why Use Two When One Will Do Presotto3da1c792014-10-03 11:15:53 -070045 }
Asim Shankarb547ea92015-02-17 18:49:45 -080046 case naming.MountedServerBlessingsOpt:
Suharsh Sivakumara26ffa72015-03-03 15:49:57 -080047 patterns = str2pattern([]string(v))
David Why Use Two When One Will Do Presotto3da1c792014-10-03 11:15:53 -070048 }
49 }
Asim Shankarb547ea92015-02-17 18:49:45 -080050 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 Sivakumara26ffa72015-03-03 15:49:57 -080054 patterns = security.DefaultBlessingPatterns(v23.GetPrincipal(ctx))
55 if len(patterns) == 0 {
Asim Shankarb547ea92015-02-17 18:49:45 -080056 return fmt.Errorf("must provide a MountedServerBlessingsOpt")
57 }
Asim Shankarb547ea92015-02-17 18:49:45 -080058 vlog.VI(2).Infof("Mount(%s, %s): No MountedServerBlessingsOpt provided using %v", name, server, patterns)
59 }
Matt Rosencrantzafe49642014-12-05 15:10:56 -080060
Jiri Simsa6ac95222015-02-23 16:11:49 -080061 client := v23.GetClient(ctx)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070062 // Mount the server in all the returned mount tables.
Matt Rosencrantz4f8ac602014-12-29 14:42:48 -080063 f := func(ctx *context.T, mt, id string) status {
Suharsh Sivakumara26ffa72015-03-03 15:49:57 -080064 return mountIntoMountTable(ctx, client, mt, server, patterns, ttl, flags, id)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070065 }
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080066 err := ns.dispatch(ctx, name, f)
Asim Shankarb547ea92015-02-17 18:49:45 -080067 vlog.VI(1).Infof("Mount(%s, %q, %v) -> %v", name, server, patterns, err)
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080068 return err
Jiri Simsa5293dcb2014-05-10 09:56:38 -070069}
70
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -080071// unmountFromMountTable removes a single mounted server from a single mount table.
72func 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 Rosencrantz4f8ac602014-12-29 14:42:48 -080085func (ns *namespace) Unmount(ctx *context.T, name, server string) error {
Mehrdad Afsharicd9852b2014-09-26 11:07:35 -070086 defer vlog.LogCall()()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070087 // Unmount the server from all the mount tables.
Jiri Simsa6ac95222015-02-23 16:11:49 -080088 client := v23.GetClient(ctx)
David Why Use Two When One Will Do Presottod424c212015-02-25 11:05:26 -080089 f := func(ctx *context.T, mt, id string) status {
Matt Rosencrantzafe49642014-12-05 15:10:56 -080090 return unmountFromMountTable(ctx, client, mt, server, id)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070091 }
Matt Rosencrantz1094d062015-01-30 06:43:12 -080092 err := ns.dispatch(ctx, name, f)
David Why Use Two When One Will Do Presottod0289602014-11-18 14:42:19 -080093 vlog.VI(1).Infof("Unmount(%s, %s) -> %v", name, server, err)
94 return err
Jiri Simsa5293dcb2014-05-10 09:56:38 -070095}
Asim Shankarb547ea92015-02-17 18:49:45 -080096
David Why Use Two When One Will Do Presotto18be8b02015-03-02 17:26:25 -080097// deleteFromMountTable deletes a name from a single mount table. If there are any children
98// and deleteSubtree isn't true, nothing is deleted.
99func deleteFromMountTable(ctx *context.T, client ipc.Client, name string, deleteSubtree bool, id string) (s status) {
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -0800100 s.id = id
101 ctx, _ = context.WithTimeout(ctx, callTimeout)
David Why Use Two When One Will Do Presotto18be8b02015-03-02 17:26:25 -0800102 call, err := client.StartCall(ctx, name, "Delete", []interface{}{deleteSubtree}, options.NoResolve{})
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -0800103 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 Presotto18be8b02015-03-02 17:26:25 -0800111// RDeleteemove implements Namespace.Delete.
112func (ns *namespace) Delete(ctx *context.T, name string, deleteSubtree bool) error {
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -0800113 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 Presotto18be8b02015-03-02 17:26:25 -0800117 return deleteFromMountTable(ctx, client, mt, deleteSubtree, id)
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -0800118 }
119 err := ns.dispatch(ctx, name, f)
David Why Use Two When One Will Do Presotto18be8b02015-03-02 17:26:25 -0800120 vlog.VI(1).Infof("Remove(%s, %v) -> %v", name, deleteSubtree, err)
David Why Use Two When One Will Do Presotto8e521e02015-03-02 14:32:30 -0800121 return err
122}
123
Asim Shankarb547ea92015-02-17 18:49:45 -0800124func 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}