1package api
2
3import (
4	"context"
5	"errors"
6)
7
8func (c *Sys) Renew(id string, increment int) (*Secret, error) {
9	r := c.c.NewRequest("PUT", "/v1/sys/leases/renew")
10
11	body := map[string]interface{}{
12		"increment": increment,
13		"lease_id":  id,
14	}
15	if err := r.SetJSONBody(body); err != nil {
16		return nil, err
17	}
18
19	ctx, cancelFunc := context.WithCancel(context.Background())
20	defer cancelFunc()
21	resp, err := c.c.RawRequestWithContext(ctx, r)
22	if err != nil {
23		return nil, err
24	}
25	defer resp.Body.Close()
26
27	return ParseSecret(resp.Body)
28}
29
30func (c *Sys) Revoke(id string) error {
31	r := c.c.NewRequest("PUT", "/v1/sys/leases/revoke")
32	body := map[string]interface{}{
33		"lease_id": id,
34	}
35	if err := r.SetJSONBody(body); err != nil {
36		return err
37	}
38
39	ctx, cancelFunc := context.WithCancel(context.Background())
40	defer cancelFunc()
41	resp, err := c.c.RawRequestWithContext(ctx, r)
42	if err == nil {
43		defer resp.Body.Close()
44	}
45	return err
46}
47
48func (c *Sys) RevokePrefix(id string) error {
49	r := c.c.NewRequest("PUT", "/v1/sys/leases/revoke-prefix/"+id)
50
51	ctx, cancelFunc := context.WithCancel(context.Background())
52	defer cancelFunc()
53	resp, err := c.c.RawRequestWithContext(ctx, r)
54	if err == nil {
55		defer resp.Body.Close()
56	}
57	return err
58}
59
60func (c *Sys) RevokeForce(id string) error {
61	r := c.c.NewRequest("PUT", "/v1/sys/leases/revoke-force/"+id)
62
63	ctx, cancelFunc := context.WithCancel(context.Background())
64	defer cancelFunc()
65	resp, err := c.c.RawRequestWithContext(ctx, r)
66	if err == nil {
67		defer resp.Body.Close()
68	}
69	return err
70}
71
72func (c *Sys) RevokeWithOptions(opts *RevokeOptions) error {
73	if opts == nil {
74		return errors.New("nil options provided")
75	}
76
77	// Construct path
78	path := "/v1/sys/leases/revoke/"
79	switch {
80	case opts.Force:
81		path = "/v1/sys/leases/revoke-force/"
82	case opts.Prefix:
83		path = "/v1/sys/leases/revoke-prefix/"
84	}
85	path += opts.LeaseID
86
87	r := c.c.NewRequest("PUT", path)
88	if !opts.Force {
89		body := map[string]interface{}{
90			"sync": opts.Sync,
91		}
92		if err := r.SetJSONBody(body); err != nil {
93			return err
94		}
95	}
96
97	ctx, cancelFunc := context.WithCancel(context.Background())
98	defer cancelFunc()
99	resp, err := c.c.RawRequestWithContext(ctx, r)
100	if err == nil {
101		defer resp.Body.Close()
102	}
103	return err
104}
105
106type RevokeOptions struct {
107	LeaseID string
108	Force   bool
109	Prefix  bool
110	Sync    bool
111}
112