Prechádzať zdrojové kódy

rename storagev2 => filemanager

Signed-off-by: r2k1 <yokree@gmail.com>
r2k1 3 rokov pred
rodič
commit
cab21a8ad2

+ 2 - 2
pkg/cmd/costmodel/costmodel.go

@@ -13,9 +13,9 @@ import (
 	"github.com/opencost/opencost/pkg/costmodel"
 	"github.com/opencost/opencost/pkg/costmodel"
 	"github.com/opencost/opencost/pkg/env"
 	"github.com/opencost/opencost/pkg/env"
 	"github.com/opencost/opencost/pkg/errors"
 	"github.com/opencost/opencost/pkg/errors"
+	"github.com/opencost/opencost/pkg/filemanager"
 	"github.com/opencost/opencost/pkg/log"
 	"github.com/opencost/opencost/pkg/log"
 	"github.com/opencost/opencost/pkg/metrics"
 	"github.com/opencost/opencost/pkg/metrics"
-	"github.com/opencost/opencost/pkg/storagev2"
 	"github.com/opencost/opencost/pkg/version"
 	"github.com/opencost/opencost/pkg/version"
 )
 )
 
 
@@ -55,7 +55,7 @@ func StartExportWorker(ctx context.Context, model costmodel.AllocationModel) {
 		return
 		return
 	}
 	}
 
 
-	fm, err := storagev2.NewFileManager(exportPath)
+	fm, err := filemanager.NewFileManager(exportPath)
 	if err != nil {
 	if err != nil {
 		log.Errorf("could not start CSV exporter", err)
 		log.Errorf("could not start CSV exporter", err)
 		return
 		return

+ 7 - 7
pkg/costmodel/csv_export.go

@@ -11,9 +11,9 @@ import (
 	"strconv"
 	"strconv"
 	"time"
 	"time"
 
 
+	"github.com/opencost/opencost/pkg/filemanager"
 	"github.com/opencost/opencost/pkg/kubecost"
 	"github.com/opencost/opencost/pkg/kubecost"
 	"github.com/opencost/opencost/pkg/log"
 	"github.com/opencost/opencost/pkg/log"
-	"github.com/opencost/opencost/pkg/storagev2"
 )
 )
 
 
 type AllocationModel interface {
 type AllocationModel interface {
@@ -23,7 +23,7 @@ type AllocationModel interface {
 
 
 var errNoData = errors.New("no data")
 var errNoData = errors.New("no data")
 
 
-func UpdateCSV(ctx context.Context, fileManager storagev2.FileManager, model AllocationModel) error {
+func UpdateCSV(ctx context.Context, fileManager filemanager.FileManager, model AllocationModel) error {
 	exporter := &csvExporter{
 	exporter := &csvExporter{
 		FileManager: fileManager,
 		FileManager: fileManager,
 		Model:       model,
 		Model:       model,
@@ -32,7 +32,7 @@ func UpdateCSV(ctx context.Context, fileManager storagev2.FileManager, model All
 }
 }
 
 
 type csvExporter struct {
 type csvExporter struct {
-	FileManager storagev2.FileManager
+	FileManager filemanager.FileManager
 	Model       AllocationModel
 	Model       AllocationModel
 }
 }
 
 
@@ -47,13 +47,13 @@ func (e *csvExporter) Update(ctx context.Context) error {
 		return errors.New("no data to export from prometheus")
 		return errors.New("no data to export from prometheus")
 	}
 	}
 
 
-	resultTmp, err := os.CreateTemp("opencost", "export-*.csv")
+	resultTmp, err := os.CreateTemp("", "opencost-export-*.csv")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 	defer closeAndDelete(resultTmp)
 	defer closeAndDelete(resultTmp)
 
 
-	previousExportTmp, err := os.CreateTemp("opencost", "previous-export-*.csv")
+	previousExportTmp, err := os.CreateTemp("", "opencost-previous-export-*.csv")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -61,7 +61,7 @@ func (e *csvExporter) Update(ctx context.Context) error {
 
 
 	err = e.FileManager.Download(ctx, previousExportTmp)
 	err = e.FileManager.Download(ctx, previousExportTmp)
 	switch {
 	switch {
-	case errors.Is(err, storagev2.ErrNotFound):
+	case errors.Is(err, filemanager.ErrNotFound):
 		// there is no previous file, so we need to create it
 		// there is no previous file, so we need to create it
 		err := e.writeCSVToWriter(ctx, resultTmp, mapTimeToSlice(allocationDates))
 		err := e.writeCSVToWriter(ctx, resultTmp, mapTimeToSlice(allocationDates))
 		if err != nil {
 		if err != nil {
@@ -110,7 +110,7 @@ func (e *csvExporter) updateExportCSV(ctx context.Context, previousExportTmp *os
 		return nil
 		return nil
 	}
 	}
 
 
-	newExportTmp, err := os.CreateTemp("opencost", "new-export-*.csv")
+	newExportTmp, err := os.CreateTemp("", "opencost-new-export-*.csv")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 5 - 5
pkg/costmodel/csv_export_test.go

@@ -8,8 +8,8 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"github.com/stretchr/testify/require"
 
 
+	"github.com/opencost/opencost/pkg/filemanager"
 	"github.com/opencost/opencost/pkg/kubecost"
 	"github.com/opencost/opencost/pkg/kubecost"
-	"github.com/opencost/opencost/pkg/storagev2"
 )
 )
 
 
 //go:generate moq -out moq_cloud_storage_test.go . CloudStorage:CloudStorageMock
 //go:generate moq -out moq_cloud_storage_test.go . CloudStorage:CloudStorageMock
@@ -17,7 +17,7 @@ import (
 
 
 func Test_UpdateCSV(t *testing.T) {
 func Test_UpdateCSV(t *testing.T) {
 	t.Run("previous data doesn't exist, upload new data", func(t *testing.T) {
 	t.Run("previous data doesn't exist, upload new data", func(t *testing.T) {
-		storage := &storagev2.InMemoryFile{}
+		storage := &filemanager.InMemoryFile{}
 		model := &AllocationModelMock{
 		model := &AllocationModelMock{
 			DateRangeFunc: func() (time.Time, time.Time, error) {
 			DateRangeFunc: func() (time.Time, time.Time, error) {
 				return time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2021, 1, 2, 0, 0, 0, 0, time.UTC), nil
 				return time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2021, 1, 2, 0, 0, 0, 0, time.UTC), nil
@@ -72,7 +72,7 @@ func Test_UpdateCSV(t *testing.T) {
 	})
 	})
 
 
 	t.Run("merge new data with previous data (with different CSV structure)", func(t *testing.T) {
 	t.Run("merge new data with previous data (with different CSV structure)", func(t *testing.T) {
-		storage := &storagev2.InMemoryFile{
+		storage := &filemanager.InMemoryFile{
 			Data: []byte(`Date,Namespace,CPUCoreUsageAverage,CPUCoreRequestAverage,CPUCost,RAMBytesUsageAverage,RAMBytesRequestAverage,RAMCost
 			Data: []byte(`Date,Namespace,CPUCoreUsageAverage,CPUCoreRequestAverage,CPUCost,RAMBytesUsageAverage,RAMBytesRequestAverage,RAMCost
 2021-01-01,test-namespace,0.1,0.2,0.3,0.4,0.5,0.6
 2021-01-01,test-namespace,0.1,0.2,0.3,0.4,0.5,0.6
 `),
 `),
@@ -112,7 +112,7 @@ func Test_UpdateCSV(t *testing.T) {
 		data := `Date,Name,CPUCoreUsageAverage,CPUCoreRequestAverage,CPUCost,RAMBytesUsageAverage,RAMBytesRequestAverage,RAMCost
 		data := `Date,Name,CPUCoreUsageAverage,CPUCoreRequestAverage,CPUCost,RAMBytesUsageAverage,RAMBytesRequestAverage,RAMCost
 2021-01-01,test,0.1,0.2,0.3,0.4,0.5,0.6
 2021-01-01,test,0.1,0.2,0.3,0.4,0.5,0.6
 `
 `
-		storage := &storagev2.InMemoryFile{
+		storage := &filemanager.InMemoryFile{
 			Data: []byte(data),
 			Data: []byte(data),
 		}
 		}
 		model := &AllocationModelMock{
 		model := &AllocationModelMock{
@@ -137,7 +137,7 @@ func Test_UpdateCSV(t *testing.T) {
 				return time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2021, 1, 3, 0, 0, 0, 0, time.UTC), nil
 				return time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2021, 1, 3, 0, 0, 0, 0, time.UTC), nil
 			},
 			},
 		}
 		}
-		storage := &storagev2.InMemoryFile{}
+		storage := &filemanager.InMemoryFile{}
 		err := UpdateCSV(context.TODO(), storage, model)
 		err := UpdateCSV(context.TODO(), storage, model)
 		require.Equal(t, err, errNoData)
 		require.Equal(t, err, errNoData)
 	})
 	})

+ 12 - 8
pkg/storagev2/file.go → pkg/filemanager/filemanager.go

@@ -1,11 +1,10 @@
-package storagev2
+package filemanager
 
 
 import (
 import (
 	"context"
 	"context"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
-	"io/fs"
 	"net/url"
 	"net/url"
 	"os"
 	"os"
 	"strings"
 	"strings"
@@ -82,8 +81,6 @@ type S3File struct {
 	key      string
 	key      string
 }
 }
 
 
-// NewS3File creates a new S3File from a path.
-// Example of path: s3://bucket-name/path/to/file.csv
 func NewS3File(path string) (*S3File, error) {
 func NewS3File(path string) (*S3File, error) {
 	u, err := url.Parse(path)
 	u, err := url.Parse(path)
 	if err != nil {
 	if err != nil {
@@ -185,9 +182,9 @@ func (g *GCSStorageFile) Upload(ctx context.Context, f *os.File) error {
 
 
 func NewSystemFile(path string) (*SystemFile, error) {
 func NewSystemFile(path string) (*SystemFile, error) {
 	// validate path
 	// validate path
-	if !fs.ValidPath(path) {
-		return nil, fmt.Errorf("invalid path: %s", path)
-	}
+	//if !fs.ValidPath(path) {
+	//	return nil, fmt.Errorf("invalid path: %s", path)
+	//}
 	return &SystemFile{path: path}, nil
 	return &SystemFile{path: path}, nil
 }
 }
 
 
@@ -209,7 +206,14 @@ func (s *SystemFile) Download(ctx context.Context, f *os.File) error {
 }
 }
 
 
 func (s *SystemFile) Upload(ctx context.Context, f *os.File) error {
 func (s *SystemFile) Upload(ctx context.Context, f *os.File) error {
-	tmpF, err := os.CreateTemp("opencost", "upload-*")
+	_, err := f.Seek(0, io.SeekStart)
+	if err != nil {
+		return err
+	}
+	tmpF, err := os.CreateTemp("", "opencost-upload-*")
+	if err != nil {
+		return err
+	}
 	defer os.Remove(tmpF.Name())
 	defer os.Remove(tmpF.Name())
 	defer tmpF.Close()
 	defer tmpF.Close()
 	_, err = io.Copy(tmpF, f)
 	_, err = io.Copy(tmpF, f)

+ 42 - 0
pkg/filemanager/filemanager_test.go

@@ -0,0 +1,42 @@
+package filemanager
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"math/rand"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func Test_NewFileManager(t *testing.T) {
+	t.Run("file system", func(t *testing.T) {
+		tmpPath := filepath.Join(os.TempDir(), fmt.Sprintf("opencost-test-file-manager-%d", rand.Int31()))
+		fm, err := NewFileManager(tmpPath)
+		require.NoError(t, err)
+
+		downloadFile, err := os.CreateTemp("", "opencost-test-file-manager-*")
+		require.NoError(t, err)
+		err = fm.Download(context.TODO(), downloadFile)
+		require.ErrorIs(t, err, ErrNotFound)
+
+		uploadFile, err := os.CreateTemp("", "opencost-test-file-manager-*")
+		require.NoError(t, err)
+		_, err = uploadFile.WriteString("test-content")
+		require.NoError(t, err)
+		require.NoError(t, err)
+		err = fm.Upload(context.TODO(), uploadFile)
+		require.NoError(t, err)
+
+		err = fm.Download(context.TODO(), downloadFile)
+		require.NoError(t, err)
+		_, err = downloadFile.Seek(0, io.SeekStart)
+		require.NoError(t, err)
+		data, err := io.ReadAll(downloadFile)
+		require.NoError(t, err)
+		require.Equal(t, "test-content", string(data))
+	})
+}