container: repeat and impossible state types
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Test / Create distribution (push) Successful in 34s
				
			
		
			
				
	
				Test / Sandbox (push) Successful in 1m45s
				
			
		
			
				
	
				Test / Hakurei (push) Successful in 3m18s
				
			
		
			
				
	
				Test / Hpkg (push) Successful in 3m35s
				
			
		
			
				
	
				Test / Sandbox (race detector) (push) Successful in 3m57s
				
			
		
			
				
	
				Test / Hakurei (race detector) (push) Successful in 5m13s
				
			
		
			
				
	
				Test / Flake checks (push) Successful in 1m36s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 1m45s
				
			Test / Hakurei (push) Successful in 3m18s
				
			Test / Hpkg (push) Successful in 3m35s
				
			Test / Sandbox (race detector) (push) Successful in 3m57s
				
			Test / Hakurei (race detector) (push) Successful in 5m13s
				
			Test / Flake checks (push) Successful in 1m36s
				
			This moves repeated Op errors and impossible internal state errors off of msg. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
		
							parent
							
								
									84ad9791e2
								
							
						
					
					
						commit
						a462341a0a
					
				| @ -3,7 +3,6 @@ package container | ||||
| import ( | ||||
| 	"encoding/gob" | ||||
| 	"fmt" | ||||
| 	"io/fs" | ||||
| ) | ||||
| 
 | ||||
| func init() { gob.Register(new(AutoEtcOp)) } | ||||
| @ -24,7 +23,7 @@ func (e *AutoEtcOp) Valid() bool                                { return e != ni | ||||
| func (e *AutoEtcOp) early(*setupState, syscallDispatcher) error { return nil } | ||||
| func (e *AutoEtcOp) apply(state *setupState, k syscallDispatcher) error { | ||||
| 	if state.nonrepeatable&nrAutoEtc != 0 { | ||||
| 		return msg.WrapErr(fs.ErrInvalid, "autoetc is not repeatable") | ||||
| 		return OpRepeatError("autoetc") | ||||
| 	} | ||||
| 	state.nonrepeatable |= nrAutoEtc | ||||
| 
 | ||||
|  | ||||
| @ -2,14 +2,13 @@ package container | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io/fs" | ||||
| 	"os" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestAutoEtcOp(t *testing.T) { | ||||
| 	t.Run("nonrepeatable", func(t *testing.T) { | ||||
| 		wantErr := msg.WrapErr(fs.ErrInvalid, "autoetc is not repeatable") | ||||
| 		wantErr := OpRepeatError("autoetc") | ||||
| 		if err := (&AutoEtcOp{Prefix: "81ceabb30d37bbdb3868004629cb84e9"}).apply(&setupState{nonrepeatable: nrAutoEtc}, nil); !errors.Is(err, wantErr) { | ||||
| 			t.Errorf("apply: error = %v, want %v", err, wantErr) | ||||
| 		} | ||||
|  | ||||
| @ -3,7 +3,6 @@ package container | ||||
| import ( | ||||
| 	"encoding/gob" | ||||
| 	"fmt" | ||||
| 	"io/fs" | ||||
| ) | ||||
| 
 | ||||
| func init() { gob.Register(new(AutoRootOp)) } | ||||
| @ -53,7 +52,7 @@ func (r *AutoRootOp) early(state *setupState, k syscallDispatcher) error { | ||||
| 
 | ||||
| func (r *AutoRootOp) apply(state *setupState, k syscallDispatcher) error { | ||||
| 	if state.nonrepeatable&nrAutoRoot != 0 { | ||||
| 		return msg.WrapErr(fs.ErrInvalid, "autoroot is not repeatable") | ||||
| 		return OpRepeatError("autoroot") | ||||
| 	} | ||||
| 	state.nonrepeatable |= nrAutoRoot | ||||
| 
 | ||||
|  | ||||
| @ -2,14 +2,13 @@ package container | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io/fs" | ||||
| 	"os" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestAutoRootOp(t *testing.T) { | ||||
| 	t.Run("nonrepeatable", func(t *testing.T) { | ||||
| 		wantErr := msg.WrapErr(fs.ErrInvalid, "autoroot is not repeatable") | ||||
| 		wantErr := OpRepeatError("autoroot") | ||||
| 		if err := new(AutoRootOp).apply(&setupState{nonrepeatable: nrAutoRoot}, nil); !errors.Is(err, wantErr) { | ||||
| 			t.Errorf("apply: error = %v, want %v", err, wantErr) | ||||
| 		} | ||||
|  | ||||
| @ -68,6 +68,16 @@ const ( | ||||
| 	nrAutoRoot | ||||
| ) | ||||
| 
 | ||||
| // OpRepeatError is returned applying a repeated nonrepeatable [Op]. | ||||
| type OpRepeatError string | ||||
| 
 | ||||
| func (e OpRepeatError) Error() string { return string(e) + " is not repeatable" } | ||||
| 
 | ||||
| // OpStateError indicates an impossible internal state has been reached in an [Op]. | ||||
| type OpStateError string | ||||
| 
 | ||||
| func (o OpStateError) Error() string { return "impossible " + string(o) + " state reached" } | ||||
| 
 | ||||
| // initParams are params passed from parent. | ||||
| type initParams struct { | ||||
| 	Params | ||||
|  | ||||
| @ -63,7 +63,7 @@ func (b *BindMountOp) apply(_ *setupState, k syscallDispatcher) error { | ||||
| 	if b.sourceFinal == nil { | ||||
| 		if b.Flags&BindOptional == 0 { | ||||
| 			// unreachable | ||||
| 			return msg.WrapErr(os.ErrClosed, "impossible bind state reached") | ||||
| 			return OpStateError("bind") | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| @ -143,7 +143,7 @@ func TestBindMountOp(t *testing.T) { | ||||
| 
 | ||||
| 	t.Run("unreachable", func(t *testing.T) { | ||||
| 		t.Run("nil sourceFinal not optional", func(t *testing.T) { | ||||
| 			wantErr := msg.WrapErr(os.ErrClosed, "impossible bind state reached") | ||||
| 			wantErr := OpStateError("bind") | ||||
| 			if err := new(BindMountOp).apply(nil, nil); !errors.Is(err, wantErr) { | ||||
| 				t.Errorf("apply: error = %v, want %v", err, wantErr) | ||||
| 			} | ||||
|  | ||||
| @ -97,7 +97,7 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error { | ||||
| 	if !o.ephemeral { | ||||
| 		if o.Upper != o.Work && (o.Upper == nil || o.Work == nil) { | ||||
| 			// unreachable | ||||
| 			return msg.WrapErr(fs.ErrClosed, "impossible overlay state reached") | ||||
| 			return OpStateError("overlay") | ||||
| 		} | ||||
| 
 | ||||
| 		if o.Upper != nil { | ||||
|  | ||||
| @ -242,7 +242,7 @@ func TestMountOverlayOp(t *testing.T) { | ||||
| 
 | ||||
| 	t.Run("unreachable", func(t *testing.T) { | ||||
| 		t.Run("nil Upper non-nil Work not ephemeral", func(t *testing.T) { | ||||
| 			wantErr := msg.WrapErr(fs.ErrClosed, "impossible overlay state reached") | ||||
| 			wantErr := OpStateError("overlay") | ||||
| 			if err := (&MountOverlayOp{ | ||||
| 				Work: MustAbs("/"), | ||||
| 			}).early(nil, nil); !errors.Is(err, wantErr) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user