Skip to content

Commit 2343451

Browse files
ccushingcodycushing
authored andcommitted
Final v2.0.0 updates
* add oci-tool source * update readme with wiki links
1 parent 9f09841 commit 2343451

File tree

8 files changed

+1226
-3
lines changed

8 files changed

+1226
-3
lines changed

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## NOTICE
2+
**The terraform provider has been renamed, see [this wiki](https://github.com/oracle/terraform-provider-oci/wiki/Oracle-Terraform-Provider-Name-Change) for information on migration steps.**
3+
4+
*Legacy provider documentation (for v1.0.18 and earlier) can be found [here](https://github.com/oracle/terraform-provider-oci/tree/v1.0.18/docs)*
5+
6+
17
# ___ ____ _ ____ _ _____
28
# / _ \| _ \ / \ / ___| | | ____|
39
# | | | | |_) | / _ \| | | | | _|
@@ -129,6 +135,3 @@ https://community.oracle.com/community/cloud_computing/bare-metal
129135

130136
## About the provider
131137
This provider was written on behalf of Oracle by [MustWin.](http://mustwin.com/)
132-
133-
## Documentation and examples for v1.0.18 (when the provider's name was "baremetal") can be found here:
134-
https://github.com/oracle/terraform-provider-oci/tree/v1.0.18/docs

tools/oci-tool/Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
default: build
3+
4+
build:
5+
go build -o oci-tool
6+
7+
clean:
8+
rm -rf oci-tool
9+
rm -rf bin/*
10+
11+
release: clean
12+
gox -osarch="darwin/amd64 linux/amd64 windows/amd64" -output "./bin/{{.OS}}_{{.Arch}}/oci-tool"
13+
14+
zip:
15+
cd bin && zip -r oci-tool.zip windows_amd64 darwin_amd64 linux_amd64
16+
17+
.PHONY: build clean release zip

tools/oci-tool/actions.go

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
// Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
2+
3+
package oci_tool
4+
5+
import (
6+
"bufio"
7+
"fmt"
8+
"io"
9+
"io/ioutil"
10+
"os"
11+
"path"
12+
"path/filepath"
13+
)
14+
15+
// Individual file io strategies for different operations
16+
type FileAction func(string, string) error
17+
18+
// Traverse a directory, executing the supplied FileAction on each file
19+
func ProcessDirectory(targetDir string, backupDir string, fileActionFn FileAction, targetExtns ...string) (err error) {
20+
21+
_, err = os.Stat(targetDir)
22+
23+
if err != nil {
24+
return fmt.Errorf("Error reading directory\n %s", err)
25+
}
26+
27+
files, err := ioutil.ReadDir(targetDir)
28+
29+
if err != nil {
30+
fmt.Errorf("Error reading directory contents \n %s", err)
31+
}
32+
33+
for _, res := range files {
34+
targetRes := path.Join(targetDir, res.Name())
35+
backupRes := path.Join(backupDir, res.Name())
36+
37+
if res.IsDir() {
38+
err = ProcessDirectory(targetRes, backupRes, fileActionFn, targetExtns...)
39+
40+
if err != nil {
41+
return err
42+
}
43+
} else {
44+
if len(targetExtns) == 0 {
45+
err = fileActionFn(targetRes, backupRes)
46+
47+
if err != nil {
48+
return err
49+
}
50+
} else {
51+
if contains(targetExtns, filepath.Ext(res.Name())) {
52+
err = fileActionFn(targetRes, backupRes)
53+
54+
if err != nil {
55+
return err
56+
}
57+
} else {
58+
fmt.Println("Skipping: ", targetDir)
59+
}
60+
}
61+
}
62+
}
63+
64+
return
65+
}
66+
67+
// Copy file from targetFile path to backupFile path
68+
func CopyFile(targetFile string, backupFile string) (err error) {
69+
70+
// make sure directory structure exists
71+
bkDir := path.Dir(backupFile)
72+
_, err = os.Stat(bkDir)
73+
74+
if err != nil {
75+
if os.IsNotExist(err) {
76+
oDir := path.Dir(targetFile)
77+
fi, err := os.Stat(oDir)
78+
79+
if err != nil {
80+
return fmt.Errorf("Error reading original directory %s", err)
81+
}
82+
83+
err = os.MkdirAll(bkDir, fi.Mode())
84+
85+
if err != nil {
86+
return fmt.Errorf("Error creating directory for file %s", err)
87+
}
88+
} else {
89+
return fmt.Errorf("Unexpected error reading original directory %s", err)
90+
}
91+
}
92+
93+
src, err := os.Open(targetFile)
94+
95+
if err != nil {
96+
return fmt.Errorf("Error reading original file\n %s", err)
97+
}
98+
99+
defer src.Close()
100+
101+
dst, err := os.Create(backupFile)
102+
103+
if err != nil {
104+
return fmt.Errorf("Error creating backup file\n %s", err)
105+
}
106+
107+
defer dst.Close()
108+
109+
fmt.Printf("Copying %s --> %s", targetFile, backupFile)
110+
size, err := io.Copy(dst, src)
111+
112+
if err != nil {
113+
return fmt.Errorf("Error writing file\n %s", err)
114+
}
115+
116+
fmt.Printf(", %d bytes\n", size)
117+
return
118+
}
119+
120+
// Read file from backup location, apply transforms and overwrite original file
121+
func MigratePlanFile(targetFile string, backupFile string) (err error) {
122+
src, err := os.Open(backupFile)
123+
124+
if err != nil {
125+
return fmt.Errorf("Error reading file\n %s", err)
126+
}
127+
128+
defer src.Close()
129+
130+
dst, err := os.Create(targetFile)
131+
132+
if err != nil {
133+
return fmt.Errorf("Error creating write location\n %s", err)
134+
}
135+
136+
defer dst.Close()
137+
138+
wrtr := bufio.NewWriter(dst)
139+
140+
var replaceStrategy func(string) string
141+
if filepath.Ext(backupFile) == ".tf" {
142+
replaceStrategy = replaceTemplateTokens
143+
} else {
144+
replaceStrategy = replaceStatefileTokens
145+
}
146+
147+
scanner := bufio.NewScanner(src)
148+
for scanner.Scan() {
149+
str := scanner.Text()
150+
str = replaceStrategy(str)
151+
fmt.Fprintln(wrtr, str)
152+
}
153+
wrtr.Flush()
154+
155+
return
156+
}
157+
158+
// Scan TF files for provider blocks and inject a region value if not specified
159+
func AddRegionToProvider(targetFile string, backupFile string) error {
160+
fmt.Printf("Scanning %s\n", targetFile)
161+
162+
fileInfo, err := os.Stat(targetFile)
163+
164+
const maxSize = 1024 * 1024
165+
if fileInfo.Size() > maxSize {
166+
return fmt.Errorf("File too large to process")
167+
}
168+
169+
fileBytes, err := ioutil.ReadFile(targetFile)
170+
str, err := scanAndUpdateProvider(string(fileBytes))
171+
172+
if err != nil {
173+
return fmt.Errorf("Error updating provider block\n %s", err)
174+
}
175+
176+
ioutil.WriteFile(targetFile, []byte(str), fileInfo.Mode())
177+
178+
return err
179+
}
180+
181+
// find a string in a slice of strings
182+
func contains(items []string, target string) bool {
183+
for _, item := range items {
184+
if item == target {
185+
return true
186+
}
187+
}
188+
return false
189+
}

tools/oci-tool/commands.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
2+
3+
package oci_tool
4+
5+
import (
6+
"fmt"
7+
"os"
8+
)
9+
10+
// Copy target directory and append .backup
11+
func CreateBackup(targetDir string, backupDir string) (err error) {
12+
fmt.Println("Creating backup...", targetDir, "-->", backupDir)
13+
14+
fi, err := os.Stat(targetDir)
15+
16+
if err != nil {
17+
return fmt.Errorf("Error reading directory\n %s", err)
18+
}
19+
20+
if !fi.IsDir() {
21+
return fmt.Errorf("File targeted for migration")
22+
}
23+
24+
_, err = os.Stat(backupDir)
25+
26+
if err == nil {
27+
return fmt.Errorf("Attempting to overwrite backups")
28+
}
29+
30+
fmt.Println("Copying", targetDir, "-->", backupDir)
31+
32+
err = ProcessDirectory(targetDir, backupDir, CopyFile)
33+
34+
if err != nil {
35+
return err
36+
}
37+
38+
bfi, err := os.Stat(backupDir)
39+
40+
if fi.Size() != bfi.Size() {
41+
return fmt.Errorf("Backup corrupt")
42+
}
43+
44+
fmt.Println("Complete")
45+
return
46+
}
47+
48+
// Overwrite target directory with contents of .backup directory
49+
func RestoreBackup(backupDir string, targetDir string) (err error) {
50+
fmt.Println("Restoring from backup...")
51+
52+
fi, err := os.Stat(backupDir)
53+
54+
if err != nil {
55+
return fmt.Errorf("Error reading backup\n %s", err)
56+
}
57+
58+
err = os.RemoveAll(targetDir)
59+
60+
if err != nil {
61+
return fmt.Errorf("Error removing original directory\n %s", err)
62+
}
63+
64+
os.MkdirAll(targetDir, fi.Mode())
65+
66+
err = ProcessDirectory(backupDir, targetDir, CopyFile)
67+
68+
if err != nil {
69+
return fmt.Errorf("Error restoring from backup directory\n %s", err)
70+
}
71+
72+
fmt.Println("Complete")
73+
return
74+
}
75+
76+
// Remove .backup directory
77+
func DeleteBackup(backupDir string) (err error) {
78+
fmt.Println("Purging backup...")
79+
80+
err = os.RemoveAll(backupDir)
81+
82+
if err != nil {
83+
return fmt.Errorf("Error removing backup directory\n %s", err)
84+
}
85+
86+
fmt.Println("Complete")
87+
return
88+
}
89+
90+
// Traverse all .tf files and apply transforms
91+
func Migrate(targetDir string, backupDir string) (err error) {
92+
fmt.Println("Migrating plan directory...")
93+
err = CreateBackup(targetDir, backupDir)
94+
95+
if err != nil {
96+
return fmt.Errorf("Error backing up directory before migration\n %s", err)
97+
}
98+
99+
err = ProcessDirectory(targetDir, backupDir, MigratePlanFile, ".tf", ".tfstate")
100+
101+
if err != nil {
102+
return fmt.Errorf("Error removing backup directory\n %s", err)
103+
}
104+
105+
fmt.Println("Complete")
106+
return
107+
}
108+
109+
// Traverse all .tf files and insert `region = "us-phoenix-1"` where region is not specified
110+
func AddRegionField(targetDir string, backupDir string) (err error) {
111+
fmt.Println("Scanning plans for providers missing region value...")
112+
113+
err = ProcessDirectory(targetDir, backupDir, AddRegionToProvider, ".tf")
114+
115+
if err != nil {
116+
return fmt.Errorf("Error scanning providers for missing region value\n %s", err)
117+
}
118+
119+
fmt.Println("Complete")
120+
return
121+
}

0 commit comments

Comments
 (0)