Get active tech feature
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			This commit is contained in:
		
							parent
							
								
									5b0a46951b
								
							
						
					
					
						commit
						37a5297c88
					
				
					 4 changed files with 103 additions and 0 deletions
				
			
		| 
						 | 
					@ -2,10 +2,13 @@ package containers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"regexp"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
| 
						 | 
					@ -135,3 +138,33 @@ func CPUMemoryStats(applist *[]apps.App, sample int) (*[]apps.App, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &updatedApps, nil
 | 
						return &updatedApps, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getTechAndVersion(symlink string) (*TechInfo, error) {
 | 
				
			||||||
 | 
						link, err := os.Readlink(symlink)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("error reading symlink: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						absLink, err := filepath.Abs(link)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("error getting absolute path: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dirName := filepath.Base(absLink)
 | 
				
			||||||
 | 
						parts := strings.Split(dirName, "-")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(parts) < 2 {
 | 
				
			||||||
 | 
							return nil, errors.New("failed to parse language and version from symlink")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						re := regexp.MustCompile(`\d+\.\d+\.\d+`)
 | 
				
			||||||
 | 
						version := re.FindString(parts[1])
 | 
				
			||||||
 | 
						if version == "" {
 | 
				
			||||||
 | 
							return nil, errors.New("failed to extract version from symlink")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &TechInfo{
 | 
				
			||||||
 | 
							Tech:    parts[0],
 | 
				
			||||||
 | 
							Version: version,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,12 @@ const passwordFile = "/srv/.rosti"
 | 
				
			||||||
const deployKeyType = "ed25519"
 | 
					const deployKeyType = "ed25519"
 | 
				
			||||||
const deployKeyPrefix = "rosti_deploy"
 | 
					const deployKeyPrefix = "rosti_deploy"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Structure containing info about technology and its version
 | 
				
			||||||
 | 
					type TechInfo struct {
 | 
				
			||||||
 | 
						Tech    string `json:"tech"`
 | 
				
			||||||
 | 
						Version string `json:"version"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Process contains info about background application usually running in supervisor
 | 
					// Process contains info about background application usually running in supervisor
 | 
				
			||||||
type Process struct {
 | 
					type Process struct {
 | 
				
			||||||
	Name  string `json:"name"`
 | 
						Name  string `json:"name"`
 | 
				
			||||||
| 
						 | 
					@ -558,3 +564,13 @@ func (c *Container) GetTechs() (apps.AppTechs, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return techs, nil
 | 
						return techs, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns info about active technology
 | 
				
			||||||
 | 
					func (c *Container) GetActiveTech() (*TechInfo, error) {
 | 
				
			||||||
 | 
						info, err := getTechAndVersion(path.Join(c.volumeHostPath(), "bin", "primary_tech"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return info, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return info, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										39
									
								
								containers/types_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								containers/types_test.go
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					package containers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetTechAndVersion(t *testing.T) {
 | 
				
			||||||
 | 
						// Create a temporary directory for testing
 | 
				
			||||||
 | 
						tempDir := t.TempDir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a fake language directory with version in the temporary directory
 | 
				
			||||||
 | 
						fakeLangDir := filepath.Join(tempDir, "techs", "python-3.10.4")
 | 
				
			||||||
 | 
						err := os.MkdirAll(fakeLangDir, 0755)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Failed to create fake language directory: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a symlink for testing
 | 
				
			||||||
 | 
						symlink := filepath.Join(tempDir, "primary_tech")
 | 
				
			||||||
 | 
						err = os.Symlink(fakeLangDir, symlink)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Failed to create symlink: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Test parseLanguageAndVersion function
 | 
				
			||||||
 | 
						info, err := getTechAndVersion(symlink)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedLanguage := "python"
 | 
				
			||||||
 | 
						expectedVersion := "3.10.4"
 | 
				
			||||||
 | 
						if info.Tech != expectedLanguage || info.Version != expectedVersion {
 | 
				
			||||||
 | 
							t.Errorf("Expected language: %s, version: %s, but got language: %s, version: %s",
 | 
				
			||||||
 | 
								expectedLanguage, expectedVersion, info.Tech, info.Version)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								glue/main.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								glue/main.go
									
									
									
									
									
								
							| 
						 | 
					@ -789,3 +789,18 @@ func (p *Processor) DeleteAppSnapshots() error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns active technology in the app
 | 
				
			||||||
 | 
					func (p *Processor) GetActiveTech() (*containers.TechInfo, error) {
 | 
				
			||||||
 | 
						container, err := p.getContainer()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tech, err := container.GetActiveTech()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return tech, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return tech, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue